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 打包的静态文件不能直接运行的原因及解决办法
Nov 19 Vue.js
Vue3配置axios跨域实现过程解析
Nov 25 Vue.js
vue项目中openlayers绘制行政区划
Dec 24 Vue.js
vue+vant 上传图片需要注意的地方
Jan 03 Vue.js
如何在VUE中使用vue-awesome-swiper
Jan 04 Vue.js
解决vue使用vant轮播组件swipe + flex时文字抖动问题
Jan 07 Vue.js
Vue+Bootstrap实现简易学生管理系统
Feb 09 Vue.js
vue-element-admin项目导入和导出的实现
May 21 Vue.js
Vue3.0写自定义指令的简单步骤记录
Jun 27 Vue.js
VUE使用draggable实现组件拖拽
Apr 06 Vue.js
vue 自定义组件添加原生事件
Apr 21 Vue.js
vue使用element-ui按需引入
May 20 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利用单例模式实现日志处理类库
2014/02/10 PHP
phpmailer在服务器上不能正常发送邮件的解决办法
2014/07/08 PHP
php文件上传 你真的掌握了吗
2016/11/28 PHP
php 如何设置一个严格控制过期时间的session
2017/05/05 PHP
JScript中的&quot;this&quot;关键字使用方式补充材料
2007/03/08 Javascript
Ajax执行顺序流程及回调问题分析
2012/12/10 Javascript
Javascript全局变量var与不var的区别深入解析
2013/12/09 Javascript
如何将网页表格内容导入excel
2014/02/18 Javascript
JS实现CheckBox复选框全选全不选功能
2015/05/06 Javascript
Fullpage.js固定导航栏-实现定位导航栏
2016/03/17 Javascript
DataTables+BootStrap组合使用Ajax来获取数据并且动态加载dom的方法(排序,过滤,分页等)
2016/11/09 Javascript
vue基于Vue2.0和高德地图的地图组件实例
2017/04/28 Javascript
简单了解小程序+node梳理登陆流程
2019/06/24 Javascript
nodejs实现的http、https 请求封装操作示例
2020/02/06 NodeJs
JavaScript中reduce()的5个基本用法示例
2020/07/19 Javascript
Python简单实现TCP包发送十六进制数据的方法
2016/04/16 Python
mac下给python3安装requests库和scrapy库的实例
2018/06/13 Python
python学生信息管理系统(完整版)
2020/04/05 Python
djano一对一、多对多、分页实例代码
2019/08/16 Python
使用python远程操作linux过程解析
2019/12/04 Python
浅谈Pycharm最有必要改的几个默认设置项
2020/02/14 Python
Django实现celery定时任务过程解析
2020/04/21 Python
关于Python3爬虫利器Appium的安装步骤
2020/07/29 Python
雅诗兰黛旗下走天然植物路线的彩妆品牌:Prescriptives
2016/08/14 全球购物
意大利香水和化妆品购物网站:Parfimo.it
2019/10/06 全球购物
投标邀请书范文
2014/01/31 职场文书
物流创业计划书
2014/02/01 职场文书
物流管理毕业生自荐信范文
2014/03/15 职场文书
3.15国际消费者权益日主题活动活动总结
2014/03/16 职场文书
护理专业求职信
2014/06/15 职场文书
农业生产宣传标语
2014/10/08 职场文书
个人培训总结
2015/03/05 职场文书
员工年度工作总结2015
2015/05/18 职场文书
母亲节主题班会
2015/08/14 职场文书
weblogic服务建立数据源连接测试更新mysql驱动包的问题及解决方法
2022/01/22 MySQL
Win11右下角图标点了没反应怎么办?Win11点击右下角图标无反应解决方法汇总
2022/07/07 数码科技