vue自定义指令

朱雀 2023-03-06 03:56 348阅读 0赞

示例:我们注册一个全局的v-focus指令

  1. <div id="app">
  2. <p>页面载入时,input 元素自动获取焦点:</p>
  3. <input v-focus>
  4. </div>
  5. <script>
  6. // 注册一个全局自定义指令 v-focus
  7. Vue.directive('focus', {
  8. // 当绑定元素插入到 DOM 中。
  9. inserted: function (el) {
  10. // 聚焦元素
  11. el.focus()
  12. }
  13. })
  14. // 创建根实例
  15. new Vue({
  16. el: '#app'
  17. })
  18. </script>

注册局部指令

  1. <div id="app">
  2. <p>页面载入时,input 元素自动获取焦点:</p>
  3. <input v-focus>
  4. </div>
  5. <script>
  6. // 创建根实例
  7. new Vue({
  8. el: '#app',
  9. directives: {
  10. // 注册一个局部的自定义指令 v-focus
  11. focus: {
  12. // 指令的定义
  13. inserted: function (el) {
  14. // 聚焦元素
  15. el.focus()
  16. }
  17. }
  18. }
  19. })
  20. </script>

指令定义函数提供了几个钩子函数(可选):

bind: 只调用一次,指令第一次绑定到元素时调用,用这个钩子函数可以定义一个在绑定时执行一次的初始化动作。

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

update: 被绑定元素所在的模板更新时调用,而不论绑定值是否变化。通过比较更新前后的绑定值,可以忽略不必要的模板更新(详细的钩子函数参数见下)。

componentUpdated: 被绑定元素所在模板完成一次更新周期时调用。

unbind: 只调用一次, 指令与元素解绑时调用。

钩子函数的参数有:

el: 指令所绑定的元素,可以用来直接操作 DOM 。
binding: 一个对象,包含以下属性:
name: 指令名,不包括 v- 前缀。
value: 指令的绑定值, 例如: v-my-directive=“1 + 1”, value 的值是 2。
oldValue: 指令绑定的前一个值,仅在 update 和 componentUpdated 钩子中可用。无论值是否改变都可用。
expression: 绑定值的表达式或变量名。 例如 v-my-directive=“1 + 1” , expression 的值是 “1 + 1”。
arg: 传给指令的参数。例如 v-my-directive:foo, arg 的值是 “foo”。
modifiers: 一个包含修饰符的对象。 例如: v-my-directive.foo.bar, 修饰符对象 modifiers 的值是 { foo: true, bar: true }。
vnode: Vue 编译生成的虚拟节点。
oldVnode: 上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用。

钩子函数的使用

  1. <div id="app" v-runoob:hello.a.b="message">
  2. </div>
  3. <script>
  4. Vue.directive('runoob', {
  5. bind: function (el, binding, vnode) {
  6. var s = JSON.stringify
  7. el.innerHTML =
  8. 'name: ' + s(binding.name) + '<br>' +
  9. 'value: ' + s(binding.value) + '<br>' +
  10. 'expression: ' + s(binding.expression) + '<br>' +
  11. 'argument: ' + s(binding.arg) + '<br>' +
  12. 'modifiers: ' + s(binding.modifiers) + '<br>' +
  13. 'vnode keys: ' + Object.keys(vnode).join(', ')
  14. }
  15. })
  16. new Vue({
  17. el: '#app',
  18. data: {
  19. message: '菜鸟教程!'
  20. }
  21. })
  22. </script>

运行结果:

  1. name: "runoob"
  2. value: "菜鸟教程!"
  3. expression: "message"
  4. argument: "hello"
  5. modifiers: {"a":true,"b":true}
  6. vnode keys: tag, data, children, text, elm, ns, context, functionalContext, key, componentOptions, componentInstance, parent, raw, isStatic, isRootInsert, isComment, isCloned, isOnce

示例接收JavaScript表达式

  1. <div id="app">
  2. <div v-runoob="{ color: 'green', text: '菜鸟教程!' }"></div>
  3. </div>
  4. <script>
  5. Vue.directive('runoob', function (el, binding) {
  6. // 简写方式设置文本及背景颜色
  7. el.innerHTML = binding.value.text
  8. el.style.backgroundColor = binding.value.color
  9. })
  10. new Vue({
  11. el: '#app'
  12. })
  13. </script>

参考菜鸟教程 https://www.runoob.com/vue2/vue-custom-directive.html

发表评论

表情:
评论列表 (有 0 条评论,348人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Vue定义指令

    自定义指令 vue里面不仅仅有内置的指令,也可以根据自己的需求构建自定义指令 它其实就是操作DOM元素的属性以及内容 通过directives属性配置自定义指令,有函

    相关 vue 定义指令

    除了核心功能默认内置的指令 (v-model 和 v-show),Vue 也允许注册自定义指令。注意,在 Vue2.0 中,代码复用和抽象的主要形式是组件。然而,有的情况下,你

    相关 Vue定义指令

     `v-on 、v-model、v-show` 等指令,在操作 dom 时使用了 ref 属性,其实指令也是操作dom 的一种方式,但有时,这些指令并不能满足我们的需求,因此

    相关 vue定义指令

    除了核心功能默认内置的指令 (v-model 和 v-show),Vue 也允许注册自定义指令。有的情况下,对普通 DOM 元素进行底层操作,这时候就会用到自定义指令 下面