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 相关文章推荐
使用javascipt---实现二分查找法
Apr 10 Javascript
表单类各种类型(文本框)失去焦点效果jquery代码
Apr 26 Javascript
javascript:json数据的页面绑定示例代码
Jan 26 Javascript
详解JavaScript对象和数组
Dec 03 Javascript
易被忽视的js事件问题总结
May 14 Javascript
js阻止默认浏览器行为与冒泡行为的实现代码
May 15 Javascript
jQuery绑定自定义事件的魔法升级版
Jun 30 Javascript
实现微信小程序的wxml文件和wxss文件在webstrom的支持
Jun 12 Javascript
浅谈Vue父子组件和非父子组件传值问题
Aug 22 Javascript
JS Input里添加小图标的两种方法
Nov 11 Javascript
帮你彻底搞懂JS中的prototype、__proto__与constructor(图解)
Aug 23 Javascript
vue实现淘宝购物车功能
Apr 20 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
sony ICF-2010 拆解与改装
2021/03/02 无线电
让PHP支持断点续传的源码
2010/05/16 PHP
php预定义变量使用帮助(带实例)
2013/10/30 PHP
html静态页面调用php文件的方法
2014/11/13 PHP
php强制更新图片缓存的方法
2015/02/11 PHP
laravel 框架配置404等异常页面
2019/01/07 PHP
Aster vs Newbee BO5 第一场2.19
2021/03/10 DOTA
关于实现代码语法标亮 dp.SyntaxHighlighter
2007/02/02 Javascript
通过js动态操作table(新增,删除相关列信息)
2012/05/23 Javascript
关于eval 与new Function 到底该选哪个?
2013/04/17 Javascript
js分页工具实例
2015/01/28 Javascript
JavaScript 常见安全漏洞和自动化检测技术
2015/08/21 Javascript
js替换字符串中所有指定的字符(实现代码)
2016/08/17 Javascript
JavaScript 输出显示内容(document.write、alert、innerHTML、console.log)
2016/12/14 Javascript
微信小程序实现弹出菜单动画
2019/06/21 Javascript
微信小程序如何获取地址
2019/12/24 Javascript
JavaScript中this函数使用实例解析
2020/02/21 Javascript
electron踩坑之dialog中的callback解决
2020/10/06 Javascript
小程序实现密码输入框
2020/11/16 Javascript
[01:08:24]DOTA2-DPC中国联赛 正赛 RNG vs Phoenix BO3 第一场 2月5日
2021/03/11 DOTA
python服务器端收发请求的实现代码
2014/09/29 Python
Windows下用py2exe将Python程序打包成exe程序的教程
2015/04/08 Python
全面了解Nginx, WSGI, Flask之间的关系
2018/01/09 Python
Pytorch实现各种2d卷积示例
2019/12/30 Python
如何将Pycharm中调整字体大小的方式设置为&quot;ctrl+鼠标滚轮上下滑&quot;
2020/11/17 Python
工程测量与监理专业应届生求职信
2013/11/27 职场文书
关于母亲节的感言
2014/02/04 职场文书
上海世博会志愿者口号
2014/06/17 职场文书
领导党的群众路线教育实践活动个人对照检查材料
2014/09/23 职场文书
四风专项整治工作情况汇报
2014/10/28 职场文书
2015新年联欢晚会开场白
2014/12/14 职场文书
2015年母亲节活动策划方案
2015/05/04 职场文书
离婚协议书格式范本
2016/03/18 职场文书
某药房的新员工入职告知书!
2019/07/15 职场文书
MySQL锁机制
2021/04/05 MySQL
只需要这一行代码就能让python计算速度提高十倍
2021/05/24 Python