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 18 Vue.js
详解Vue的mixin策略
Nov 19 Vue.js
对vue生命周期的深入理解
Dec 03 Vue.js
vue中watch的用法汇总
Dec 28 Vue.js
Vue仿百度搜索功能
Dec 28 Vue.js
vue+elementui通用弹窗的实现(新增+编辑)
Jan 07 Vue.js
vue实现验证用户名是否可用
Jan 20 Vue.js
vue form表单post请求结合Servlet实现文件上传功能
Jan 22 Vue.js
vue使用wavesurfer.js解决音频可视化播放问题
Apr 04 Vue.js
Vue OpenLayer 为地图绘制风场效果
Apr 24 Vue.js
vue生命周期钩子函数以及触发时机
Apr 26 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多例模式介绍
2013/06/24 PHP
ThinkPHP处理Ajax返回的方法
2014/11/22 PHP
使用PHP处理数据库数据如何将数据返回客户端并显示当前状态
2016/02/16 PHP
CodeIgniter分页类pagination使用方法示例
2016/03/28 PHP
浅谈PHP错误类型及屏蔽方法
2017/05/27 PHP
javascript 数组的方法集合
2008/06/05 Javascript
JavaScript 继承的实现
2009/07/09 Javascript
javascript自动改变文字大小和颜色的效果的小例子
2013/08/02 Javascript
用javascript替换URL中的参数值示例代码
2014/01/27 Javascript
javascript HTML+CSS实现经典橙色导航菜单
2016/02/16 Javascript
bootstrap组件之导航组件使用方法
2017/01/19 Javascript
使用ionic播放轮询广告的实现方法(必看)
2017/04/24 Javascript
Vue仿手机qq的实例代码(demo)
2017/09/08 Javascript
详细分析单线程JS执行问题
2017/11/22 Javascript
详解如何配置vue-cli3.0的vue.config.js
2018/08/23 Javascript
vuex实现及简略解析(小结)
2019/03/01 Javascript
扫微信小程序码实现网站登陆实现解析
2019/08/20 Javascript
JS随机密码生成算法
2019/09/23 Javascript
微信小程序可滑动周日历组件使用详解
2019/10/21 Javascript
Node如何后台数据库使用增删改查功能
2019/11/21 Javascript
Vue自定义多选组件使用详解
2020/09/08 Javascript
vuex的数据渲染与修改浅析
2020/11/26 Vue.js
零基础写python爬虫之打包生成exe文件
2014/11/06 Python
Python中的自省(反射)详解
2015/06/02 Python
学习python之编写简单简单连接数据库并执行查询操作
2016/02/27 Python
python模拟事件触发机制详解
2018/01/19 Python
python实现flappy bird游戏
2018/12/24 Python
python的pytest框架之命令行参数详解(上)
2019/06/27 Python
pytorch numpy list类型之间的相互转换实例
2019/08/18 Python
Python连接Oracle之环境配置、实例代码及报错解决方法详解
2020/02/11 Python
CSS3 实现图形下落动画效果
2020/11/13 HTML / CSS
美国在线乐器和设备商店:Musician’s Friend
2018/07/06 全球购物
什么叫做SQL注入,如何防止
2016/10/04 面试题
优秀中职教师事迹材料
2014/08/26 职场文书
市直属机关2016年主题党日活动总结
2016/04/05 职场文书
springboot如何接收application/x-www-form-urlencoded类型的请求
2021/11/02 Java/Android