zoukankan      html  css  js  c++  java
  • 解决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里是否触发相关改变的时候不重新设置一些值的清空以及获取 。

  • 相关阅读:
    DOM event beforeload
    有关点击付费的十大失误-转载
    DOM 事件DOMContentLoaded
    Git 系列之四:Git 进阶功能转载
    Qt webkit中单独编译JavaScriptCore
    搜索知识与技巧集锦转载
    webkit中DOM 事件有多少
    Git 系列之三:Windows 下 Git 配置与使用指南转载
    简历:第一章:技术亮点如何写
    实战:第十三章:工作中熬夜加班学到的
  • 原文地址:https://www.cnblogs.com/zhansu/p/6112837.html
Copyright © 2011-2022 走看看