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 个钩子函数的触发时机有了初步的认识。存疑的也就是bindinserted、updatecomponentUpdated的区别了。

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实现代码画虚线边框背景效果  夸克浏览器网页跳转延迟怎么办 夸克浏览器跳转优化