Vue.js列表渲染绑定jQuery插件的正确姿势


Posted in jQuery onJune 29, 2017

使用v-for绑定列表时,有时候需要绑定如select2之类的jQuery插件。

需要在Vue根据数组内容生成dom元素之后,去找到该dom元素,然后 $().xxx绑定jQuery插件。

之前使用Vue.nextTick方法,在一次dom更新以后执行延迟回调,渲染jQuery插件。

然而这并不是一种很好的方式,有时候难以确定dom元素更新是否是我们需要关注的那个。 

在列表中渲染Jquery插件的正确姿势,是使用自定义指令。自定义指令提供了一些钩子函数,可以准确的监听到dom元素与数据的绑定周期。

钩子函数

指令定义函数提供了几个钩子函数(可选):

bind: 只调用一次,指令第一次绑定到元素时调用,用这个钩子函数可以定义一个在绑定时执行一次的初始化动作。

inserted: 被绑定元素插入父节点时调用(父节点存在即可调用,不必存在于 document 中)。

update: 被绑定元素所在的模板更新时调用,而不论绑定值是否变化。通过比较更新前后的绑定值,可以忽略不必要的模板更新(详细的钩子函数参数见下)。

componentUpdated: 被绑定元素所在模板完成一次更新周期时调用。

unbind: 只调用一次, 指令与元素解绑时调用。

接下来我们来看一下钩子函数的参数 (包括 el,binding,vnode,oldVnode) 。

钩子函数参数

钩子函数被赋予了以下参数:

el: 指令所绑定的元素,可以用来直接操作 DOM 。

binding: 一个对象,包含以下属性:

  • name: 指令名,不包括 v- 前缀。
  • value: 指令的绑定值, 例如: v-my-directive="1 + 1", value 的值是 2。
  • oldValue: 指令绑定的前一个值,仅在 update 和 componentUpdated 钩子中可用。无论值是否改变都可用。
  • expression: 绑定值的字符串形式。 例如 v-my-directive="1 + 1" , expression 的值是 "1 + 1"。
  • arg: 传给指令的参数。例如 v-my-directive:foo, arg 的值是 "foo"。
  • modifiers: 一个包含修饰符的对象。 例如: v-my-directive.foo.bar, 修饰符对象 modifiers 的值是 { foo: true, bar: true }。

vnode: Vue 编译生成的虚拟节点,查阅 VNode API 了解更多详情。

oldVnode: 上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用。 

例子

<table id="testTable">
  <tr v-for="(el, lineIndex) in lines" v-line-inserted="lineIndex" >
   <td>
    <input name="bindSelect2" />
   <td>
  </tr>
</table>
function renderLines(el, lineIndex){
  //渲染select2
  $("testTable tr").eq(lineIndex).select2({...});
}

Vue.directive('line-inserted', {
  inserted: function (el, binding) {
   var lineIndex = binding.value;
   renderLines(el, lineIndex);
  }
});

详情参见Vue官方文档自定义指令

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

jQuery 相关文章推荐
jQuery插件FusionCharts绘制的3D环饼图效果示例【附demo源码】
Apr 02 jQuery
jQuery Ajax使用FormData上传文件和其他数据后端web.py获取
Jun 11 jQuery
jQuery使用ajax_动力节点Java学院整理
Jul 05 jQuery
基于jQuery的$.getScript方法去加载javaScript文档解析
Nov 08 jQuery
webpack写jquery插件的环境配置
Dec 21 jQuery
JQuery元素快速查找与操作
Apr 22 jQuery
jQuery实现的简单获取索引功能示例
Jun 04 jQuery
jQuery使用动画队列自定义动画操作示例
Jun 16 jQuery
jquery ajax加载数据前台渲染方式 不用for遍历的方法
Aug 09 jQuery
jquery实现联想词搜索框和搜索结果分页的示例
Oct 10 jQuery
基于 jQuery 实现键盘事件监听控件
Apr 04 jQuery
jQuery实现开关灯效果
Aug 02 jQuery
基于jQuery实现的Ajax 验证用户名唯一性实例代码
Jun 28 #jQuery
jQuery、layer实现弹出层的打开、关闭功能
Jun 28 #jQuery
各种选择框jQuery的选中方法(实例讲解)
Jun 27 #jQuery
基于jQuery封装的分页组件
Jun 26 #jQuery
jQuery.Form实现Ajax上传文件同时设置headers的方法
Jun 26 #jQuery
jQuery实现一个简单的验证码功能
Jun 26 #jQuery
jQuery+C#实现参数RSA加密传输功能【附jsencrypt.js下载】
Jun 26 #jQuery
You might like
用在PHP里的JS打印函数
2006/10/09 PHP
PHP 用数组降低程序的时间复杂度
2009/12/04 PHP
关于PHP的相似度计算函数:levenshtein的使用介绍
2013/04/15 PHP
php调用Google translate_tts api实现代码
2013/08/07 PHP
ThinkPHP行为扩展Behavior应用实例详解
2014/07/22 PHP
php通过curl模拟登陆DZ论坛
2015/05/11 PHP
php制作圆形用户头像的实例_自定义封装类源代码
2017/09/18 PHP
tp5(thinkPHP5框架)使用DB实现批量删除功能示例
2019/05/28 PHP
JAVASCRIPT style 中visibility和display之间的区别
2010/01/22 Javascript
jquery $.ajax各个事件执行顺序
2010/10/15 Javascript
js 获取和设置css3 属性值的实现方法
2013/05/06 Javascript
js设置cookie过期当前时间减去一秒相当于立即过期
2014/09/04 Javascript
JavaScript使用cookie记录临时访客信息的方法
2015/04/07 Javascript
uploadify多文件上传参数设置技巧
2015/11/16 Javascript
Node.js调试技术总结分享
2017/03/12 Javascript
Vuex模块化实现待办事项的状态管理
2017/03/15 Javascript
mongoose中利用populate处理嵌套的方法
2017/05/26 Javascript
vue项目首屏打开速度慢的解决方法
2019/03/31 Javascript
js变量值传到php过程详解 将php解析成数据
2019/06/26 Javascript
详解vue-video-player使用心得(兼容m3u8)
2019/08/23 Javascript
JavaScript this在函数中的指向及实例详解
2019/10/14 Javascript
vue脚手架项目创建步骤详解
2021/03/02 Vue.js
[03:07]完美世界DOTA2联赛PWL DAY10 决赛集锦
2020/11/11 DOTA
python实现基于SVM手写数字识别功能
2020/05/27 Python
python模拟菜刀反弹shell绕过限制【推荐】
2019/06/25 Python
Flask模板引擎之Jinja2语法介绍
2019/06/26 Python
python实现指定ip端口扫描方式
2019/12/17 Python
在python中修改.properties文件的操作
2020/04/08 Python
pyinstaller将含有多个py文件的python程序做成exe
2020/04/29 Python
毕业自我评价
2014/02/05 职场文书
清明节扫墓活动方案
2014/03/02 职场文书
大一学生职业生涯规划
2014/03/11 职场文书
捐资助学倡议书
2014/04/15 职场文书
小学教师师德整改措施
2014/09/29 职场文书
2016公司年会主持词
2015/07/01 职场文书
Vue接口封装的完整步骤记录
2021/05/14 Vue.js