vue3.0自定义指令(drectives)知识点总结


Posted in Vue.js onDecember 27, 2020

在大多数情况下,你都可以操作数据来修改视图,或者反之。但是还是避免不了偶尔要操作原生 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)知识点总结的文章就介绍到这了,更多相关vue3.0中drectives详解内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Vue.js 相关文章推荐
vue使用vant中的checkbox实现全选功能
Nov 17 Vue.js
vue-drawer-layout实现手势滑出菜单栏
Nov 19 Vue.js
vue实现简易的双向数据绑定
Dec 29 Vue.js
vue导入.md文件的步骤(markdown转HTML)
Dec 31 Vue.js
Vue中inheritAttrs的使用实例详解
Dec 31 Vue.js
vue+echarts实现中国地图流动效果(步骤详解)
Jan 27 Vue.js
Vue多选列表组件深入详解
Mar 02 Vue.js
vue中data改变后让视图同步更新的方法
Mar 29 Vue.js
Vue接口封装的完整步骤记录
May 14 Vue.js
Vue实现tab导航栏并支持左右滑动功能
Jun 28 Vue.js
vue实力踩坑之push当前页无效
Apr 10 Vue.js
vue本地构建热更新卡顿的问题“75 advanced module optimization”完美解决方案
Aug 05 Vue.js
vue 使用 sortable 实现 el-table 拖拽排序功能
Dec 26 #Vue.js
在vue项目中封装echarts的步骤
Dec 25 #Vue.js
vue中封装axios并实现api接口的统一管理
Dec 25 #Vue.js
Vue 简单实现前端权限控制的示例
Dec 25 #Vue.js
Vue通过阿里云oss的url连接直接下载文件并修改文件名的方法
Dec 25 #Vue.js
vue使用require.context实现动态注册路由
Dec 25 #Vue.js
vue 使用rules对表单字段进行校验的步骤
Dec 25 #Vue.js
You might like
php中smarty区域循环的方法
2015/06/11 PHP
ext 同步和异步示例代码
2009/09/18 Javascript
javascript 拖放效果实现代码
2010/01/22 Javascript
JavaScript实现从数组中选出和等于固定值的n个数
2014/09/03 Javascript
JavaScript 学习笔记之数据类型
2015/01/14 Javascript
jQuery实现Flash效果上下翻动的中英文导航菜单代码
2015/09/22 Javascript
如何防止JavaScript自动插入分号
2015/11/05 Javascript
javascript实现密码验证
2015/11/10 Javascript
学习使用grunt来打包JavaScript和CSS程序的教程
2016/01/04 Javascript
简单谈谈javascript中this的隐式绑定
2016/02/22 Javascript
JS制作适用于手机和电脑的通知信息效果
2016/10/28 Javascript
jq.ajax+php+mysql实现关键字模糊查询(示例讲解)
2018/01/02 Javascript
JS 使用 window对象的print方法实现分页打印功能
2018/05/16 Javascript
express+vue+mongodb+session 实现注册登录功能
2018/12/06 Javascript
npm 常用命令详解(小结)
2019/01/17 Javascript
[05:16]《大圣!大圣》——DOTA2新英雄齐天大圣配音李世宏老师专访
2016/12/13 DOTA
Python 用户登录验证的小例子
2013/03/06 Python
pygame学习笔记(1):矩形、圆型画图实例
2015/04/15 Python
python列表的常用操作方法小结
2016/05/21 Python
Python判断列表是否已排序的各种方法及其性能分析
2016/06/20 Python
python用户评论标签匹配的解决方法
2018/05/31 Python
Python实现将Excel转换成为image的方法
2018/10/23 Python
对python for 文件指定行读写操作详解
2018/12/29 Python
pandas实现to_sql将DataFrame保存到数据库中
2019/07/03 Python
简单了解python PEP的一些知识
2019/07/13 Python
Python求平面内点到直线距离的实现
2020/01/19 Python
PyQt5连接MySQL及QMYSQL driver not loaded错误解决
2020/04/29 Python
浅谈tensorflow使用张量时的一些注意点tf.concat,tf.reshape,tf.stack
2020/06/23 Python
俄罗斯皮肤健康中心:Pharmacosmetica.ru
2020/02/22 全球购物
什么是ESB?请介绍一下ESB?
2015/05/27 面试题
社区戒毒工作方案
2014/06/04 职场文书
会员活动策划方案
2014/08/19 职场文书
文明礼貌主题班会
2015/08/14 职场文书
如何做好工作总结!
2019/04/10 职场文书
详解Js模块化的作用原理和方案
2021/04/29 Javascript
Python+Selenium实现抖音、快手、B站、小红书、微视、百度好看视频、西瓜视频、微信视频号、搜狐视频、一点号、大风号、趣头条等短视频自动发布
2022/04/13 Python