Vue 自定义指令

 一、定义语法:

(1)局部指令:

  new Vue({directives:{指令名:配置对象}}) 或

       new Vue({directives:{指令名:回调函数}})

(2)全局指令:

  Vue.directive(指令名,配置对象) 或

   Vue.directive(指令名,回调函数)

二、配置对象中常用的3个回调:

(1)bind:指令与元素成功绑定时调用

(2)inserted:指令所在元素被插入页面时调用

(3)update:指令所在模板结构被重新解析时调用

三、备注

(1)指令定义时不加v- ,但使用时要加 v-

(2)指令名如果是多个单词,要使用kebab-case命名方式,不要用camelCase命名。

 

案例1定义一个v-big指令,和v-text功能类似,但会把绑定的数值放大10倍

<!DOCTYPE html>
<head>
    <meta charset="UTF-8"/>
    <script type="text/javascript" src="../js/vue.js"></script>
</head>
<body>
    <div id="root">
        <h2>当前的n值是:<span v-text="n"></span></h2>
        <h2>放大10倍后的n值是:<span v-big="n"></span></h2>
        <button @click="n++">点我n+1</button>
    </div>
</body>
<script type="text/javascript">
    Vue.config.productionTip = false;
    new Vue({
        el:"#root",
        data:{
            n:1
        },
        directives:{
            //big 函数何时会被调用? 
            //1、指令与元素成功绑定时;
            //2、指令所在的模板被重新解析时。
            big(element,binding){
                element.innerText = binding.value*10
            }
        }
    })
</script>
View Code

 

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

1、js操作页面元素基础:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style>
        .demo{
            background-color: antiquewhite;
        }
    </style>
</head>
<body>
    <button id="btn">点我创建一个输入框</button>
    <script type="text/javascript">
        const btn = document.getElementById('btn')
        btn.onclick=()=>{
            const input = document.createElement('input')
            // input.focus() //写在页面渲染元素前,不生效
            input.className = 'demo' //生效
            input.value = 99 //生效
            input.onclick = ()=>{ //生效
                alert(1)
            }
            document.body.appendChild(input)
            input.focus()
            input.parentElement.style.backgroundColor = "skyblue"//input放入页面之后才生效
        }
    </script>
</body>
</html>
View Code

 2、正式代码,注意 fbind 自定义指令定义的地方,三个生命周期函数

<!DOCTYPE html>
<head>
    <meta charset="UTF-8"/>
    <script type="text/javascript" src="../js/vue.js"></script>
</head>
<body>
    <div id="root">
        <h2>当前的n值是:<span v-text="n"></span></h2>
        <h2>放大10倍后的n值是:<span v-big="n"></span></h2>
        <button @click="n++">点我n+1</button>
        <input type="text" v-fbind-number:value="n">
    </div>
</body>
<script type="text/javascript">
    Vue.config.productionTip = false;
    new Vue({
        el:"#root",
        data:{
            n:1
        },
        directives:{
            //big 函数何时会被调用? 
            //1、指令与元素成功绑定时;
            //2、指令所在的模板被重新解析时。
            big(element,binding){
                element.innerText = binding.value*10
            },
            "fbind-number":{
                //指令与元素成功绑定时调用
                bind(element,binding){
                    element.value = binding.value*10;
                },
                //指令所在元素被插入页面时调用
                inserted(element,binding){
                    element.focus()
                },
                //指令所在的模板被重新解析时调用
                update(element,binding){
                    element.value = binding.value*10;
                    //element.focus()
                }
            }
        }
    })
</script>
View Code

3、效果,注意观察加载后的焦点

 全局指令写法:

  Vue.directive("bind",function(element,binding){
        element.innerText = binding.value*10
    })

    Vue.directive("fbind-number",{
                //指令与元素成功绑定时调用
                bind(element,binding){
                    element.value = binding.value*10;
                },
                //指令所在元素被插入页面时调用
                inserted(element,binding){
                    element.focus()
                },
                //指令所在的模板被重新解析时调用
                update(element,binding){
                    element.value = binding.value*10;
                    //element.focus()
                }
            })

 学习视频:https://www.bilibili.com/video/BV1Zy4y1K7SH?p=49&spm_id_from=pageDriver&vd_source=60a28e8364654bee938864b1d19905ec

45、46、47

posted @ 2023-02-15 22:23  codeing123  阅读(59)  评论(0编辑  收藏  举报