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 相关文章推荐
JS维吉尼亚密码算法实现代码
Nov 09 Javascript
基于javascript实现精确到毫秒的倒计时限时抢购
Apr 17 Javascript
jQuery mobile的header和footer在点击屏幕的时候消失的解决办法
Jul 01 Javascript
jQuery增加、删除及修改select option的方法
Aug 19 Javascript
单行 JS 实现移动端金钱格式的输入规则
May 22 Javascript
vue下跨域设置的相关介绍
Aug 26 Javascript
Vue中android4.4不兼容问题的解决方法
Sep 04 Javascript
JS实现动态无缝轮播
Jan 11 Javascript
node事件循环和process模块实例分析
Feb 14 Javascript
vue 出现data-v-xxx的原因及解决
Aug 04 Javascript
vue项目打包后提交到git上为什么没有dist这个文件的解决方法
Sep 16 Javascript
微信小程序实现拍照和相册选取图片
May 09 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学习之输出字符串(echo,print,printf,print_r和var_dump)
2011/04/17 PHP
如何使用php判断服务器是否是HTTPS连接
2013/07/05 PHP
PHP编程中的常见漏洞和代码实例
2014/08/06 PHP
PHP Mysqli 常用代码集合
2016/11/12 PHP
centos7上编译安装php7以php-fpm方式连接apache
2018/11/08 PHP
php经典趣味算法实例代码
2020/01/21 PHP
Nigma vs Liquid BO3 第一场2.13
2021/03/10 DOTA
JS控制日期显示的小例子
2013/11/23 Javascript
javascript操作referer详细解析
2014/03/10 Javascript
首页图片漂浮效果示例代码
2014/06/05 Javascript
nodejs实现黑名单中间件设计
2014/06/17 NodeJs
javascript实现图片轮播效果
2016/01/20 Javascript
分享jQuery网页元素拖拽插件
2020/12/01 Javascript
Bootstrap选项卡与Masonry插件的完美结合
2016/07/06 Javascript
深入浅析JavaScript中的scrollTop
2016/07/11 Javascript
JQuery控制DIV的选取实现方法
2016/09/18 Javascript
nodejs 搭建简易服务器的图文教程(推荐)
2017/07/18 NodeJs
vue获取当前激活路由的方法
2018/03/17 Javascript
纯js封装的ajax功能函数与用法示例
2018/05/14 Javascript
JavaScript数据结构与算法之基本排序算法定义与效率比较【冒泡、选择、插入排序】
2019/02/21 Javascript
Python实现爬取逐浪小说的方法
2015/07/07 Python
Python中getattr函数和hasattr函数作用详解
2016/06/14 Python
浅析python继承与多重继承
2018/09/13 Python
利用CSS3的定位页面元素
2009/08/29 HTML / CSS
AHAVA美国官方网站:死海海泥护肤品牌
2016/10/18 全球购物
周仰杰(JIMMY CHOO)英国官方网站:闻名世界的鞋子品牌
2018/10/28 全球购物
酒店保安员岗位职责
2014/01/31 职场文书
餐厅采购员岗位职责
2014/03/06 职场文书
党建示范点实施方案
2014/03/12 职场文书
《大自然的语言》教学反思
2014/04/08 职场文书
企业优秀员工事迹材料
2014/05/28 职场文书
开服装店计划书
2014/08/15 职场文书
党性锻炼的心得体会
2014/09/03 职场文书
亲戚关系证明
2015/06/24 职场文书
幼儿园大班开学寄语(2016秋季)
2015/12/03 职场文书
多线程Spring通过@Scheduled实现定时任务
2022/05/25 Java/Android