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 相关文章推荐
firefox浏览器下javascript 拖动层效果与原理分析代码
Dec 04 Javascript
javascript面向对象包装类Class封装类库剖析
Jan 24 Javascript
js打开新窗口方法整理
Feb 17 Javascript
Bootstrap和Java分页实例第二篇
Dec 23 Javascript
BootStrap select2 动态改变值的方法
Feb 10 Javascript
javascript实现日期三级联动下拉框选择菜单
Dec 03 Javascript
关于使用js算总价的问题
Jun 23 Javascript
关于js中的鼠标事件总结
Jul 11 Javascript
JavaScript中附件预览功能实现详解(推荐)
Aug 15 Javascript
移动端自适应flexible.js的使用方法(不用三大框架,仅写一个单html页面使用)推荐
Apr 02 Javascript
搭建一个Koa后端项目脚手架的方法步骤
May 30 Javascript
vant自定义二级菜单操作
Nov 02 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实现从ftp服务器上下载文件树到本地电脑的程序
2009/02/10 PHP
jQuery+php简单实现全选删除的方法
2016/11/28 PHP
PHP脚本自动识别验证码查询汽车违章
2016/12/20 PHP
jQuery 各种浏览器下获得日期区别
2008/12/22 Javascript
javascript css styleFloat和cssFloat
2010/03/15 Javascript
javascript五图轮播切换实用版
2012/08/17 Javascript
使用cluster 将自己的Node服务器扩展为多线程服务器
2014/11/10 Javascript
js中数组排序sort方法的原理分析
2014/11/20 Javascript
JavaScript实现的encode64加密算法实例分析
2015/04/15 Javascript
JS数字抽奖游戏实现方法
2015/05/04 Javascript
图解js图片轮播效果
2015/12/20 Javascript
Javascript类型系统之String字符串类型详解
2016/06/21 Javascript
jquery实现网站列表切换效果的2种方法
2016/08/12 Javascript
Bootstrap Table使用整理(五)之分页组合查询
2017/06/09 Javascript
js+html5实现半透明遮罩层弹框效果
2020/08/24 Javascript
JavaScript递归算法生成树形菜单
2017/08/15 Javascript
ionic3 懒加载
2017/08/16 Javascript
详解vue中使用express+fetch获取本地json文件
2017/10/10 Javascript
基于Vue 2.0的模块化前端 UI 组件库小结
2017/12/21 Javascript
jQuery+CSS实现的标签页效果示例【测试可用】
2018/08/14 jQuery
layui自定义插件citySelect实现省市区三级联动选择
2019/07/26 Javascript
vue-router路由模式详解(小结)
2019/08/26 Javascript
解决Vue动态加载本地图片问题
2019/10/09 Javascript
python在windows命令行下输出彩色文字的方法
2015/03/19 Python
PHP网页抓取之抓取百度贴吧邮箱数据代码分享
2016/04/13 Python
Python如何使用PIL Image制作GIF图片
2020/05/16 Python
Python pandas对excel的操作实现示例
2020/07/21 Python
DHC中国官方购物网站:日本通信销售No.1化妆品
2016/08/20 全球购物
如何提高JDBC的性能
2013/04/30 面试题
成人毕业生自我鉴定
2013/10/18 职场文书
两只小狮子教学反思
2014/02/05 职场文书
扩大国家免疫规划实施方案
2014/03/21 职场文书
工商行政处罚决定书
2015/06/24 职场文书
简单实现一个手持弹幕功能+文字抖动特效
2021/03/31 HTML / CSS
Python中seaborn库之countplot的数据可视化使用
2021/06/11 Python
Python中npy和mat文件的保存与读取
2022/04/24 Python