Vue中使用swiper.js的方法

文章介绍了在Vue中使用swiper时如何处理DOM元素创建完成后的初始化问题,提出了通过组件化、自定义指令和nextTick方法来优化swiper的初始化,以提高性能并避免频繁更新。其中,封装组件和利用组件的mounted生命周期可提高复用性,自定义指令能精确控制初始化时机,而nextTick确保在DOM更新后执行初始化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题:

在vue中使用swiper 就是不知道什么时候dom元素创建完成,我们把swiper的初始化(new swiper)最后放在了updated生命周期中,可以正常使用;但是复用性能不好,且updated时会频繁更新,会造成多次swiper初始化实例。

解决方法(以下三种):

1.封装组件,可以提高复用性,且new swiper 放在组件中的mounted 生命周期中不会影响性能;

head中引入一下文件:
   // 需要引入swiper-bundle.min.css
  <link rel="stylesheet" href="../swiper/swiper-bundle.min.css">
    // 引入swiper-bundle.min.js
  <script src="../swiper/swiper-bundle.min.js"></script>
  <script src="../vue.js"></script>


<div id="box">
    <swiper v-if="datalist.length">
      <swiper-item v-for="data in datalist" :key="data">
        <img :src="data">
      </swiper-item>
    </swiper>
</div>
*{
    margin:0;
    padding:0;
}
.swiper {
   width: 100%;
   height: 600px;
}
.swiper img{
   width: 100%;
}
//vue 2.0写法

// 轮播的每一个小box 组件
Vue.component('swiperItem',{
    template:`
        <div class="swiper-slide">
          <slot></slot>
        </div>
    `
})
//控制显示区域的大盒子 组件
Vue.component('swiper',{
    template:` <div class="swiper new_swiper">
                  <div class="swiper-wrapper">
                    <slot></slot>
                  </div>
                  <!-- 如果需要分页器 -->
                  <div class="swiper-pagination"></div> 
                </div>`,
    mounted(){
      // 现在在组件中,执行new swiper 初始化,提高复用性
      new Swiper ('.new_swiper', {
          loop: true, // 循环模式选项
          
          // 如果需要分页器
          pagination: {
            el: '.swiper-pagination',
          },
          autoplay: {
          delay: 2000,
          stopOnLastSlide: false,
          disableOnInteraction: true,
          }

        })   
    }
  })

  // vue实例初始化
  var vm = new Vue({
    el:"#box",
    data:{
      datalist:[]
    },
    mounted(){
      // 模拟ajax请求数据
      // 照片我用的本地,可以随便给一组可以访问到的照片地址数据
      setTimeout(()=>{
        this.datalist = [  
        "../images/1.jpeg",
        "../images/2.jpeg",
        "../images/3.jpeg"
        ]
      },2000);
      
    },
    updated(){
      // 以前new swiper 写在这里;复用性不好
    }

  })     

2.使用vue 中的自定义指令写法;

自定义指令的作用:通过绑定自定义指令,可以知道dom元素什么时候可以创建完成;

//头部同样需要引入相关文件
<div id="box">
    <div class="swiper new_swiper">
      <div class="swiper-wrapper">
           // vue自定义指令v-swiper 可以获取到什么时候dom 元素创建完成;
          <div class="swiper-slide" v-for="item,index in datalist" :key="item" v-swiper="{
            index:index,
            length:datalist.length
          }">
            <img :src="item">
          </div>
      </div>
      <!-- 如果需要分页器 -->
      <div class="swiper-pagination"></div>
    </div>
</div>
// vue 2.0 写法

Vue.directive('swiper',{
      // 创建一个绑定指令的dom元素,就会执行一次inserted;
       //不能直接初始化swiper,应该是创建完最后一个slide再初始化
      inserted(el,binding){
        
        // 我们让 index 等于 数据长度-1 就是就说明是最后一个dom元素了
        // 指令只能传一个值,我们想要传多个值,通过封装到对象中,然后再获取
        // es6 解构赋值
        let {index,length} = binding.value;
        //判断 是最后一个dom元素创建完成再初始化
        if(index === length-1){
          // 执行初始化
          init();
        }
      }
    })
  // vue 实例化
  var vm = new Vue({
    el:"#box",
    data:{
      datalist:[]
    },
    mounted(){
      setTimeout(()=>{
        this.datalist = [
        "../images/1.jpeg",
        "../images/2.jpeg",
        "../images/3.jpeg"
        ]
      },2000);
      
    }

  })  
  
  // swiper初始化 
  function init(){
    var mySwiper = new Swiper ('.new_swiper', {
    loop: true, // 循环模式选项
    
    // 如果需要分页器
    pagination: {
      el: '.swiper-pagination',
    },
    autoplay: {
    delay: 2000,
    stopOnLastSlide: false,
    disableOnInteraction: true,
    }

  })   
  } 

