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 29 Javascript
jQuery插件开发详细教程
Jun 06 Javascript
深入理解javascript变量声明
Nov 20 Javascript
jquery控制显示服务器生成的图片流
Aug 04 Javascript
自己动手写的javascript前端等待控件
Oct 30 Javascript
使用JavaScript脚本判断页面是否在微信中被打开
Mar 06 Javascript
javascript jquery对form元素的常见操作详解
Jun 12 Javascript
jquery checkbox无法用attr()二次勾选问题的解决方法
Jul 22 Javascript
jQuery事件blur()方法的使用实例讲解
Mar 30 jQuery
JS 5种遍历对象的方式
Jun 16 Javascript
在vue-cli3中使用axios获取本地json操作
Jul 30 Javascript
JavaScript array常用方法代码实例详解
Sep 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
解决Yii2邮件发送结果返回成功,但接收不到邮件的问题
2017/05/23 PHP
PHP+MySQL高并发加锁事务处理问题解决方法
2018/04/30 PHP
Laravel 中创建 Zip 压缩文件并提供下载的实现方法
2019/04/02 PHP
JavaScript基本对象
2007/01/11 Javascript
比较全的JS checkbox全选、取消全选、删除功能代码
2008/12/19 Javascript
Jquery 快速构建可拖曳的购物车DragDrop
2009/11/30 Javascript
javascript贪吃蛇完整版(源码)
2013/12/09 Javascript
js 采用delete实现继承示例代码
2014/05/20 Javascript
javascript实现画不相交的圆
2015/04/07 Javascript
jQuery实现的在线答题功能
2015/04/12 Javascript
个人总结的一些JavaScript技巧、实用函数、简洁方法、编程细节
2015/06/10 Javascript
基于jQuery全屏焦点图左右切换插件responsiveslides
2015/09/07 Javascript
详解JavaScript操作HTML DOM的基本方式
2015/10/21 Javascript
this,this,再次讨论javascript中的this,超全面(经典)
2016/01/05 Javascript
jQuery取得iframe中元素的常用方法详解
2016/01/14 Javascript
vuejs在解析时出现闪烁的原因及防止闪烁的方法
2016/09/19 Javascript
koa2+vue实现登陆及登录状态判断
2019/08/15 Javascript
Vue-CLI 项目在pycharm中配置方法
2019/08/30 Javascript
Angular 多级路由实现登录页面跳转(小白教程)
2019/11/19 Javascript
Python实现抓取网页并且解析的实例
2014/09/20 Python
Python自动连接ssh的方法
2015/03/07 Python
Python统计文件中去重后uuid个数的方法
2015/07/30 Python
Python中顺序表的实现简单代码分享
2018/01/09 Python
15行Python代码带你轻松理解令牌桶算法
2018/03/21 Python
使用python中的in ,not in来检查元素是不是在列表中的方法
2018/07/06 Python
python解压TAR文件至指定文件夹的实例
2019/06/10 Python
如何通过python画loss曲线的方法
2019/06/26 Python
iPython pylab模式启动方式
2020/04/24 Python
pycharm导入源码的具体步骤
2020/08/04 Python
Python Opencv实现单目标检测的示例代码
2020/09/08 Python
师生聚会感言
2014/01/26 职场文书
公司奖励通知
2015/04/21 职场文书
党员“一帮一”活动总结
2015/05/07 职场文书
2015年教务工作总结
2015/05/23 职场文书
教师节领导致辞
2015/07/29 职场文书
创业计划书之冷饮店
2019/09/27 职场文书