一、定义语法

1、局部

// 简单,只需要指令语法绑定元素和指令语法所在模块加载时使用
nev Vue({
   ...,
   directives:{
       // element指令绑定的dom,binding获取value   
       指令名(element, binding){
    },    
    },  
}
// 详细,指令绑定元素、元素加载到页面、指令所在页面加载
new Vue({
   ...,
   directives:{
     指令名:{
     //指令与元素绑定 
     bind(element,binding){},
     //元素加载页面 
     instered(element,binding){},
     //指令所在模块重新解析
     update(element,binding){}   
},     
    }  
})

2、全局

//简单
Vue.directive('指令名',function(element, binding){})
//复杂
Vue.directive('指令名',{
    bind(element, binding){},
    instered(element, binding){},
    update(element, binding){}    
})

二、指令名

指令名格式: v-xx-xx

定义指令: xx-xx,注意如果中间有-,用'xx-xx',本身就是键值对

简单

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>自定义指令-简单</title>
    <script type="text/javascript" src="../js/vue.js"></script>

</head>
<body>
    <!-- 定义v-big指令,与v-text类似,把值放大10倍 -->
    <div id="container">
        v-text值: <span v-text="num"></span> <br><br>
        v-big 值: <span v-big="num"></span> <br><br>
        <button @click="num++">点击</button>
    </div>  

    
    <script type="text/javascript">
        //全局
        Vue.directive('big', function(element, binding){
            element.innerText=binding.value * 10
        })
        new Vue({
            el:'#container',
            data:{
                num:1,
            },
            // directives:{
            //     // 局部 element 当前标签的dom结构, binding提供值等
            //     big(element, binding){
            //         element.innerText=binding.value * 10
            //     }
            // },
        })
    </script>  
</body>
</html>

复杂

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>自定义指令-复杂</title>
    <script type="text/javascript" src="../js/vue.js"></script>

</head>
<body>
    <!-- 定义v-fbind指令,与v-bindt类似,所绑定的input元素默认获取焦点 -->
    <div id="container">
        数据的值:<input type="text" v-fbind:value="num"> <br>
        <button @click="num++">点击</button>
    </div>  

    
    <script type="text/javascript">
        //全局
        Vue.directive('fbind',{
            // 指令与元素刚绑定
            bind(element, binding){
                element.value = binding.value
            },
            // 指令绑定的元素加载到页面
            inserted(element, binding){
                //焦点
                element.focus()
            },
            // 指令所在的模版重新解析
            update(element, binding){
                element.value = binding.value
            }
        })

        new Vue({
            el:'#container',
            data:{
                num:1,
            },
            // directives:{
            //     // 局部 三个函数 bind inserted update
            //     fbind:{
            //         //指令与元素绑定时
            //         bind(element, binding){
            //             element.value = binding.value
            //         },
            //         //指令所在的元素被插入页面时
            //         inserted(element, binding){
            //             element.focus()
            //         },
            //         // 指令所在模版重新解析时
            //         update(element, binding){
            //             element.value = binding.value
            //         }
            //     }
            // },
        })
    </script>  
</body>
</html>