swiper动态渲染数据无法左右滑动(vue)

这个问题,真的,找了好久解决方案,终于解决成功了,

首先问题描述,
本来是用的静态数据,swiper渲染没有问题,

items: [
                   {url: '111',name:'name1'},
                   {url: '222',name:'name2'},
                   {url: '333',name:'name3'},
                   {url: '444',name:'name4'},
                   {url: '555',name:'name5'},
                   {url: '666',name:'name6'},
                   {url: '777',name:'name7'},
                   {url: '888',name:'name8'},
                   {url: '999',name:'name9'},
                   {url: '000',name:'name10'}

              ],

后期,动态获取数据:

getDeviceList () {      
    getList({}).then((res) => {                           // 获取所有设备
        this.items = res.data;                              
    }).catch((err) => {
        console.error(err);
              });
 },
const itemsLength = this.items.length;
for (let i = 0; i < itemsLength; i += 4) {         //四画面轮播
        this.pages.push(this.items.slice(i, i + 4));
}

发现this.pages始终获取不到this.items的值,swiper渲染不到任何数据,
后来经同事指导,同事说因为数据请求时异步,因此,for循环应该放在getList方法体中:

    getDeviceList () {
        getList({}).then((res) => {                           // 获取所有设备
            this.items = res.data;
            const itemsLength = this.items.length;
            for (let i = 0; i < itemsLength; i += 4) {         //四画面轮播
                this.pages.push(this.items.slice(i, i + 4));
            }           
        ).catch((err) => {
            console.error(err);
    });
  },

这样之后swiper可以渲染数据了,但是我又发现,画面不轮播了,并且也拖不动,四处寻找答案,大致分以下两种方法:
1.在获取数据之后立即对swiper初始化:

  getDeviceList () {
      getList({}).then((res) => {                           // 获取所有设备
          this.items = res.data;
          const itemsLength = this.items.length;
          for (let i = 0; i < itemsLength; i += 4) {         //四画面轮播
              this.pages.push(this.items.slice(i, i + 4));
          }
          let mySwiper = new Swiper('.swiper-container', {
                  autoplay: {
                      delay: 5000,      // 5秒切换一次
                  },
                  loop: true,    //循环
                  allowTouchMove: false, // 不允许鼠标拖动
                  preventClicks: false,//默认true               
              });
              }).catch((err) => {
                  console.error(err);
              });
          },

2.在初始化swiper的时候加上以下两行代码:

let mySwiper = new Swiper('.swiper-container', {                
     observer:true,//修改swiper自己或子元素时,自动初始化swiper
    observeParents:true,//修改swiper的父元素时,自动初始化swiper

});

亲测,第一种方法反正还是不可以滑动,第二种方法可以滑动,但是切换的时候第一条数据不显示,不知道为什么,
后来参考这个博客完美解决:

https://blog.csdn.net/zhanghuiqi205/article/details/79662586

贴上代码:

methods: {

            carousel () {                                             // swiper
                let mySwiper = new Swiper('.swiper-container', {
                    autoplay: {
                        delay: 5000,      // 5秒切换一次
                    },
                    loop: true,    //循环
                    allowTouchMove: false, // 不允许鼠标拖动
                    preventClicks: false,//默认true
                    autoplayDisableOnInteraction: false,                    
                });
                //鼠标覆盖停止自动切换
                mySwiper.el.onmouseover = function () {
                    mySwiper.autoplay.stop();
                };
                //鼠标移开开始自动切换
                mySwiper.el.onmouseout = function () {
                    mySwiper.autoplay.start();
                };
            },

            getDeviceList () {
                let that = this;
                getList({}).then((res) => {                           // 获取所有设备
                    this.items = res.data;
                    const itemsLength = this.items.length;
                    for (let i = 0; i < itemsLength; i += 4) {         //四画面轮播
                        this.pages.push(this.items.slice(i, i + 4));
                    }
                    that.$nextTick(function () {
                        that.carousel();
                    })

                }).catch((err) => {
                    console.error(err);
                });
            }
}

    mounted () {
            this.$nextTick(function () {
                this.getDeviceList();
                this.carousel();
            })
        }

刚刚接触vue,对$nextTick()函数还不了解,日后补上。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 176,323评论 25 709
  • 谢谢作者的文章 非常喜欢 请允许收藏! 博客园首页博问闪存新随笔订阅管理 vue之better-scroll的封装...
    peng凯阅读 16,645评论 2 5
  • 好久没落笔了,好久没成文,曾经我的文章还是别人竖拇指的对象,我以它为荣,可在去年的考试上,我却下笔无神!如今...
    Believemys_4282阅读 2,286评论 0 0
  • / ViewController.m //访问系统相册 // // Created by lanou on 16/...
    妳要等我阅读 1,850评论 0 2
  • kin143 宇宙的蓝夜 今早又做了梦,梦到自己变回了初中生或者再小一点。 当时自己新买了一件衣服,刚一买回来自己...
    亦纹kira阅读 2,087评论 0 2

友情链接更多精彩内容