自定义指令

1.全局注册指令

Vue.directive("highlight", {

​	bind(el, binding, vNode, oldNode) {

​		// el:v-highlight绑定的当前p元素

​		// binding:绑定的数据内容

​		// vNode:虚拟dom节点

​		// oldNode:虚拟dom节点,原来的dom, tag: ''

})

1-v-xxx可以进行自定义指令的调用

<p v-highlight:background.delayed.blink="{mainColor:'pink',secondColor:'skyblue', delay:500}">自定义指令的调用,全句指令</p>

2-可以在 v-xxx="'value'" 进行值的设置

        v-highlight="'red'"时,binding里多了一个 value:"red"

3-利用 : 进行自定义指令参数的传递

        v-highlight:backgroundt="'red'", binding里多了一个 arg: "background"

4-利用 .xxx 进行修饰符的设置

        v-highlight:background.delayed, binding 里的 modifiers 对象则多了 {delayed: true}

2.局部指令注册:directives是复数

new Vue({

​	el: '#app',

​	directives: {

​			"local-highlight": {

​				bind(el, binding, vNode, oldNode) {}

}
<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8" />
    <title>01.custom-directive</title>
    <script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.12/vue.js"></script>
</head>

<body>
    <div id="app">
        <!-- 指令里面的需要用''引起来,不然会在响应式数据里找 -->
        <p v-text="'我是文本'"></p>
        <b v-text="'我是文本'"></b>

        <!-- 自定义指令封装 -->
        <!-- "'red'" 里面需要加引号 -->
        <!--
                1. v-xxx可以进行自定义指令的调用
                2.可以在 v-xxx="'value'" 进行值的设置,v-highlight="'red'"时,binding里多了一个 value:"red"
                也可以设置成对象数据 {mainColor:'pink',secondColor:'blue', delay:500} | value:{mainColor: 'pink', secondColor: 'blue', delay: 500}
                3.可以利用 : 进行自定义指令参数的传递  v-xxx:background="'value'" , binding里多了一个 arg: "background"
                4.可以利用 .xxx 进行修饰符的设置 .加了修饰符.delayed ,binding 里的 modifiers 对象则多了 {delayed: true} ,原来是{}空对象
        -->
        <p v-highlight:background.delayed.blink="{mainColor:'pink',secondColor:'skyblue', delay:500}">自定义指令的调用,全句指令</p>


        <!-- 自定义指令的调用,本地指令 -->
        <p v-local-highlight:background.delayed.blink="{mainColor:'pink',secondColor:'skyblue', delay:500}">自定义指令的调用,本地指令</p>

    </div>
    <script type="text/javascript">
        // TODO:全局注册自定义指令
        // 利用Vue.directive进行自定义指令的创建,现在是全局指令的注册
        Vue.directive("highlight", {
            bind(el, binding, vNode, oldNode) {
                // el:v-highlight绑定的当前p元素 <p>自定义指令的调用</p>
                // binding:绑定的数据内容
                // vNode:虚拟dom节点,
                // oldNode:虚拟dom节点,原来的dom, tag: ''

                // 很少操作 vNode和oldNode
                // console.log(el, binding,vNode,oldNode)

                console.log(binding)

                // 加了修饰符.delayed,则 binking里的 modifiers: {delayed: true}
                var delay = 0;
                if (binding.modifiers.delayed) {
                    delay = 2000
                }

                // 如果修饰符有 blink 则 进入if这个代码块,2秒后进行霓虹灯颜色跳转
                // 否则进入 else 代码块,2秒后进行背景颜色显示
                if (binding.modifiers.blink) {
                    let mainColor = binding.value.mainColor       // pink
                    let secondColor = binding.value.secondColor   // skyblue
                    let currentColor = binding.value.mainColor
                    setTimeout(() => {
                        setInterval(() => {
                            // 进行颜色判断
                            // 判断当前颜色是否等于secondColor,如果等于则让他变为mainColor,如果不是则让他变为 secondColor,进行颜色变换
                            currentColor === secondColor ? (currentColor = mainColor) : (currentColor = secondColor)

                            // 增加背景判断
                            if (binding.arg === "background") {
                                el.style.backgroundColor = currentColor
                            } else {
                                el.style.color = currentColor
                            }

                        }, binding.value.delay)
                        // setTimeout的delay是上面设置的2000 , setInterval 是 v-highlight 设置的 delay
                    }, delay)


                } else {
                    setTimeout(() => {
                        // 如果 v-highlight 没有加 :background,则是字体颜色的设置
                        // 加了则是背景颜色
                        if (binding.arg === 'background') {
                            el.style.backgroundColor = binding.value.mainColor
                        } else {
                            el.style.color = binding.value.mainColor
                        }
                    }, delay)
                }
            }
        })
        new Vue({
            el: '#app',
            // 全局:Vue.directive("highlight",{ bind(el, binding, vNode, oldNode) {} })
            // 局部指令注册,directives是复数,全局是Vue.directive
            directives: {
                "local-highlight": {
                    bind(el, binding, vNode, oldNode) {
                        // el:v-highlight绑定的当前p元素 <p>自定义指令的调用</p>
                        // binding:绑定的数据内容
                        // vNode:虚拟dom节点,
                        // oldNode:虚拟dom节点,原来的dom, tag: ''

                        // 很少操作 vNode和oldNode
                        // console.log(el, binding,vNode,oldNode)

                        console.log(binding)

                        // 加了修饰符.delayed,则 binking里的 modifiers: {delayed: true}
                        var delay = 0;
                        if (binding.modifiers.delayed) {
                            delay = 2000
                        }

                        // 如果修饰符有 blink 则 进入if这个代码块,2秒后进行霓虹灯颜色跳转
                        // 否则进入 else 代码块,2秒后进行背景颜色显示
                        if (binding.modifiers.blink) {
                            let mainColor = binding.value.mainColor       // pink
                            let secondColor = binding.value.secondColor   // skyblue
                            let currentColor = binding.value.mainColor
                            setTimeout(() => {
                                setInterval(() => {
                                    // 进行颜色判断
                                    // 判断当前颜色是否等于secondColor,如果等于则让他变为mainColor,如果不是则让他变为 secondColor,进行颜色变换
                                    currentColor === secondColor ? (currentColor = mainColor) : (currentColor = secondColor)

                                    // 增加背景判断
                                    if (binding.arg === "background") {
                                        el.style.backgroundColor = currentColor
                                    } else {
                                        el.style.color = currentColor
                                    }

                                }, binding.value.delay)
                                // setTimeout的delay是上面设置的2000 , setInterval 是 v-highlight 设置的 delay
                            }, delay)


                        } else {
                            setTimeout(() => {
                                // 如果 v-highlight 没有加 :background,则是字体颜色的设置
                                // 加了则是背景颜色
                                if (binding.arg === 'background') {
                                    el.style.backgroundColor = binding.value.mainColor
                                } else {
                                    el.style.color = binding.value.mainColor
                                }
                            }, delay)
                        }




                    }
                }
            }
        });
    </script>
</body>

</html>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值