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 element-ul实现展开和收起功能的实例代码
Nov 25 Vue.js
如何在vue中使用kindeditor富文本编辑器
Dec 19 Vue.js
Vue实现简单计算器
Jan 20 Vue.js
vue监听键盘事件的相关总结
Jan 29 Vue.js
手动实现vue2.0的双向数据绑定原理详解
Feb 06 Vue.js
详解vue3中组件的非兼容变更
Mar 03 Vue.js
vue中axios封装使用的完整教程
Mar 03 Vue.js
Vue Element UI自定义描述列表组件
May 18 Vue.js
vue-cropper组件实现图片切割上传
May 27 Vue.js
Vue + iView实现Excel上传功能的完整代码
Jun 22 Vue.js
vue3获取当前路由地址
Feb 18 Vue.js
vue 自定义的组件绑定点击事件
Apr 21 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
CodeIgniter生成网站sitemap地图的方法
2013/11/13 PHP
PHP PDO fetch 模式各种参数的输出结果一览
2015/01/07 PHP
PHP制作百度词典查词采集器
2015/01/29 PHP
使用PHP编写发红包程序
2015/07/22 PHP
PHP实现的简单对称加密与解密方法实例小结
2017/08/28 PHP
php压缩文件夹最新版
2018/07/18 PHP
laravel 5.3 单用户登录简单实现方法
2019/10/14 PHP
使用onbeforeunload属性后的副作用
2007/03/08 Javascript
一款JavaScript压缩工具:X2JSCompactor
2007/06/13 Javascript
使用Json比用string返回数据更友好,也更面向对象一些
2011/09/13 Javascript
js的alert样式如何更改如背景颜色
2014/01/22 Javascript
Javascript 函数parseInt()转换时出现bug问题
2014/05/20 Javascript
angularJS 中$attrs方法使用指南
2015/02/09 Javascript
JS实现图片高亮展示效果实例
2015/11/24 Javascript
Angular ng-repeat指令实例以及扩展部分
2016/12/26 Javascript
jQuery实现滚动条滚动到子元素位置(方便定位)
2017/01/08 Javascript
JS判断非空至少输入两个字符的简单实现方法
2017/06/23 Javascript
JS实现的ajax和同源策略(实例讲解)
2017/12/01 Javascript
React SSR样式及SEO的实践
2018/10/22 Javascript
vue与原生app的对接交互的方法(混合开发)
2018/11/28 Javascript
jquery无缝图片轮播组件封装
2020/11/25 jQuery
vue通过数据过滤实现表格合并
2020/11/30 Javascript
vue实现在线学生录入系统
2020/05/30 Javascript
JavaScript实现Tab标签页切换的最简便方式(4种)
2020/06/28 Javascript
[54:43]DOTA2-DPC中国联赛 正赛 CDEC vs Dynasty BO3 第一场 2月22日
2021/03/11 DOTA
python列表操作实例
2015/01/14 Python
在Python中使用itertools模块中的组合函数的教程
2015/04/13 Python
Python抓取手机号归属地信息示例代码
2016/11/28 Python
Java与Python两大幸存者谁更胜一筹呢
2018/04/12 Python
Python中*args和**kwargs的区别详解
2019/09/17 Python
python3 xpath和requests应用详解
2020/03/06 Python
python中round函数保留两位小数的方法
2020/12/04 Python
影视艺术学院毕业生自荐信
2013/11/13 职场文书
离婚起诉书范文2016
2015/11/26 职场文书
python geopandas读取、创建shapefile文件的方法
2021/06/29 Python
Redis高可用集群redis-cluster详解
2022/03/20 Redis