vue中的自定义指令就是把原生的dom一些操作进行封装。

1.函数形式

需求:我们定义一个v-mult指令,和v-text类似,但是会将绑定的值翻倍。

在vue中,用directives自定义函数,比如下面这样:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>vue测试</title>
    <script src="https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.js"></script>
 
</head>

<body>
    
    <div id="root">
         <div>当前的n值是:<span v-text="n"></span></div>
         <div>翻倍后的n值是:<span v-mult="n"></span></div>
         <button @click="n++">点我n+1</button>
    </div>
    <script type="text/javascript">
         new Vue({
            el: '#root',
            data:{
                n:1,
            },
            // 自定义指令
            directives:{
                //函数形式
                mult(element,binding){
                    console.log(element,binding)  
                    //element 是真实的dom元素,bingding是绑定对象
                    element.innerText = binding.value *2
                }
            }
        })
    </script>
</body>

</html>

这个地方需要说明的是,打印的element和bingding

element是原生的dom元素,而bingding是绑定对象。bingding中比较重要的就是expressionvalue

上面代码中的

element.innerText = binding.value *2

的含义是把绑定的值乘以2,然后赋值给当前绑定的dom元素的值。

程序运行后如下:

当指令所在模板被重新解析时,所绑定的自定义指令就会被调用。

2.对象式

需求:定义一个v-fbind指令,和v-bind功能类似,但是可以让其所绑定的input元素默认获取焦点。

参考代码:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>vue测试</title>
    <script src="https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.js"></script>
 
</head>

<body>
    
    <div id="root">
         <div>当前的n值是:<span v-text="n"></span></div>
         <div>翻倍后的n值是:<span v-mult="n"></span></div>
         <button @click="n++">点我n+1</button>


         <input type="text" v-fbind:value="n">
    </div>
    <script type="text/javascript">
         new Vue({
            el: '#root',
            data:{
                n:1,
            },
            // 自定义指令
            directives:{
                //函数形式
                mult(element,binding){
                    // console.log("element=",element)
                    // console.log("bingding=",binding)  
                    //element 是真实的dom元素,bingding是绑定对象
                    element.innerText = binding.value *2
                   //什么是时候会被调用,指令所在的模板被重新解析时
                },
                //对象形式
                fbind:{
                    //当指令与元素成功绑定时,执行。
                    bind(element,binding){
                        element.value= binding.value
                    },
                    //指令所在元素被插入元素时,调用
                    inserted(element,binding){
                        console.log("inserted执行")
                        element.focus()
                    },
                    //指令所在的模板被重新解析时,调用
                    update(element,binding){
                        console.log("update执行")
                        element.value= binding.value
                        //element.focus()   //更新时,也获取焦点
                    },
                }
            }
        })
    </script>
</body>

</html>

效果图:

对象这种写法里面有三个固定函数,bind、inserted、update函数。

bind函数表示当指令与元素成功绑定时执行。

inserted函数表示指令所在元素被插入元素时,调用。

update函数指令所在的模板被重新解析时,调用。