vue 自定义指令

曾经终败给现在 2021-07-24 18:28 747阅读 0赞
  1. 自定义指令:
  2. 1、全局指令:
  3. (1)创建
  4. Vue.directive('名称',{
  5. 钩子函数:function(el,binding){
  6. el:dom对象
  7. binding:指令对象,包含以下属性
  8. name: 指令名,不包括 v- 前缀。
  9. value:指令的绑定值,会进行动态解析,例如:v-my-directive="1 + 1" 中,绑定值为2
  10. oldValue:指令绑定的前一个值,仅在updatecomponentUpdated 钩子中可用,无论值是否改变都可用。
  11. expression:字符串形式的指令表达式,不会动态解析,例如v-my-directive="1 + 1" 中,表达式为 "1 + 1"
  12. arg:传给指令的参数,可选,例如v-my-directive:foo中,参数为 "foo"
  13. modifiers:一个包含修饰符的对象,例如:v-my-directive.foo.bar中,修饰符对象为{ foo: true, bar: true }。
  14. vnode: Vue编译生成的虚拟节点,移步 VNode API 来了解更多详情。
  15. oldVnode: 上一个虚拟节点,仅在 update componentUpdated 钩子中可用。
  16. 除了el之外,其它参数都应该是只读的,切勿进行修改,如果需要在钩子之间共享数据,建议通过元素的 dataset 来进行。
  17. }
  18. })
  19. 其中钩子函数:
  20. (1)bind:只调用一次,指令第一次绑定到元素时调用,在这里可以进行一次性的初始化设置。
  21. (2)inserted:被绑定元素插入父节点时调用 (仅保证父节点存在,但不一定已被插入文档中)
  22. (3)update:所在组件的 VNode 更新时调用,但是可能发生在其子 VNode 更新之前,指令的值可能发生了改变,也可能没有,但是你可以通过比较更新前后的值来忽略不必要的模板更新
  23. (4)componentUpdated:指令所在组件的 VNode 及其子 VNode 全部更新后调用。
  24. (5)unbind:只调用一次,指令与元素解绑时调用。
  25. (2)支持动态参数
  26. <p v-pin:[direction]="200">...</p>
  27. Vue.directive('pin', {
  28. bind: function (el, binding, vnode) {
  29. el.style.position = 'fixed'
  30. var s = (binding.arg == 'left' ? 'left' : 'top') binding.arg获取:后的参数
  31. el.style[s] = binding.value + 'px'
  32. }
  33. })
  34. (3)函数简写
  35. bindupdate时触发相同行为
  36. Vue.directive('color-swatch', function (el, binding) {
  37. el.style.backgroundColor = binding.value
  38. })
  39. 2、局部指令
  40. 在组件中和data同级
  41. directives:{
  42. 名称:{
  43. 钩子函数
  44. }
  45. }

代码示例:
main.js:

  1. // The Vue build version to load with the `import` command
  2. // (runtime-only or standalone) has been set in webpack.base.conf with an alias.
  3. import Vue from 'vue'
  4. import App from './App'
  5. Vue.config.productionTip = false
  6. //自定义全局指令
  7. Vue.directive('focus',{
  8. inserted:function(el,binding,vnode,oldnode){
  9. el.focus();
  10. }
  11. })
  12. Vue.directive('li',{
  13. inserted:function(el,binding,vnode,oldnode){
  14. console.log(binding)
  15. console.log(binding.modifiers)
  16. let str='<ul>'
  17. for(let i=0;i<binding.value.length;i++)
  18. {
  19. str+=`<li>${ binding.value[0]}</li>`
  20. }
  21. str+='</ul>';
  22. el.innerHTML=str;
  23. }
  24. })
  25. /* eslint-disable no-new */
  26. new Vue({
  27. el: '#app',
  28. data:{ foo:'hello foo'},
  29. components: { App },
  30. template: '<App/>'
  31. })

组件:

  1. <template>
  2. <div>
  3. <input type='text' v-focus v-local/>
  4. </div>
  5. </template>
  6. <script>
  7. export default{
  8. name:'d',
  9. data()
  10. {
  11. return{
  12. }
  13. },
  14. //自定义局部指令
  15. directives:{
  16. local:{
  17. bind(el)
  18. {
  19. el.value='jeff'
  20. console.log('局部一次')
  21. }
  22. }
  23. }
  24. }
  25. </script>
  26. <style lang="css">
  27. </style>

指令参数测试:
在这里插入图片描述

  1. Vue.directive('demo', {
  2. bind: function (el, binding, vnode) {
  3. var s = JSON.stringify
  4. el.innerHTML =
  5. 'name: ' + s(binding.name) + '<br>' +
  6. 'value: ' + s(binding.value) + '<br>' +
  7. 'expression: ' + s(binding.expression) + '<br>' +
  8. 'argument: ' + s(binding.arg) + '<br>' +
  9. 'modifiers: ' + s(binding.modifiers) + '<br>' +
  10. 'vnode keys: ' + Object.keys(vnode).join(', ')
  11. }
  12. })
  13. new Vue({
  14. el: '#hook-arguments-example',
  15. data: {
  16. message: 'hello!'
  17. }
  18. })

发表评论

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

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

相关阅读

    相关 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 元素进行底层操作,这时候就会用到自定义指令 下面