烟台网站建设费用,宽屏网站尺寸,教育网站建设计划书,营销型企业网站的策划方案Vue自定义指令详细介绍 1. 自定义指令1.1 局部1.2 全局 1. 自定义指令
在 Vue.js 中#xff0c;除了默认提供的核心指令#xff08;如 v-model、v-show、v-if 等#xff09;#xff0c;Vue.js 也允许注册自定义指令#xff0c;自定义指令给你提供了一种方法来扩展 Vue 的… Vue自定义指令详细介绍 1. 自定义指令1.1 局部1.2 全局 1. 自定义指令
在 Vue.js 中除了默认提供的核心指令如 v-model、v-show、v-if 等Vue.js 也允许注册自定义指令自定义指令给你提供了一种方法来扩展 Vue 的功能允许你直接在 DOM 元素上应用更底层的操作。
Vue除支持内置的v-model/v-show等指令还允许自定义指令 vue2中代码的复用和抽象的主要形式是组件但在有些情况下仍然需要对普通dom元素做底层操作这种情况下需要自定义指令根据自定义指令的作用范围可分为全局、局部两种
自定义指令藏匿于 Vue 实例/组件实例的 directives 选项下一个指令定义对象可以提供如下几个钩子函数均为可选
名称作用bind只调用一次指令第一次绑定到元素时调用。在这里可以进行一次性的初始化设置inserted被绑定元素插入父节点时调用 (仅保证父节点存在但不一定已被插入文档中)update所在组件的 VNode 更新时调用但是可能发生在其子 VNode 更新之前。指令的值可能发生了改变也可能没有。但是你可以通过比较更新前后的值来忽略不必要的模板更新 (详细的钩子函数参数见下)componentUpdated指令所在组件的 VNode 及其子 VNode 全部更新后调用unbind只调用一次指令与元素解绑时调用
指令钩子函数会被传入以下参数
el指令所绑定的元素可以用来直接操作 DOM。binding一个对象包含以下属性 name指令名不包括 v- 前缀。value指令的绑定值例如v-my-directive1 1value 的值是 2。oldValue指令绑定的前一个值仅在 update 和 componentUpdated 钩子中可用。无论值是否改变都可用。expression绑定值的字符串形式。例如 v-my-directive1 1 中expression 的值是 1 1。arg传给指令的参数。例如 v-my-directive:foo 中arg 的值是 foo。modifiers一个包含修饰符的对象。例如v-my-directive.foo.bar修饰符对象的值将为 { foo: true, bar: true }。 vnodeVue 编译生成的虚拟节点。oldVnode上一个虚拟节点仅在 update 和 componentUpdated 钩子中可用。
下面是一个自定义指令的基本例子我们创建一个指令 v-focus该指令的作用是页面加载完毕后元素将自动聚焦
// 注册一个全局自定义指令 v-focus
Vue.directive(focus, {// 当绑定元素插入到 DOM 中。inserted: function (el) {// 聚焦元素el.focus();}
});// 在组件中局部注册
new Vue({el: #app,directives: {focus: {// 指令的定义inserted: function (el) {el.focus();}}}
})使用方式如下
input v-focus自定义指令可以非常灵活地操作 DOM赋予你高度的自由度来实现复杂的操作和行为在实际应用时它们通常用于操作元素的聚焦focus、触摸touch、动画animation等行为。
1.1 局部
通过自定义标签设置文字颜色
div idapp!--red绑定到data里面的变量--p v-colorred我是自定义指令/p
/divvar vm new Vue({el: #app,data: {red:red},//自定义指令局部directives:{color: {inserted: function(el,binding) {console.log(el,binding);el.style.color binding.value;}}}
});1.2 全局
div idapp!--red绑定到data里面的变量--p v-colorred我是自定义指令/p
/div//自定义标签,全局
Vue.directive(color, {inserted: function(el,binding) {console.log(el,binding);el.style.color binding.value;}
})var vm new Vue({el: #app,data: {red:red}
});