最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • vue3.0自定义指令(drectives)

    正文概述 掘金(fallsank)   2020-12-27   366

    在大多数情况下,你都可以操作数据来修改视图,或者反之。但是还是避免不了偶尔要操作原生 DOM,这时候,你就能用到自定义指令。

    举个例子,你想让页面的文本框自动聚焦,在没有学习自定义指令的时候,我们可能会这么做。

    const app = Vue.createApp({
      mounted(){
        this.$refs.input.focus();
      },  
      template: `<input type="text" ref="input" />`,
    });
    

    在mounted钩子函数里,通过 $refs 获取需要聚焦的 DOM 元素,然后调用 focus 方法完成自动聚焦的功能。

    基本使用

    上面做法已经实现了我们需要的功能,但是假如说我们有多个组件都需要这个功能,那我们只能把这段代码复制过去,重新实现逻辑。我们下面看下如果使用自定义指令,应该怎么做。

    const app = Vue.createApp({
      // 通过 v-[自定义指令名称] 绑定自定义指令
      template: `<input type="text" v-focus/>`,
    });
    // 注册一个全局自定义指令
    app.directive('focus',{
      // 当被绑定的元素插入到DOM的时候执行..
      mounted(el){
        el.focus();
      }
    })
    

    如上,我们定义了一个全局自定义指令 focus,并通过 v-focus 绑定到需要聚焦的 input 元素上。如果,其他组件或模块也需要聚焦功能,只要简单的绑定此指令即可。

    自定义指令的钩子函数

    我们在上面定义指令的时候,会发现其中包含了 mounted 钩子函数,指令还提供了如下钩子函数,我们用代码的形式来给大家列出来。

    app.directive('directiveName', {
      // 指令绑定元素挂载前
      beforeMount(el) {},
      // 指令绑定元素挂载后
      mounted(el, binding) {},
      // 指令绑定元素因为数据修改触发修改前
      beforeUpdate(el) {},
      // 指令绑定元素因为数据修改触发修改后
      updated(el) {},
      // 指令绑定元素销毁前
      beforeUnmount(el) {},
      // 指令绑定元素销毁后
      unmounted(el) {},
    });
    

    效果就不一一列举了,有兴趣大家可以尝试下分别触发这些钩子函数。指令钩子函数大部分与组件很类似,大家可以对比着来看。

    动态指令参数

    下面,我们再来看一个例子。

    const app = Vue.createApp({
      template: `<div class="box" v-abs-top="num" style="position:absolute;" ></div>`,
    });
    // 在很多时候,你可能想在 mounted 和 updated 时触发相同行为,而不关心其它的钩子,就这样写
    app.directive('absTop', (el) => {
      el.style[binding.arg] = '100px';
    });
    

    我们在 div 元素上绑定 absTop 指令,div 元素本身定位是 absolute,指令执行让绑定元素的 top 为 100px。这时候,我想在绑定指令的时候能够传一个参数,使得元素的 top 值可以根据参数来改变。代码如下:

    const app = Vue.createApp({
      data() { return { num: 100 } },
      template: `<div class="box" v-abs-top="num"></div>`,
    });
    app.directive('absTop', (el, binding) => {
      el.style.top = binding.value + 'px';
    });
    

    元素可以通过 v-directive="value" 传入动态参数,指令通过钩子函数的第二个参数 binding.value 来接收参数。

    如果其他元素可能不是修改 top 的值,有可能是 left、right 或者 bottom,那么指令可以动态指定吗?其实也是可以做到的。首先,我们修改模板为:

    <div class="box" v-abs:left="num"></div>
    

    然后修改指令本身

    app.directive('absTop', (el, binding) => {
      el.style[binding.arg] = binding.value + 'px';
    });
    

    v-mydirective:[argument]="value" ,arguments 也是可以动态改变的,这样,就可以完美的实现上述要求了。

    组件的使用

    组件中绑定指令与 DOM元素绑定指令并没有什么不同,指令会获取组件的原生 根DOM 来操作。但是要注意的是,在 vue3.0 中,组件可能有多个根节点,指令绑定在多根节点组件是有问题的。

    局部自定义指令

    最后,再来简单说下局部自定义指令是怎么定义的。

    const app = Vue.createApp({
    directives: {
        focus: {
          // 指令的定义
          mounted(el) {
            el.focus()
          }
        }
      }
    }
    

    局部指令定义和全局指令基本一致,如上所示,在组件中定义 directives 就可以了。

    总结

    自定义指令可以提取出原生DOM操作的逻辑。所以指令的应用范围主要表现在,当一些操作涉及到 DOM 底层时,而且操作逻辑可能用于多处地方,就适合用指令来封装这些逻辑。


    起源地下载网 » vue3.0自定义指令(drectives)

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元