Vue2-自定义指令
一、概念
自定义指令是自定义一些对底层DOM进行的操作
二、Vue中的内置指令
- v-text: 更新元素的textContent
- v-html: 更新元素的innerHTML
- v-show:切换元素的display属性
- v-if: 根据条件渲染元素
- v-else:同上。必须搭配 v-if 或 v-else-if 使用
- v-else-if: 同上。前一兄弟元素必须有 v-if 或 v-else-if。
- v-for: 基于源数据多次渲染元素或模板快
- v-on: 绑定事件监听器
- v-bind: 动态地绑定一个或多个attribute,或一个组件 prop 到表达式
- v-model:在表单控件或者组件上创建双向绑定
- v-slot: 提供具名插槽或需要接收prop的插槽
- v-pre: 跳过这个元素和它的子元素的编译过程
- v-cloak: 这个指令保持在元素上直到关联实例结束编译
- v-once: 之渲染元素和组件一次
三、指令的钩子函数
Vue官网解释

- bind:只调用一次,指令第一次绑定到元素时调用。在这里可以进行一次性的初始化设置。
- inserted:被绑定元素插入父节点时调用 (仅保证父节点存在,但不一定已被插入文档中)。
- update:所在组件的 VNode 更新时调用,但是可能发生在其子 VNode 更新之前。指令的值可能发生了改变,也可能没有。但是你可以通过比较更新前后的值来忽略不必要的模板更新 。
- componentUpdated:指令所在组件的 VNode 及其子 VNode 全部更新后调用。
- unbind:只调用一次,指令与元素解绑时调用。
注意:
- 除 update 与 componentYpdated 外,每个钩子函数都含有 el、binding、vnode 这三个参数。
- 在每个函数中,第一个参数永远是el,表示被绑定了指令的那个DOM元素,这个el参数,是一个原生的JS对象,所以Vue自定义指令可以用来直接和DOm打交道。
- binding是一个对象,它包含以下属性:name、value、oldValue、expression、arg、modifiers
- oldValue只有在update与componentUpdated钩子中生效
- 除了el之外,binding、vnode属性都只是只读。
三、全局指令
在Vue项目中新建一个directives的文件夹,用来存储这个指令文件。
自定义复制指令
- 在directives目录下新建copy.js,代码如下:
1 const copy = { 2 bind (el, {value}) { 3 el.$value = value 4 el.handler = () => { 5 if (!el.$value) { 6 // 值为空 7 console.log('无复制内容') 8 return 9 } 10 // 动态 创建textarea标签 11 const textarea = document.createElement('textarea') 12 // 为textarea设置readonly属性,防止唤起键盘 13 textarea.readOnly = 'readonly' 14 textarea.style.position = 'absolute' 15 textarea.style.left = '-9999px' 16 // 将要copy的值赋给textarea 17 textarea.value = el.$value 18 // 将textarea插入到body中 19 document.body.appendChild(textarea) 20 // 选中值 ,并复制 21 textarea.select() 22 const result = document.execCommand('Copy') 23 if (result) { 24 console.log('复制成功') 25 } 26 document.body.removeChild(textarea) 27 }, 28 el.addEventListener('click', el.handler) 29 }, 30 // 当传进来的值更新时触发 31 componentUpdated (el, {value}) { 32 el.$value = value 33 }, 34 // 指令与元素解绑时,移除事件绑定 35 unbind (el) { 36 el.removeEventListener('click', el.handler) 37 } 38 } 39 40 export default copy
- 在directives目录下,新建index.js,导出所有指令,代码如下:
1 // 引入指令 2 import copy from './copy.js' 3 4 5 // 自定义指令 6 const directives = { 7 copy 8 } 9 10 11 export default { 12 install (Vue) { 13 Object.keys(directives).forEach(key => { 14 Vue.directive(key, directives[key]) 15 }) 16 } 17 }
- 在main.js中全局注册,部分代码如下:
1 import Vue from 'vue' 2 3 import Directives from './directives/index' 4 5 Vue.use(Directives)
- 在项目中引用:在Vue文件中,将v-copy绑定在元素属性中:

- 点击“暂未备案”,则复制了【暂未备案】文字。
四、局部指令
自定义复制指令
- 第一步骤同全局指令
- 在页面中引入对应的指令文件
1 import copy from '../directives/copy'
- 在Vue实例中引用
1 export default { 2 directives: { 3 copy 4 } 5 }
- 在DOM元素绑定指令
本文来自博客园,作者:wuyve,转载请注明原文链接:https://www.cnblogs.com/wuyve/p/15184401.html

浙公网安备 33010602011771号