Vue3中关于自定义指令的一些经历

梦想不抛弃苦心追求的人,只要不停止追求,你们会沐浴在梦想的光辉之中。再美好的梦想与目标,再完美的计划和方案,如果不能尽快在行动中落实,最终只能是纸上谈兵,空想一番。只要瞄准了大方向,坚持不懈地做下去,才能够扫除挡在梦想前面的障碍,实现美好的人生蓝图。Vue3中关于自定义指令的一些经历,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

前言

自定义指令真的蛮好用,尤其是一些繁琐的很多组件都通用的监控,直接扔到指令里面就行。但是从vue2到vue3的演进过程里,指令的使用方式发生了比较大的变化,而且有一些坑,在这里记录一下。

  • Tips:本文默认你已经熟练使用vue2的自定义指令

从一个需求开始

需求:前端项目使用element-ui,其中el-table的表高在换不同显示屏的时候很难适配,需要一个统一的处理手段进行自适应,应该怎么做呢?

第一阶段

手动设定两三种表高,监听判断屏幕大小,然后匹配一下。这个实在太low,直接放弃

第二阶段

我最初的想法是写一个setInterval,每隔1秒钟扫一次document.clientHeight,来判断表高是否需要调整,代码如下:

setInterval(() => {
	const h = document.documentElement.clientHeight
	if(h !== oldHeight.value) {
		tableHeight.value = h * 0.6
		oldValue.value = h
	}
}, 1000)

但是这个有问题,每个需要调整表高的组件都要写一个监听,太繁琐且难以维护。放弃该方案

第三阶段

我们的directive闪亮登场。

自定义指令的注册

const app = Vue.createApp({})
// 注册一个全局自定义指令 `v-focus`
app.directive('focus', {
  // 当被绑定的元素插入到 DOM 中时……
  mounted(el) {
    // Focus the element
    el.focus()
  }
})

就写在前端项目的根文件main.js里面就好,就可以注册一个自定义指令。使用也很简单,直接把v-focus写在某个dom上就行:

<div v-focus></div>

解决自适应高度的问题

经过不断的研究,下面这种写法是比较靠谱的:

app.directive('resizer', {
  mounted: (el, binding) => {
    const tableHeight = () => {
      if (window.innerHeight >= 976) {
        el.style.height = '670px'
      } else {
        el.style.height = `${window.innerHeight - binding.value < 200 ? 200 : (window.innerHeight - binding.value)}px`
      }
    }
    tableHeight()
    el.tableHeight = tableHeight
    window.addEventListener('resize', el.tableHeight)
  },
  updated: (el, binding) => {
    if (binding.oldValue !== binding.value) {
      el.tableHeight()
    }
  },
  beforeUnmount: el => {
    window.removeEventListener('resize', el.tableHeight)
  },
})

应该注意到,和vue2的自定义指令相比:

  1. 原本的inserted没了,很多函数也没了,取而代之的是mounted,beforeMounted,updated,beforeUpdated,beforeUnmount等,使用的时候要注意到这些。
  2. 另外,vue3不建议操作参数vnode,而是操作el,因为vnode包含很多额外的函数、属性,修改容易发生错误。
  3. binding中的新旧值就是value和oldValue,不再有什么arg

可以看出vue3的自定义指令设计简洁了很多,参数命名也规范了不少,我个人很喜欢

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之家整理,本文链接:https://www.bmabk.com/index.php/post/153516.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之家——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!