Vue指令的钩子函数使用方法


Posted in Javascript onMarch 20, 2017

在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()
 }
})

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
判断JavaScript对象是否可用的最正确方法分析
Oct 03 Javascript
分享精心挑选的12款优秀jQuery Ajax分页插件和教程
Aug 09 Javascript
jquery判断浏览器后退时候弹出消息的方法
Aug 11 Javascript
jQuery增加、删除及修改select option的方法
Aug 19 Javascript
js中动态创建json,动态为json添加属性、属性值的实例
Dec 02 Javascript
利用select实现年月日三级联动的日期选择效果【推荐】
Dec 13 Javascript
Node.js中多进程模块Cluster的介绍与使用
May 27 Javascript
微信小程序实现自定义加载图标功能
Jul 19 Javascript
如何在vue里添加好看的lottie动画
Aug 02 Javascript
angular6 利用 ngContentOutlet 实现组件位置交换(重排)
Nov 02 Javascript
vue 检测用户上传图片宽高的方法
Feb 06 Javascript
JavaScript语句错误throw、try及catch实例解析
Aug 18 Javascript
非常实用的vue导航钩子
Mar 20 #Javascript
Vue2.0实现1.0的搜索过滤器功能实例代码
Mar 20 #Javascript
如何解决vue与传统jquery插件冲突
Mar 20 #Javascript
Vue.js路由vue-router使用方法详解
Mar 20 #Javascript
Vue插件写、用详解(附demo)
Mar 20 #Javascript
详解vue事件对象、冒泡、阻止默认行为
Mar 20 #Javascript
javascript使用btoa和atob来进行Base64转码和解码
Mar 20 #Javascript
You might like
PHP安全技术之 实现php基本安全
2010/09/04 PHP
PHP数据库链接类(PDO+Access)实例分享
2013/12/05 PHP
Laravel 5.4.36中session没有保存成功问题的解决
2018/02/19 PHP
张孝祥JavaScript学习阶段性总结(2)--(X)HTML学习
2007/02/03 Javascript
学习YUI.Ext 第六天--关于树TreePanel(Part 2异步获取节点)
2007/03/10 Javascript
学习JS面向对象成果 借国庆发布个最新作品与大家交流
2009/10/03 Javascript
js chrome浏览器判断代码
2010/03/28 Javascript
javascript 折半查找字符在数组中的位置(有序列表)
2010/12/09 Javascript
JavaScript中的排序算法代码
2011/02/22 Javascript
自己动手制作jquery插件之自动添加删除行功能介绍
2011/10/14 Javascript
js图片滚动效果时间可随意设定当鼠标移上去时停止
2014/06/26 Javascript
用js提交表单解决一个页面有多个提交按钮的问题
2014/09/01 Javascript
一个JavaScript函数把URL参数解析成Json对象
2014/09/24 Javascript
JQuery遍历json数组的3种方法
2014/11/08 Javascript
JS组件Bootstrap dropdown组件扩展hover事件
2016/04/17 Javascript
文本框只能输入数字的实现方法(兼容IE火狐)
2016/06/25 Javascript
Javascript 函数的四种调用模式
2016/11/05 Javascript
无阻塞加载js,防止因js加载不了影响页面显示的问题
2016/12/18 Javascript
解决AngualrJS页面刷新导致异常显示问题
2017/04/20 Javascript
seajs模块压缩问题与解决方法实例分析
2017/10/10 Javascript
详解vue表单——小白速看
2018/04/08 Javascript
初学node.js中实现删除用户路由
2019/05/27 Javascript
原生js实现放大镜组件
2021/01/22 Javascript
浅谈Python中chr、unichr、ord字符函数之间的对比
2016/06/16 Python
Python获取当前函数名称方法实例分享
2018/01/18 Python
python爬取cnvd漏洞库信息的实例
2019/02/14 Python
Python通过字典映射函数实现switch
2020/11/06 Python
施华洛世奇英国官网:SWAROVSKI英国
2017/03/13 全球购物
家得宝官网:The Home Depot(全球最大的家居装饰专业零售商)
2018/12/17 全球购物
香港士多网上超级市场:Ztore
2021/01/09 全球购物
大学生就业自荐信
2013/10/26 职场文书
幸福终点站观后感
2015/06/04 职场文书
李强优秀员工观后感
2015/06/16 职场文书
ajax请求前端跨域问题原因及解决方案
2021/10/16 Javascript
SQL中的三种去重方法小结
2021/11/01 SQL Server
PyTorch device与cuda.device用法
2022/04/03 Python