vue 自定义指令( 全局自定义指令 | 局部自定义指令 )

文章目录

在 Vue.js 中,自定义指令允许你注册一些带有钩子函数的指令,这些钩子函数会在特定的生命周期阶段被调用。

钩子函数参数:

el:指令绑定的元素。

binding:一个包含指令值、参数、修饰符等的对象。包含以下属性 name:指令名称,不包含v-前缀 .value 指令的绑定值 例如在 v-my-directive="1 + 1" 中,值是 2。

vnode:Vue 虚拟 DOM 节点。

oldVnode:之前的渲染中代表指令所绑定元素的 VNode。仅beforeUpdate 和 updated 钩子中可用。

复制代码
 调用时机:指令绑定到元素时调用,只调用一次。
 bind(el, binding, vnode, oldVnode)

 调用时机:被绑定元素插入父节点时调用(父节点存在即可调用,不必存在于 document 中)。
 inserted(el, binding, vnode, oldVnode)

  调用时机:所在组件的 VNode 更新时调用,但是可能发生在其子 VNode 更新之前。指令的值可能发生了改变,也可能没有。但是你可以通过比较 binding.oldValue 和 binding.value 来确定是否变化。
  update(el, binding, vnode, oldVnode)

  调用时机:指令所在组件的 VNode 及其子 VNode 全部更新后调用。
  componentUpdated(el, binding, vnode, oldVnode)

  调用时机:只调用一次,指令与元素解绑时调用。
  unbind(el, binding, vnode, oldVnode)

全局自定义指令

通过Vue.directive(id, [definition])方式注册全局指令,然后在入口文件中进行Vue.use()调用。也可以批量注册指令,新建一个directives/index.js文件,并在其中导入和注册多个指令。

html 复制代码
    <div id="app">
        <input type="text" v-focus/>
        <input type="text" v-color="msg" />

    </div>
		//注册一个全局的自定义指令 v_focus
        //focus是自定义的指令
        Vue.directive('focus', {
            //inserted 是钩子函数 表示当被绑定的元素插入到DOM中时
            inserted: function(el) {
                //el是指令绑定的元素
                el.focus()
            }
        })


        //自定义指令带参数
        Vue.directive('color', {
            bind: function(el, binding) {
                el.style.backgroundColor = binding.value
            }
        })
        var vm = new Vue({
            el: '#app',
            data: {
                msg: 'red'
            },
                    })

局部注册自定义指令

通过组件的directives选项进行局部注册,该指令只在本组件中可用。

html 复制代码
 var vm = new Vue({
            el: '#app',
            data: {
                msg: 'red'
            },
            //局部指令 只能在当前组件使用
            derectives: {
                color: {
                    bind: function(el, binding) {
                        el.style.backgroundColor = binding.value
                    }
                },
                focus: {
                    inserted: function(el) {
                        //el是指令绑定的元素
                        el.focus()
                    }
                }

            }
        })
相关推荐
腾讯TNTWeb前端团队3 小时前
helux v5 发布了,像pinia一样优雅地管理你的react状态吧
前端·javascript·react.js
范文杰6 小时前
AI 时代如何更高效开发前端组件?21st.dev 给了一种答案
前端·ai编程
拉不动的猪6 小时前
刷刷题50(常见的js数据通信与渲染问题)
前端·javascript·面试
拉不动的猪7 小时前
JS多线程Webworks中的几种实战场景演示
前端·javascript·面试
FreeCultureBoy7 小时前
macOS 命令行 原生挂载 webdav 方法
前端
uhakadotcom8 小时前
Astro 框架:快速构建内容驱动型网站的利器
前端·javascript·面试
uhakadotcom8 小时前
了解Nest.js和Next.js:如何选择合适的框架
前端·javascript·面试
uhakadotcom8 小时前
React与Next.js:基础知识及应用场景
前端·面试·github
uhakadotcom8 小时前
Remix 框架:性能与易用性的完美结合
前端·javascript·面试
uhakadotcom8 小时前
Node.js 包管理器:npm vs pnpm
前端·javascript·面试