Vue3 - 关于导航切换的路由使用keep-alive,页面切换回来,轮播图自动播放失效的问题

148 阅读2分钟

一、在使用NutUI(Vue3版本)组件库开发练习时,遇到了路由使用keep-alive时,页面切换回来,轮播图自动播放失效的问题,轮播图就卡着不动了的情况,上网搜索相关解决的方法,在借鉴了 vue keep-alive配合swiper的问题(转载)_swiper10 keep-alive-CSDN博客 的文章之后得到了问题的解决,具体如下代码:

<script lang="ts" setup>
import { ref, onActivated, onDeactivated } from 'vue'
const isKeep = ref(true)  // 充当标识符的作用,用于排除轮播图不受keep-alive的影响
const list = ref([
  'https://yourpic.png',
  'https://yourpic.png',
  'https://yourpic.png',
  'https://yourpic.png'
])  // 轮播图图片列表(图片地址)

/**
 * 利用钩子函数的创建时机来解决页面受到 <keep-alive> 影响后轮播图不自动播放的问题
 * 其次使用v-if来实现当组件切换过程中轮播图组件的被销毁与重建,从而达到不受keep-alive的影响
 */
onActivated(() => {
    isKeep.value = true  // keep-alive组件 激活
})

onDeactivated(() => {
    isKeep.value = false // keep-alive组件 非激活
})

</script>

<template>
    <!-- nut-swiper组件具体的API可以到NutUI的官网查看 -->
    <!-- 重点:在组件上添加 v-if="isKeep" -->
    <nut-swiper
        v-if="isKeep"
        :init-page="0"
        :auto-play="3000"
        pagination-visible
        pagination-color="#426543"
        pagination-unselected-color="#808080"
    >
        <nut-swiper-item v-for="(item, index) in list" :key="index" style="height: 150px">
            <img :src="item" alt="" style="height: 100%; width: 100%" draggable="false" />
        </nut-swiper-item>
    </nut-swiper>
</template>


<style scoped>

</style>

二、上述解决了轮播图自动播放失效的问题,但是每一次切换回到原来有轮播图的组件,轮播图都是从第一张图片从头开始轮播,可不可以实现切换回原来有轮播图的组件后,轮播图从切换组件前的图片,以此开始轮播呢。由此,对代码进行了相应了修改,实现最终效果:

<script lang="ts" setup>
import { ref, onActivated, onDeactivated } from 'vue'
const initIndex = ref(0)  // 记录轮播图的索引值
const isKeep = ref(true)  // 充当标识符的作用,用于排除轮播图不受keep-alive的影响
const list = ref([
  'https://yourpic.png',
  'https://yourpic.png',
  'https://yourpic.png',
  'https://yourpic.png'
])  // 轮播图图片列表(图片地址)

/**
 * 利用钩子函数的创建时机来解决页面受到 <keep-alive> 影响后轮播图不自动播放的问题
 * 其次使用v-if来实现当组件切换过程中轮播图组件的被销毁与重建,从而达到不受keep-alive的影响
 */
onActivated(() => {
    isKeep.value = true  // keep-alive组件 激活
})

onDeactivated(() => {
    isKeep.value = false // keep-alive组件 非激活
})

// 将切换组件前的index索引值记录下来,下次切换回原来的组件时,依然是之前切换组件的index
const onChange = (index) => {
    initIndex.value = index  
}
</script>

<template>
    <!-- nut-swiper组件具体的API可以到NutUI的官网查看 -->
    <!-- 重点:在组件上添加 v-if="isKeep",其次添加@change="onChange" -->
    <nut-swiper
        v-if="isKeep"
        :init-page="initIndex"
        :auto-play="3000"
        pagination-visible
        pagination-color="#426543"
        pagination-unselected-color="#808080"
        @change="onChange"
    >
        <nut-swiper-item v-for="(item, index) in list" :key="index" style="height: 150px">
            <img :src="item" alt="" style="height: 100%; width: 100%" draggable="false" />
        </nut-swiper-item>
    </nut-swiper>
</template>


<style scoped>

</style>

感想:遇到问题不要怕,先思考;不行再去上网搜,网上相关文章结合思考再出发,再多的问题也不怕。

一起学习,共同进步哈