Vue3移动电商实战 —— 外卖移动端轮播图实现

写在前面

基于 Vue 3 实现了一个简单的轮播图功能,代码如下:

js 复制代码
<template>
   <div class="banner">
       <img v-for="(v,i) in bannerImg" :key="i" :src="`/src/assets/image/${v}`" v-show="n==i"/>
   </div>
</template>

<script setup>
import {ref,reactive,onMounted,onUnmounted} from 'vue'
import {bannerImg} from '@/utils/publicData'
let timer = null;
const n = ref(0);
// 挂载
onMounted(()=>{
    timer = setInterval(autoPlay,2000);
})
const autoPlay = ()=>{
    n.value++;
    if(n.value>=bannerImg.length){
        n.value = 0;
    }
}
// 销毁
onUnmounted(()=>{
    clearInterval(timer)
})
</script>

这段代码实现了一个简单的轮播图功能,基于 Vue 3 的 <script setup> 语法。以下是代码的总结和分析:


1. 功能概述

  • 实现了一个轮播图组件,每隔 2 秒自动切换图片。
  • 图片列表从外部引入,通过 v-for 动态渲染。
  • 使用 v-show 控制当前显示的图片。
  • 在组件挂载时启动定时器,在组件销毁时清除定时器。

2. 代码结构分析

(1)模板部分 (<template>)

vue 复制代码
<template>
   <div class="banner">
       <img v-for="(v,i) in bannerImg" :key="i" :src="`/src/assets/image/${v}`" v-show="n==i"/>
   </div>
</template>
  • v-for :遍历 bannerImg 数组,动态生成 <img> 标签。
  • :src :绑定图片路径,路径格式为 /src/assets/image/${v},其中 v 是图片文件名。
  • v-show :根据 n 的值决定是否显示当前图片。当 n == i 时,显示该图片。

(2)脚本部分 (<script setup>)

javascript 复制代码
import {ref,reactive,onMounted,onUnmounted} from 'vue'
import {bannerImg} from '@/utils/publicData'

let timer = null;
const n = ref(0);

// 挂载
onMounted(()=>{
    timer = setInterval(autoPlay,2000);
})

const autoPlay = ()=>{
    n.value++;
    if(n.value>=bannerImg.length){
        n.value = 0;
    }
}

// 销毁
onUnmounted(()=>{
    clearInterval(timer)
})
  • ref :定义响应式变量 n,用于控制当前显示的图片索引。
  • onMounted :组件挂载时启动定时器,每隔 2 秒调用 autoPlay 函数。
  • autoPlay :每次执行时,n 的值加 1,如果 n 超过图片数量,则重置为 0,实现循环轮播。
  • onUnmounted:组件销毁时清除定时器,防止内存泄漏。

3. 关键点分析

(1)图片路径

  • 图片路径通过模板字符串动态生成:/src/assets/image/${v}。
  • 需要确保 bannerImg 中的文件名与 /src/assets/image/ 目录下的文件一一对应。

(2)轮播逻辑

  • 使用 setInterval 实现自动轮播,每隔 2 秒切换一次图片。
  • 通过 n 的值控制当前显示的图片索引,当 n 超过图片数量时重置为 0,实现循环。

(3)性能优化

  • 使用 v-show 而不是 v-if,因为 v-show 只是切换 CSS 的 display 属性,不会频繁销毁和创建 DOM 元素,性能更好。

(4)内存管理

  • 在 onUnmounted 中清除定时器,避免组件销毁后定时器仍然运行,导致内存泄漏。

4. 改进建议

(1)图片路径优化

  • 如果图片较多,建议将图片路径存储在 bannerImg 中,而不是在模板中拼接路径。例如:

    javascript 复制代码
    const bannerImg = [
        require('@/assets/image/1.jpg'),
        require('@/assets/image/2.jpg'),
        // ...
    ];

    这样可以避免路径错误,同时方便管理。

(2)添加过渡效果

  • 可以为图片切换添加 CSS 过渡效果,提升用户体验。例如:

    css 复制代码
    .banner img {
        transition: opacity 0.5s;
    }
    .banner img:not([v-show]) {
        opacity: 0;
    }

(3)手动切换功能

  • 可以添加左右切换按钮,允许用户手动切换图片。

5. 总结

这段代码实现了一个简单的轮播图功能,代码结构清晰,功能完整。通过 v-for 动态渲染图片,使用 v-show 控制显示,结合 setInterval 实现自动轮播。同时,代码中考虑了内存管理,避免内存泄漏。如果需要进一步提升用户体验,可以添加过渡效果和手动切换功能。

相关推荐
lpfasd1237 小时前
node-sass 停止维护!老项目迁移 Dart Sass 完整教程
前端·rust·sass
Data analyse4569 小时前
rnweb 回放数据量太大怎么办?分片存储与断点续传的实现思路
前端·网络·算法·数据分析
xiaogai_gai9 小时前
金蝶收料通知单查询策略实战教程:从源系统拉取到中间层落地的完整路径
java·前端·数据库
环境栈笔记10 小时前
指纹浏览器 WebRTC 怎么设置?从 ICE 候选、代理出口到功能验证
前端·人工智能·后端·自动化
赵大仁11 小时前
官网性能优化实战:LCP 3.2s → 2.1s、CLS 0.107 → 0,以及被我推翻的 6 个判断
前端·性能优化·cls·lcp·core web vitals
xiancai_xianyu11 小时前
Text2SQL落地生产库前,SQL要过哪三道闸
前端·数据库·sql·sql注入·text2sql·ai agent开发·企业级ai框架
小羊没烦恼!11 小时前
T-SQL查询进阶--理解SQL SERVER中的分区表
服务器·开发语言·前端·javascript·html
史瓦辛格11 小时前
给 DeepSeek Harness 写费用插件:把「这次会话花了多少钱」算准
前端·deepseek
星光不问赶路人11 小时前
Vue 3 + TypeScript 中 enum 的使用实践
前端·vue.js
鸥梨菌Honevid11 小时前
UVM 中 REQ 和 RSP 类型详解:从通信模型到 item_done 与 put_response
java·前端·servlet