zoukankan      html  css  js  c++  java
  • vue之自定义组件

    除了核心功能默认内置的指令外,vue也允许用户注册自定义指令。虽然在vue2.0中,代码复用和抽象的主要形式是组件,但是有些情况下,我们仍需要对普通DOM元素进行底层操作,这个时候就需要用到自定义指令,例如,我们希望将元素的背景色变为红色,就可以通过指令实现。

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>vue</title>
        <style></style>
        <script src="vue.js"></script>
    </head>
    <body>
        <div id="box">
            <p v-red>aaaaa</p>
            <p v-red>12345</p>
            <p v-red>自定义</p>
        </div>
        <script>
            Vue.directive('red',function(){
                this.el.style.background='red';
            });
            var vm=new Vue({
                el:'#box',
                data:{
                    msg:'welcome'
                }
            });
        </script>
    </body>
    </html>

    上面简单的实例中,主要是展示了自定义组件的用法:

    其中"red"为我们自定义的指令,在使用的时候,需要加上"v-"的前缀,后面接的方法是该指令需要实现的功能;"el"是指令所绑定的元素,可以用来直接操作DOM。

    自定义指令传参

    在上面的自定义指令中,我们实现了将元素背景色变为红色,那么如果我们需要将背景色改为蓝色,只是颜色改变了,其他的都是一样的,若这样再重新定义一个指令,就完全没必要了,因此我们可以考虑传参的方法了。

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>vue</title>
        <style></style>
        <script src="vue.js"></script>
    </head>
    <body>
        <div id="box">
            <p v-red='r'>aaaaa</p>
            <p v-red='g'>12345</p>
            <p v-red='p'>自定义</p>
        </div>
        <script>
            Vue.directive('red',function(color){
                this.el.style.background=color;
            });
            var vm=new Vue({
                el:'#box',
                data:{
                    r:'red',
                    g:'gray',
                    p:'pink'
                }
            });
        </script>
    </body>
    </html>

    但是上面的这种的方式的要求是我们必须现在vue实例中声明这些颜色参数,并不能满足我们想要随意更换颜色的要求,因此,需要继续优化。

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>vue</title>
        <style></style>
        <script src="vue.js"></script>
    </head>
    <body>
        <div id="box">
            <p v-red="'red'">aaaaa</p>
            <p v-red="'gray'">12345</p>
            <p v-red="'pink'">自定义</p>
        </div>
        <script>
            Vue.directive('red',function(color){
                this.el.style.background=color;
            });
            var vm=new Vue({
                el:'#box',
            });
        </script>
    </body>
    </html>

    自定义指令获取事件属性

     和其他JavaScript事件一样,自定义指令事件也能获取事件属性,例如键盘事件,鼠标事件等,下面通过获取鼠标位置实现自定义拖拽指令。

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>vue</title>
        <style>
        </style>
        <script src="vue.js"></script>
        
    </head>
    <body>
        <div id="box">
            <div v-drag :style="{'100px', height:'100px', background:'blue', position:'absolute', right:0, top:0}"></div>
            <div v-drag :style="{'100px', height:'100px', background:'red', position:'absolute', left:0, top:0}"></div>
        </div>
        <script>
            Vue.directive('drag',function(){
                var oDiv=this.el;
                oDiv.onmousedown=function(ev){
                    var disX=ev.clientX-oDiv.offsetLeft;
                    var disY=ev.clientY-oDiv.offsetTop;
    
                    document.onmousemove=function(ev){
                        var l=ev.clientX-disX;
                        var t=ev.clientY-disY;
                        oDiv.style.left=l+'px';
                        oDiv.style.top=t+'px';
                    };
                    document.onmouseup=function(){
                        document.onmousemove=null;
                        document.onmouseup=null;
                    };
                };
            });
            var vm=new Vue({
                el:'#box',
                data:{
                    msg:'welcome'
                }
            });
        </script>
    </body>
    </html>

    拖拽前:

    拖拽后:

    自定义元素指令

    所谓自定义元素指令,就是指该指令能够像其他的元素如div,span等一样直接使用,既然是元素指令,自然就和其他的自定义指令不一样了,下面通过一个简单的例子来展示自定义元素指令的用法,依旧是改变元素的背景色,具体实现如下:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>vue</title>
        <style>
        </style>
        <script src="vue.js"></script>
        
    </head>
    <body>
        <div id="box">
           <zns-red>自定义元素指令</zns-red>
        </div>
        <script>
            Vue.elementDirective('zns-red',{
                bind:function(){
                    this.el.style.background='red';
                }
            });
    
            var vm=new Vue({
                el:'#box',
                data:{
                    a:'blue'
                }
            });
        </script>
    </body>
    </html>

    自定义指令和自定义元素指令相比,主要存在三个不同之处:

    • 自定义指令使用elementDirective
    • 自定义指令的功能函数直接写在后面的方法中,自定义元素指令的功能函数必须写在钩子函数中(bind、inserted等)
    • 自定义指令在使用时,需要用v-开头,添加到需要的元素中;自定义元素指令则是直接像其他元素一样使用即可。
  • 相关阅读:
    A
    B
    A
    A
    B
    C
    有趣的平方和的推导
    一篇写的非常好的匈牙利算法文章
    2014 UESTC Training for Data Structures G
    2014 UESTC Training for Data Structures H
  • 原文地址:https://www.cnblogs.com/yuyujuan/p/9786303.html
Copyright © 2011-2022 走看看