长沙嘟哥
长沙嘟哥
  • 发布:2016-01-22 10:24
  • 更新:2018-10-30 09:21
  • 阅读:19211

MUI+vue.js在采用ajax方式读入数据后,无法激活slide插件的滑动行为

分类:MUI

我在mui+vue.js构建一个slide-pic组件,图片数据用ajax方式获取,vm数据能获取到,dom也发生了相应的改变。但数据读入后,无法激活slide组件的滑动行为。

以下是我做的一些探索:
直接使用vue初始化数据(非ajax)可以激活滑动行为。
使用jquery的append方式,把数据结合到dom后,也可以激活。
我将mui的slide-pic组件换成另一个滑动图插件TouchSlide1.1后,同样的现象,用vm方式无法激活。

请问这是什么原因?到底是vue还是mui/TouchSlide 插件机制的问题。
部分代码如下:

以下是无法激活滑动的主要代码:  

<div id="slider" class="mui-slider" >  
     <div class="mui-slider-group">  
       <div class="mui-slider-item" v-for="el in list"><img :src="el.picUrl"> </div>  
     </div>  
</div>  

<script>  
var vm = new Vue({  
  el: '#slider',  
  data: {list: [] }  
});  

// 读取图片slide  
mui.ajax({ url: "shopData/slidePic.json", dataType: "json",  
     success: function(data){  
          vm.list = data.list;  
          mui("#slider").slider({  
               interval: 3000  
          });  
     }  
});  
</script>  
----------------------------------------------  
以下是可以成功激活的代码:  

mui.ajax({ url: "shopData/slidePic.json", dataType: "json",  
     success: function(data){  
          for (var i = 0; i < data.list.length; i++) {  
               $(".mui-slider-group").append(  
                    '<div class="mui-slider-item" ><img src="'+ data.list[i].picUrl + '"> </div>'  
               );  
          }  

          mui("#slider").slider({  
               interval: 3000  
          });  
     }  

});  
2016-01-22 10:24 负责人:无 分享
已邀请:
1***@qq.com

1***@qq.com

这个问题坑了 好久。
解决方法 是
在 Vue的生命周期钩子:updated 中
执行

mui("#slider").slider({  
               interval: 3000  
          });

而在nextTick 主动渲染 Dom后,是无法获取到 mui(#slider)对象的。

代码如下:

updated: function() {  
                var sliderMuiObj = mui("#slider");  
                sliderMuiObj.slider({  
                    interval: 3000  
                });  
            },
  • 幽壑潜蛟

    你弄成功了?我这边依然没有成功。

    2017-04-13 11:34

  • 杰哥seo

    成功了

    2017-06-21 12:39

幽壑潜蛟

幽壑潜蛟

我使用了官方示例代码中的方法。用定时器等待。依然无法滚动起来。
//幻灯片等待
var sliderWait = setInterval(function() {
//调试
//console.log('幻灯片状态:' + pageModel.sliderReady);
if (pageModel.sliderReady) {
//调试
console.log('可以执行幻灯片了'+ mui('#slider').length);
console.log(document.getElementsByClassName('mui-slider-item').length); //这里可以看到已经加进去了有6个元素

                //清除定时器  
                clearInterval(sliderWait);  
                mui('#slider').slider({  
                    interval: 3000 //自动播放周期  
                });  
            }  
        }, 100);
幽壑潜蛟

幽壑潜蛟

//幻灯片等待  
            var sliderWait = setInterval(function() {  
                //调试  
                //console.log('幻灯片状态:' + pageModel.sliderReady);  
                if (pageModel.sliderReady) {  
                    //调试  
                    console.log('可以执行幻灯片了'+ mui('#slider').length);  
                    console.log(document.getElementsByClassName('mui-slider-item').length);  //这里可以看到已经加进去了有6个元素  

                    //清除定时器  
                    clearInterval(sliderWait);  
                    mui('#slider').slider({  
                        interval: 3000 //自动播放周期  
                    });  
                }  
            }, 1000);
杰哥seo

杰哥seo

mark 这是解决办法

b***@163.com

b***@163.com

我的解决了,给大家分享一下,根本不需要写什么updated,

DCloud_UNI_FXY

DCloud_UNI_FXY

vue默认模式是异步渲染。就是你修改了data之后,不是立刻开始渲染DOM结构,而是异步执行。

 // 修改数据  
 vm.list = data.list;  
      // DOM 还没有更新  
      vm.$nextTick(function () {  
        // DOM 现在更新了  
 mui("#slider").slider({  
               interval: 3000  
          });  
      })
  • 1***@qq.com

    现在用vue2.0,这种方式不管用了,能不能提供别的思路呢?

    2017-03-08 11:16

  • b***@163.com

    官方就是这么解决问题的吗,失望

    2018-10-30 09:10

该问题目前已经被锁定, 无法添加新回复