Vue自定义指令
将一个自定义指令全局注册到应用层级也是一种常见的做法:
1 | const app = createApp({}) |
一个指令的定义对象可以提供几种钩子函数 (都是可选的):
1 | // vue2.x |
el:指令绑定到的元素。这可以用于直接操作 DOM。binding:一个对象,包含以下属性。value:传递给指令的值。例如在v-my-directive="1 + 1"中,值是2。oldValue:之前的值,仅在beforeUpdate和updated中可用。无论值是否更改,它都可用。arg:传递给指令的参数 (如果有的话)。例如在v-my-directive:foo中,参数是"foo"。modifiers:一个包含修饰符的对象 (如果有的话)。例如在v-my-directive.foo.bar中,修饰符对象是{ foo: true, bar: true }。instance:使用该指令的组件实例。dir:指令的定义对象。vnode:代表绑定元素的底层 VNode。prevNode:之前的渲染中代表指令所绑定元素的 VNode。仅在beforeUpdate和updated钩子中可用。
除了 el 外,其他参数都是只读的,不要更改它们。若你需要在不同的钩子间共享信息,推荐通过元素的 dataset attribute 实现。
简化形式
对于自定义指令来说,一个很常见的情况是仅仅需要在 mounted 和 updated 上实现相同的行为,除此之外并不需要其他钩子。这种情况下我们可以直接用一个函数来定义指令,如下所示:
1 | <div v-color="color"></div> |
1 | app.directive('color', (el, binding) => { |
例子:tab切换
1 | // tab.vue |
1 | // src/directives/tab.js |
1 | // src/directives/index.js |
1 | // main.js |
使用场景:
- 按钮权限 v-has
- 图片懒加载 v-lazy
- 防抖 V-debounce
- 拖拽指令 v-draggable mousemove. mouseup monsedown.dragenter、dragover、drop。
- Post title: Vue自定义指令
- Create time: 2022-01-21 16:35:00
- Post link: 2022/01/21/自定义指令/
- Copyright notice: All articles in this blog are licensed under BY-NC-SA unless stating additionally.
Comments