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-开头,添加到需要的元素中;自定义元素指令则是直接像其他元素一样使用即可。
原文地址:https://www.cnblogs.com/yuyujuan/p/9786303.html