3.使用nextTick方法;

//html 代码如上
<div id="box">
    <div class="swiper new_swiper">
      <div class="swiper-wrapper">
           // vue自定义指令v-swiper 可以获取到什么时候dom 元素创建完成;
          <div class="swiper-slide" v-for="item,index in datalist" :key="item" v-swiper="{
            index:index,
            length:datalist.length
          }">
            <img :src="item">
          </div>
      </div>
      <!-- 如果需要分页器 -->
      <div class="swiper-pagination"></div>
    </div>
</div>
// 注意:这个使用了vue 3.0 写法,可以自己改
var obj = {
        data(){
          return {
            datalist:[]
          } 
        },
        mounted(){
          setTimeout(()=>{
                this.datalist = [
                    "../images/1.jpeg",
                    "../images/2.jpeg",
                    "../images/3.jpeg"
                ]

               // nextTick 用法 比updated 执行的还晚,并且只执行一次
              this.$nextTick(()=>
                //在这里执行swiper 初始化
                init();
              });
          },2000);
           
          
        }

      }

  // vue3.0写法
  var app = Vue.createApp(obj);
  
  app.mount("#box");  
  
  // swiper初始化 
  function init(){
    var mySwiper = new Swiper ('.new_swiper', {
    loop: true, // 循环模式选项
    
    // 如果需要分页器
    pagination: {
      el: '.swiper-pagination',
    },
    autoplay: {
    delay: 2000,
    stopOnLastSlide: false,
    disableOnInteraction: true,
    }

  })   

  } 

### 安装与配置 为了在 Vue 2 中集成 Swiper.js 并实现轮播效果,需先通过 npm 或 yarn 来安装 Swiper 库。执行如下命令可以完成安装: ```bash npm install swiper --save ``` 或者使用 yarn: ```bash yarn add swiper ``` 一旦安装完毕,在项目的入口文件 `main.js` 或者需要使用的单个组件内部引入 Swiper 及其样式表[^1]。 对于全局注册的方式可以在 main.js 文件中加入以下代码片段来加载 Swiper 的 CSS 和 JS 文件[^3]: ```javascript import 'swiper/swiper-bundle.css'; import Swiper from 'swiper/swiper-bundle'; Vue.prototype.$swiper = Swiper; ``` 如果仅希望局部应用,则可以直接在一个特定的 Vue 组件里导入所需的模块和样式。 ### 创建轮播容器结构 接着定义 HTML 结构用于展示轮播图,通常会创建一个 div 元素作为 Swiper 容器,并为其设置类名 `.swiper-container`;再嵌套一层 div 设置为 `.swiper-wrapper` 包裹所有的幻灯片项(即`.swiper-slide`)。例如: ```html <div class="swiper-container"> <div class="swiper-wrapper"> <!-- 单张图片 --> <div v-for="(slide, index) in slides" :key="index" class="swiper-slide"> {{ slide }} </div> </div> <!-- 如果需要分页器 --> <div class="swiper-pagination"></div> <!-- 如果需要导航按钮 --> <div class="swiper-button-prev"></div> <div class="swiper-button-next"></div> </div> ``` 上述模板中的 `slides` 是假定的数据源数组,可以根据实际情况调整数据绑定方式。 ### 初始化 Swiper 实例 最后一步是在 mounted 生命周期钩子函数中初始化一个新的 Swiper 对象实例化轮播功能。这里可以通过选项参数来自定义行为特性,比如每屏显示多少个项目、是否有循环播放等属性。下面是一个完整的例子说明如何配置这些选项: ```javascript export default { name: 'MyComponent', data() { return { slides: ['Slide 1', 'Slide 2', 'Slide 3'] } }, mounted(){ const mySwiper = new this.$swiper('.swiper-container',{ // 配置项... slidesPerView: 3, spaceBetween: -28, centeredSlides: true, loop: true, // 分页器 pagination: { el: '.swiper-pagination' }, // 上下翻页箭头 navigation: { nextEl: '.swiper-button-next', prevEl: '.swiper-button-prev', } }); // 将mySwiper挂载到this上以便后续操作 this.mySwiper = mySwiper; } } ``` 这样就成功地实现了基于 Vue 2 的 Swiper 轮播插件的应用程序开发过程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值