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 相关文章推荐
分享一个自定义的console类 让你不再纠结JS中的调试代码的兼容
Apr 20 Javascript
JS和Jquery获取和修改label的值的示例代码
Jan 15 Javascript
javascript获取函数名称、函数参数、对象属性名称的代码实例
Apr 12 Javascript
Jquery修改页面标题title其它JS失效的解决方法
Oct 31 Javascript
JavaScript使用setTimeout实现延迟弹出警告框的方法
Apr 07 Javascript
JavaScript中利用Array和Object实现Map的方法
Jul 27 Javascript
jquery中表单 多选框的一种巧妙写法
Sep 06 Javascript
解析Node.js异常处理中domain模块的使用方法
Feb 16 Javascript
微信小程序 详解下拉加载与上拉刷新实现方法
Jan 13 Javascript
Vue2.X和Vue3.0数据响应原理变化的区别
Nov 07 Javascript
Vue实现浏览器打印功能的代码
Apr 17 Javascript
Node Mongoose用法详解【Mongoose使用、Schema、对象、model文档等】
May 13 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数组索引的Key加引号和不加引号的区别
2014/08/19 PHP
php 类自动载入的方法
2015/06/03 PHP
PHP环境中Memcache的安装和使用
2015/11/05 PHP
PHP页面跳转实现延时跳转的方法
2016/12/10 PHP
YII2框架中excel表格导出的方法详解
2017/07/21 PHP
Jquery拖拽并简单保存的实现代码
2010/11/28 Javascript
JavaScript中的私有/静态属性介绍
2012/07/26 Javascript
js代码实现随机颜色的小方块
2015/07/30 Javascript
jQuery中的ajax async同步和异步详解
2015/09/29 Javascript
js利用for in循环获取 一个对象的所有属性以及值的实例
2017/03/30 Javascript
纯js实现页面返回顶部的动画(超简单)
2017/08/10 Javascript
Three.js基础学习教程
2017/11/16 Javascript
微信小程序使用radio显示单选项功能【附源码下载】
2017/12/11 Javascript
vue-cli webpack2项目打包优化分享
2018/02/07 Javascript
JS箭头函数和常规函数之间的区别实例分析【 5 个区别】
2020/05/27 Javascript
在Docker上部署Python的Flask框架的教程
2015/04/08 Python
利用Python的装饰器解决Bottle框架中用户验证问题
2015/04/24 Python
Python中的anydbm模版和shelve模版使用指南
2015/07/09 Python
使用Python编写简单的端口扫描器的实例分享
2015/12/18 Python
使用python编写监听端
2018/04/12 Python
提升Python程序性能的7个习惯
2019/04/14 Python
Numpy之reshape()使用详解
2019/12/26 Python
检测浏览器是否支持html5视频的代码
2013/03/28 HTML / CSS
详解快速开发基于 HTML5 网络拓扑图应用
2018/01/08 HTML / CSS
Tea Collection官网:一家位于旧金山的童装公司
2020/08/07 全球购物
介绍一下JNDI的基本概念
2013/07/26 面试题
实习自我鉴定模板
2013/09/28 职场文书
电子商务应届生自我鉴定
2014/01/13 职场文书
在校大学生的职业生涯规划书
2014/03/14 职场文书
教师职业道德事迹材料
2014/08/18 职场文书
无犯罪记录证明
2014/09/19 职场文书
长江三峡导游词
2015/01/31 职场文书
学习十八大的感悟
2015/08/11 职场文书
学习型家庭事迹材料(2016精选版)
2016/02/29 职场文书
52条SQL语句教你性能优化
2021/05/25 MySQL
一文彻底理解js原生语法prototype,__proto__和constructor
2021/10/24 Javascript