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 实现自动轮播。同时,代码中考虑了内存管理,避免内存泄漏。如果需要进一步提升用户体验,可以添加过渡效果和手动切换功能。

相关推荐
一袋米扛几楼985 分钟前
【网络安全】SIEM -Security Information and Event Management 工具是什么?
前端·安全·web安全
小陈工17 分钟前
2026年4月7日技术资讯洞察:下一代数据库融合、AI基础设施竞赛与异步编程实战
开发语言·前端·数据库·人工智能·python
Cobyte26 分钟前
3.响应式系统基础:从发布订阅模式的角度理解 Vue2 的数据响应式原理
前端·javascript·vue.js
竹林81829 分钟前
从零到一:在React前端中集成The Graph查询Uniswap V3池数据实战
前端·javascript
Mintopia36 分钟前
别再迷信"优化":大多数性能问题根本不在代码里
前端
倾颜37 分钟前
接入 MCP,不一定要先平台化:一次 AI Runtime 的实战取舍
前端·后端·mcp
军军君0139 分钟前
Three.js基础功能学习十八:智能黑板实现实例五
前端·javascript·vue.js·3d·typescript·前端框架·threejs
恋猫de小郭39 分钟前
Android 上为什么主题字体对 Flutter 不生效,对 Compose 生效?Flutter 中文字体问题修复
android·前端·flutter
Moment41 分钟前
AI全栈入门指南:一文搞清楚NestJs 中的 Controller 和路由
前端·javascript·后端
禅思院42 分钟前
前端架构演进:基于AST的常量模块自动化迁移实践
前端·vue.js·前端框架