Vue指令的钩子函数使用方法
发布时间 - 2026-01-11 00:16:15 点击率:次在Vue 中可以把一系列复杂的操作包装为一个指令。

什么是复杂的操作?
我的理解是:复杂逻辑功能的包装、违背数据驱动的 DOM 操作以及对一些 Hack 手段的掩盖等。我们总是期望以操作数据的形式来实现功能逻辑。
钩子函数
对于自定义指令的定义,Vue2 有 5 个可选的钩子函数。
bind: 只调用一次,指令第一次绑定到元素时调用,用这个钩子函数可以定义一个在绑定时执行一次的初始化动作。
inserted: 被绑定元素插入父节点时调用(父节点存在即可调用,不必存在于 document 中)。
update: 被绑定元素所在的模板更新时调用,而不论绑定值是否变化。
componentUpdated: 被绑定元素所在模板完成一次更新周期时调用。
unbind: 只调用一次,指令与元素解绑时调用。
接下来,定义一个简单的指令以验证这些钩子函数的触发时机。
template
<div id="app"> <my-comp v-if="msg" :msg="msg"></my-comp> <button @click="update">更新</button> <button @click="uninstall">卸载</button> <button @click="install">安装</button> </div>
script
Vue.directive('hello', {
bind: function (el) {
console.log('bind')
},
inserted: function (el) {
console.log('inserted')
},
update: function (el) {
console.log('update')
},
componentUpdated: function (el) {
console.log('componentUpdated')
},
unbind: function (el) {
console.log('unbind')
}
})
var myComp = {
template: '<h1 v-hello>{{msg}}</h1>',
props: {
msg: String
}
}
new Vue({
el: '#app',
data: {
msg: 'Hello'
},
components: {
myComp: myComp
},
methods: {
update: function () {
this.msg = 'Hi'
},
uninstall: function () {
this.msg = ''
},
install: function () {
this.msg = 'Hello'
}
}
})
页面加载时
bind
inserted
组件更新时
点击“更新”按钮,更改数据触发组件更新。
update
componentUpdated
卸载组件时
点击“卸载”按钮,数据置空否定判断以触发组件卸载。
unbind
重新安装组件时
点击“安装”按钮,数据赋值肯定判断以触发组件重新安装。
bind
inserted
区别
从案例的运行中,对 5 个钩子函数的触发时机有了初步的认识。存疑的也就是bind和inserted、update和componentUpdated的区别了。
bind 和 inserted
据文档所说,插入父节点时调用 inserted,来个测试。
bind: function (el) {
console.log(el.parentNode) // null
console.log('bind')
},
inserted: function (el) {
console.log(el.parentNode) // <div id="app">...</div>
console.log('inserted')
}
分别在两个钩子函数中输出父节点:bind 时父节点为 null,inserted 时父节点存在。
update 和 componentUpdated
关于这两个的介绍,从字眼上看感觉是组件更新周期有关,继续验证。
update: function (el) {
console.log(el.innerHTML) // Hello
console.log('update')
},
componentUpdated: function (el) {
console.log(el.innerHTML) // Hi
console.log('componentUpdated')
}
没毛病,update 和 componentUpdated 就是组件更新前和更新后的区别。
结论
文档说的没错……
Demo
最佳实践
根据需求的不同,我们要选择恰当的时机去初始化指令、更新指令调用参数以及释放指令存在时的内存占用等。
比较常见的场景是:用指令包装一些无依赖的第三方库以扩展组件功能。而一个健壮的库通常会包含:初始化实例、参数更新和释放实例资源占用等操作。
Vue.directive('hello', {
bind: function (el, binding) {
// 在 bind 钩子中初始化库实例
// 如果需要使用父节点,也可以在 inserted 钩子中执行
el.__library__ = new Library(el, binding.value)
},
update: function (el, binding) {
// 模版更新意味着指令的参数可能被改变,这里可以对库实例的参数作更新
// 酌情使用 update 或 componentUpdated 钩子
el.__library__.setOptions(Object.assign(binding.oldValue, binding.value))
},
unbind: function (el) {
// 释放实例
el.__library__.destory()
}
})
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# Vue
# 指令
# 钩子函数
# Vue生命周期和钩子函数的详解与经典面试题
# 解决VUE mounted 钩子函数执行时 img 未加载导致页面布局的问题
# vue中各选项及钩子函数执行顺序详解
# vue button的@click方法无效钩子函数没有执行问题
# 绑定
# 新和
# 重新安装
# 文档
# 这两个
# 自定义
# 上看
# 可选
# 来个
# 第三方
# 来实现
# 以对
# 大家多多
# 通常会
# 加载
# 定值
# 以及对
# 分别在
# pre
# unbind
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
南京网站制作费用,南京远驱官方网站?
阿里云高弹*务器配置方案|支持分布式架构与多节点部署
Laravel怎么实现搜索功能_Laravel使用Eloquent实现模糊查询与多条件搜索【实例】
文字头像制作网站推荐软件,醒图能自动配文字吗?
Laravel如何自定义分页视图?(Pagination示例)
微信小程序 input输入框控件详解及实例(多种示例)
Python3.6正式版新特性预览
Win11任务栏卡死怎么办 Windows11任务栏无反应解决方法【教程】
Laravel如何将应用部署到生产服务器_Laravel生产环境部署流程
Win11怎么设置虚拟桌面 Win11新建多桌面切换操作【技巧】
nodejs redis 发布订阅机制封装实现方法及实例代码
如何在香港服务器上快速搭建免备案网站?
JavaScript中的标签模板是什么_它如何扩展字符串功能
微信小程序 canvas开发实例及注意事项
LinuxCD持续部署教程_自动发布与回滚机制
laravel怎么使用数据库工厂(Factory)生成带有关联模型的数据_laravel Factory生成关联数据方法
如何快速搭建高效WAP手机网站吸引移动用户?
js代码实现下拉菜单【推荐】
Laravel定时任务怎么设置_Laravel Crontab调度器配置
Laravel API路由如何设计_Laravel构建RESTful API的路由最佳实践
Laravel怎么配置自定义表前缀_Laravel数据库迁移与Eloquent表名映射【步骤】
高防网站服务器:DDoS防御与BGP线路的AI智能防护方案
网站制作价目表怎么做,珍爱网婚介费用多少?
东莞市网站制作公司有哪些,东莞找工作用什么网站好?
如何在阿里云服务器自主搭建网站?
如何在 Telegram Web View(iOS)中防止键盘遮挡底部输入框
网页制作模板网站推荐,网页设计海报之类的素材哪里好?
html5如何实现懒加载图片_ intersectionobserver api用法【教程】
如何用西部建站助手快速创建专业网站?
Laravel怎么进行数据库事务处理_Laravel DB Facade事务操作确保数据一致性
猎豹浏览器开发者工具怎么打开 猎豹浏览器F12调试工具使用【前端必备】
打开php文件提示内存不足_怎么调整php内存限制【解决方案】
Laravel怎么定时执行任务_Laravel任务调度器Schedule配置与Cron设置【教程】
简历在线制作网站免费版,如何创建个人简历?
如何挑选优质建站一级代理提升网站排名?
Laravel如何配置和使用队列处理异步任务_Laravel队列驱动与任务分发实例
宙斯浏览器文件分类查看教程 快速筛选视频文档与图片方法
香港服务器网站卡顿?如何解决网络延迟与负载问题?
Laravel如何监控和管理失败的队列任务_Laravel失败任务处理与监控
Laravel中间件起什么作用_Laravel Middleware请求生命周期与自定义详解
大连网站制作费用,大连新青年网站,五年四班里的视频怎样下载啊?
详解免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)
网站制作软件有哪些,制图软件有哪些?
Edge浏览器怎么启用睡眠标签页_节省电脑内存占用优化技巧
如何确保西部建站助手FTP传输的安全性?
php做exe能调用系统命令吗_执行cmd指令实现方式【详解】
php结合redis实现高并发下的抢购、秒杀功能的实例
Midjourney怎么调整光影效果_Midjourney光影调整方法【指南】
Android实现代码画虚线边框背景效果
夸克浏览器网页跳转延迟怎么办 夸克浏览器跳转优化

