在nuxt2中使用swiper的坑

在nuxt2中使用swiper的坑

手中的vue2项目因为说后期要做SEO ,所以从CSR 转为SSR ,在进行迁移的过程中,发现首页的轮播图组件Swiper 一直报错,所以记录下来
备注:vue-awesome-swiper版本号是3.1.3

Window is not defined

报错原因是因为swiper 组件代码环境是客户端,但是他跑在了服务端脚本中所以会报错

解决方法有两种,第一种就是使用

arduino 复制代码
if (process-client) {
    // 需要跑在客户端的代码
}

还可以用<no-ssr></no-ssr>标签包裹

xml 复制代码
<no-ssr>
    <swiper />
</no-ssr>

第三种就是通过nuxt.config.js进行引入配置

  1. 先在根目录的plugin文件夹创建vue-swiper.js
javascript 复制代码
// vue-swiper.js
import Vue from 'vue'
if (process.browser) {
  const VueAwesomeSwiper = require("vue-awesome-swiper/dist/ssr");
  Vue.use(VueAwesomeSwiper);
}
  1. 之后再nuxt.config.js中进行引入配置
arduino 复制代码
// nuxt.config.js
export default {
    plugin: [
        '@/plugins/vue-swiper'
    ],
    css: [
        'swiper/dist/css/swiper.css'
    ]
}

注意:在nuxt中使用swiper不能以组件形式引入了,需要使用div配合class的方式引入

引用自vue-awesome-swiper官方
github.com/surmon-chin...

xml 复制代码
<template>
  <div v-swiper:mySwiper="swiperOption" @someSwiperEvent="callback">
    <div class="swiper-wrapper">
      <div class="swiper-slide" v-for="banner in banners">
        <img :src="banner">
      </div>
    </div>
    <div class="swiper-pagination"></div>
  </div>
</template>

<script>
  export default {
    data () {
      return {
        banners: [ '/1.jpg', '/2.jpg', '/3.jpg' ],
        swiperOption: {
          pagination: {
            el: '.swiper-pagination'
          },
          // some swiper options...
        }
      }
    },
    mounted() {
      setTimeout(() => {
        this.banners.push('/4.jpg')
        console.log('banners update')
      }, 3000)
      console.log(
        'This is current swiper instance object', this.mySwiper, 
        'It will slideTo banners 3')
      this.mySwiper.slideTo(3, 1000, false)
    }
  }
</script>

发现swiper中的配置项失效

发现轮播图不会自动播放,并且样式不对,应该是配置项失效了

但是当代码中更改后并保存,页面中效果会恢复正常,刷新后再次失效,后端返回的图片也可以正常显示

测试后发现如果用本地图片不会出现问题,应该是获取到后端图片后swiper没有重新进行初始化

使用配置项中的observe相关属性配置后发现问题依然无法解决

所以采用watch配合v-if让组件重新加载

xml 复制代码
<template>
  <div v-swiper:mySwiper="swiperOption" v-if="isShow">
    <div class="swiper-wrapper banner">
      <div class="swiper-slide item" v-for="(item,i) in banners" :key="i">
        <img class="swiper-img"  :src="item.imgUrl" :class="{active:currentIndex === i}" @click="itemClick(i)">
      </div>
    </div>
  </div>
</template>

<script>
export default {
  props: {
    banners: {
      type: Array,
      default: () => []
    }
  },
  data() {
    return {
      isShow: false
    }
  },
  watch() {
    // 后端传值过来后banners的值发生变化,触发v-if
    banners() {
      this.isShow = true
    }
  }
}
</script>
相关推荐
不会敲代码15 小时前
手写 Zustand:三十分钟带你搞懂状态管理库的核心原理
前端·javascript·源码
神奇的程序员5 小时前
重构了自己5年前写的截图插件
前端·javascript·架构
UXbot7 小时前
一人独立交付 UI + 前端:AI 驱动 UI 设计工具的五大功能模块深度评测
前端·低代码·ui·设计模式·交互
kobesdu7 小时前
【ROS2实战笔记-19】ROS2 生命周期节点的启动顺序、状态转换陷阱与热备方案
java·前端·笔记·机器人·ros·ros2
诚实可靠王大锤7 小时前
React Native 输入框与按钮焦点冲突解决方案(rn版本0.70.3)
前端·javascript·react native·react.js
kyriewen7 小时前
测试妹子让我写单测,我偷偷用AI一天干完一周的活
前端·chatgpt·cursor
2601_957780848 小时前
Claude Code 2026年最新部署指南:从环境搭建到技能扩展
前端·人工智能·ai编程·claude
zhangfeng11338 小时前
workbuddy 专家 “前端开发师” 结合nvidia-mistral-small-4-119b-2603 项目计划-前端界面开发.md
前端·人工智能·免费
IT_陈寒10 小时前
为什么Java的Stream并行处理反而变慢了?
前端·人工智能·后端
NiceCloud喜云10 小时前
IntelliJ IDEA 保姆级安装 + ClaudeAPI 配置教程
java·开发语言·前端·ide·chrome·docker·intellij-idea