JavaScript

超轻量级php框架startmvc

如何解决vue与传统jquery插件冲突

更新时间:2020-05-01 01:00:01 作者:startmvc
本篇文章主要介绍了如何解决vue与传统jquery插件冲突,小编觉得挺不错的,现在分享给大家

本篇文章主要介绍了如何解决vue与传统jquery插件冲突,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

比如基于jquery的select2插件,在vue下单独用有很多问题,其实对于这类插件,可以用vue的自定义指令和组件来包装,解决冲突的问题。引用官方vue1.0和2.0的两个例子,学习一下。

 例子1.0  例子2.0

大功告成。说说基于vue1的,对于下拉单选,用vue官方的例子即可,对于多选,看下面自己写的,核心是用指令对象的el、vm等获取被select2改变后的select下拉列表的相应对象,关键点是用jquery包装原生元素后用.val()获取多选值。


<body>
 <div id="el">
 <p>Selected: {{selected}}</p>
 <select v-select3="selected" multiple class="app1" >
 <option value="0">default</option>
 <option v-for="o in options" :value="o.id">{{ o.text }}</option>
 </select>
 
 <p>Selected: {{market}}</p>
 <select v-select3="market" multiple class="app2" >
 <option value="0">default</option>
 <option v-for="o in markets" :value="o.id">{{ o.text }}</option>
 </select>
 </div>
 <script>
 Vue.directive('select3', {
 twoWay: true,
 priority: 1000,

 params: ['options'],
 
 bind: function () {
 var self = this;
 $(this.el)
 .select2()
 .on('change', function () {
 self.set($(self.el).val());
 console.log($(self.el).val());
 if ( self.expression == 'selected') {
 self.vm.market = [];
 }

 })
 },
 update: function (value) {
 
 $(this.el).val(value).trigger('change')
 },
 unbind: function () {
 $(this.el).off().select2('destroy')
 }
 })

 var vm = new Vue({
 el: '#el',
 data: {
 selected: 0,
 market: '',
 options: [
 { id: 1, text: 'hello' },
 { id: 2, text: 'what' }
 ],
 markets: [
 { id: 1, text: '文山二手车' },
 { id: 2, text: '小哥二手车' }
 ]
 }
 });
 setTimeout(function () {
 vm.market = 0;
 }, 0);
 </script>
</body>

另外,在插入默认值的时候,注意做一个异步插入,因为vue更新页面是异步的,这里做了一个setTimeout( , 0)。

另外在单页里,考虑在SSpa的show的时候,设置一状态位vm.isInit,表示若是初始化默认选项,判断onchange里是否触发相关改变的时候不重新设置一些值的清空以及获取 。

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

vue jquery 冲突 vue.js jquery冲突 vue和jquery插件冲突