vue3的自定义指令

news/2024/10/25 15:36:55/

除了 Vue 内置的一系列指令 (比如 v-model 或 v-show) 之外,Vue 还允许你注册自定义的指令 (Custom
Directives)。

 1.自定义指令的目的和简单介绍

自定义指令主要是为了重用涉及普通元素的底层 DOM 访问的逻辑。
一个自定义指令由一个包含类似组件生命周期钩子的对象来定义。钩子函数会接收到指令所绑定元素作为其参数。
举例:在某个场景下,需要一进入页面或者打开某个弹窗就聚焦到指定的输入框。
局部的写法:

<script setup>
const vFocus = {created(el, binding, vnode) {},beforeMount(el, binding, vnode) {},mounted(el) {el.focus()},beforeUpdate(a,b,c,prevNode) { //! 第四个参数 prevNode 只在beforeUpdate和updated才有!},updated() {},beforeUnmount() {// 当指令绑定的元素 的父组件销毁前调用。  <简单讲,指令元素的父组件销毁前调用>},unmounted() {},// 当指令与元素解除绑定且父组件已销毁时调用。
}
</script><template><input v-focus>
</template>

 全局的写法:

import { createApp } from 'vue'
const app = createApp(App)
app.directive('focus',{created(el, binding, vnode) {},beforeMount(el, binding, vnode) {},mounted() {el.focus()},beforeUpdate(a,b,c,prevNode) { //! 第四个参数 prevNode 只在beforeUpdate和updated才有!},updated() {},beforeUnmount() {// 当指令绑定的元素 的父组件销毁前调用。  <简单讲,指令元素的父组件销毁前调用>},unmounted() {},// 当指令与元素解除绑定且父组件已销毁时调用。
})

 使用全局注册需注意得写在mount(‘#app’)之前,否则会报错

我门可以发现对比vue2来看vue3里自定义指令似乎在生命周期这块发生了某些变化,下面我们来看看具体的。
注意:后面的示例都用局部的自定义指令来讲解。 

2.对比vue2自定义指令的生命周期
vue2自定义指令生命周期

bind: function () {},
inserted: function () {},
update: function () {},
componentUpdated: function () {},
unbind: function () {}

3.vue3自定义组件生命周期

 created:在绑定元素的 attribute 或事件监听器被应用之前调用。在指令需要附加在普通的 v-on
事件监听器调用前的事件监听器中时,这很有用。
beforeMount:当指令第一次绑定到元素并且在挂载父组件之前调用。
mounted:在绑定元素的父组件被挂载后调用。
beforeUpdate:在更新包含组件的 VNode 之前调用。
updated:在包含组件的 VNode 及其子组件的 VNode 更新后调用。
beforeUnmount:在卸载绑定元素的父组件之前调用
unmounted:当指令与元素解除绑定且父组件已卸载时,只调用一次。

这些生命周期都会接受以下几个参数: 

el, binding, vnode, prevVnode 


http://www.ppmy.cn/news/1200001.html

相关文章

设计模式之装饰模式

一、概念 装饰模式是一种结构型设计模式&#xff0c;允许你通过将对象放入包含行为的特殊封装对象中来为原对象绑定新的行为。 二、构造 部件&#xff08;Component&#xff09;声明封装器和被封装对象的公用接口。 具体部件&#xff08;Concrete Component&#xff09;类是…

全光谱大面积氙光灯太阳光模拟器老化测试

氙灯光源太阳光模拟器广泛应用于光解水产氢、光化学催化、二氧化碳制甲醇、光化学合成、光降解污染物、 水污染处理、生物光照,光学检测、太阳能电池研究、荧光材料测试(透射、反射、吸收) 太阳能电池特性测试&#xff0c;光热转化&#xff0c;光电材料特性测试&#xff0c;生物…

快速跳转插件

只要是著名的编辑软件&#xff08;很多人使用的&#xff09;一般就会有相应的跳转插件&#xff0c;用于快速在页面中进行快速的跳转&#xff0c;在Github的这个链接中列出了一些著名软件的跳转插件&#xff1a;https://github.com/acejump/AceJump#comparison

vue如何实现视频全屏切换

最近项目开发中遇到一个视频窗口全屏切换功能&#xff0c;为此在这里做个记录。 具体的实现思路&#xff1a; <template><div class"content-box"><div class"container"><div id"screen" class"screen"><…

Elasticsearch实战:常见错误及详细解决方案

Elasticsearch实战&#xff1a;常见错误及详细解决方案 1.read_only_allow_delete":“true” 当我们在向某个索引添加一条数据的时候&#xff0c;可能&#xff08;极少情况&#xff09;会碰到下面的报错&#xff1a; {"error": {"root_cause": [{&…

R语言环境下使用curl库做的爬虫代码示例

curl库是一个用于传输数据的工具和库&#xff0c;它支持多种协议&#xff0c;包括HTTP、FTP、SMTP等。在爬虫中&#xff0c;curl库可以用来获取网页内容&#xff0c;从而实现爬取网页的功能。通过设置curl的选项&#xff0c;可以实现对网页的请求、响应、重定向等操作。在使用c…

陶瓷生产工艺数字孪生可视化管理平台,推动陶瓷工厂数字化转型新实践

聚焦国家战略需求和先进制造业发展方向&#xff0c;加快数字化发展战略部署&#xff0c;全面推进制造业数字化转型&#xff0c;推进智能制造典型场景和示范工厂的标杆引领&#xff0c;助力陶瓷工业的数字化、网络化、智能化并行推进、融合发展。数字孪生、物联网、云计算、人工…

关于Andorid Studio中build.gradle和setting.gradle配置变更

Build was configured to prefer settings repositories over project repositories but repository Google was added by build file xx/build.gradle 报错的原因是因为&#xff0c;在Android Gradle 7.x 版本中 Android Studio倾向于将下属依赖添加到setting.gradle中&#x…