Vue3移动端外卖小程序的搭建 与购物车功能的实现!

移动端与pc端不同,需要更多的考虑em,rem的单位转化,各个手机型号完美适配。对新手而言,这是一个难点。接下来我将以一个外卖移动端为例子进行讲解。

目录

一、屏幕的适配插件

二、预编译器

三、pinia实现购物车功能

1、商品总数

2、单个商品个数增加

3、单个商品个数减少

4、总价

5、清空购物车


一、屏幕的适配插件

1、安装

  •  postcss-pxtorem:这个插件的作用是将CSS中的像素单位(px)转换为相对于根元素字体大小的rem单位。这样做的好处是,它可以帮助开发者创建响应式设计,使得在不同设备上显示的元素大小可以根据屏幕大小进行缩放。
  • amfe-flexible:这个插件是阿里巴巴的一个前端团队开发的,它的作用是让移动端页面的尺寸单位统一为rem,并且可以方便地在不同设备上进行适配。它通过修改根元素的font-size来实现这一点。
npm i postcss-pxtorem@5.1.1 amfe-flexible -S

2、vite.config.js配置

  • postcssPxtorem():这是调用postcss-pxtorem插件的地方。
  • rootValue: 16:这个选项指定了根元素(html元素)的字体大小,这里设置为16px。这意味着1rem等于16px。
  • propList: ["*"]:这个选项指定了需要转换为rem单位的CSS属性列表。这里使用["*"]表示所有属性都将被转换。
import { defineConfig } from 'vite';
import postcssPxtorem from 'postcss-pxtorem';

export default defineConfig({
  css: {
    postcss: {
      plugins: [
        postcssPxtorem({
          rootValue: 16,
          propList: ["*"],
        }),
      ],
    },
  },
  // 其他配置...
});

3、引入amfe-flexible,实现伸缩布局

在你的项目的入口文件(通常是index.jsmain.js)中引入amfe-flexible

import 'amfe-flexible';

这行代码会将amfe-flexible的样式应用到你的整个项目中。

这样你的移动端页面在检查时拖拽,大小宽高就会跟着变化啦!

二、预编译器

less-loader 是一个 webpack 模块加载器,用于将 LESS 文件编译成 CSS。

pnpm i less-loader@7 -S

三、pinia实现购物车功能

购物车没有商品时 

购物车有商品时 

点击购物车图标会显示购物清单


我们不难发现,商品总个数,单个个数,单价,总价,需要在多个组件中用到,所以我们把它们存到Pinia仓库中集中管理。

1、商品总数

Pinia仓库的搭建与安装不多赘述。购物车上方的小红点即是点击+号就会增加的商品总数。

total属性初始为0,每点击+号就会调用increment()方法给 total 加1

// stores/cart.js
import { defineStore } from "pinia";

export const useCartStore = defineStore("cart", {
  state: () => ({
    total: 0,
  }),
  actions: {
    // 总个数
    increment() {
      this.total++;
    },
  
  },
});
<van-button size="mini" @click="incrementCart(item)">+</van-button>
<script setup>
const cartStore = useCartStore(); // 使用 Pinia 仓库
const incrementCart = (item) => {
  cartStore.increment(); // 更新 Pinia 仓库
};
</script>

2、单个商品个数增加

在仓库中创建cartItems存储被点击的项和价格

{ ...item, count: 1 } 如果item中没有count属性,则添加,如果有则覆盖。

export const useCartStore = defineStore("cart", {
  state: () => ({
    cartItems: [], // 存储每个商品的点击次数和价格
  }),
  actions: {
    // 商品添加的列表
    addCartItem(item) {
      const existingIndex = this.cartItems.findIndex(
        (cartItem) => cartItem.id === item.id
      );
      if (existingIndex !== -1) {
        // 如果商品已存在,则增加点击次数
        this.cartItems[existingIndex].count++;
        this.total++;
      } else {
        // 如果商品不存在,则添加到数组中,点击次数为1
        this.cartItems.push({ ...item, count: 1 });
      }
    },  
  },
});

3、单个商品个数减少

和个数增加的逻辑差不多,但需要判断count为0时移除列表。

    // 商品减少的列表
    removeCartItem(item) {
      const existingIndex = this.cartItems.findIndex(
        (cartItem) => cartItem.id === item.id
      );
      if (existingIndex !== -1) {
        // 如果商品已存在,则减少点击次数
        this.cartItems[existingIndex].count--;
        this.total--;
        if (this.cartItems[existingIndex].count === 0) {
          // 如果点击次数为0,则从数组中移除该商品
          this.cartItems.splice(existingIndex, 1);
        }
      }
    },

4、总价

在仓库中创建totalAmount存储总价,初始为0。

  // 计算总价
    recalculateTotalAmount() {
      this.totalAmount = this.cartItems.reduce((sum, cartItem) => {
        return sum + cartItem.price * cartItem.count;
      }, 0);
    },

5、清空购物车

  // 清空购物车
    clearCart() {
      this.cartItems = [];
      this.total = 0;
      this.totalAmount = 0;
    },

在组件中调用仓库绑定仓库中的点击事件就可以啦~

配套后台管理系统实现请移步本人另一篇:

Vue3后台管理系统的搭建与实现 看这篇就够了!-优快云博客

<think>嗯,用户想了解Vue3移动端开发的教程和最佳实践。首先,我需要整理现有的引用内容,看看哪些信息是相关的。引用[2]提到了Fast-Vue3项目,被用于企业管理系统、电商网站和在线教育平台,还提到了组件化开发、状态管理、路由管理和性能优化这些最佳实践。这部分应该重引用。 引用[4]邀请用户加入探索Vue3移动端的可能性,提到适配技巧,可能可以结合到开发准备中。引用[5]是关于Vue2的移动端导航组件ly-tab,虽然用户问的是Vue3,但可能需要提醒用户注意版本兼容性,或者寻找Vue3的替代组件。 另外,引用[3]讨论了Vue3的现状和Vue2的迁移,这里可能需要提到Vue3的优势以及如何从Vue2迁移到Vue3,尤其是在移动端开发中的注意事项。不过用户的问题更偏向于教程和实践,这部分可能作为补充。 接下来,我需要组织结构。通常教程类问题需要分步骤,比如开发准备、UI框架选择、最佳实践、性能优化、案例参考等。根据引用内容,Fast-Vue3已经有一些应用案例,可以作为典型案例来介绍。同时,Vant作为有赞的UI库,适合移动端,引用[1]提到Vant的教程链接,这里需要推荐Vant作为UI框架的选择。 可能还需要补充一些引用中没有提到的内容,比如Vue3的新特性在移动端的应用,比如Composition API、响应式系统优化等,但需要确保引用来源。不过现有引用中没有这些内容,可能需要避免添加未引用的信息,或者明确标注是外部知识。 另外,用户可能关心具体如何开始一个Vue3移动端项目,需要步骤指南,比如使用Vite创建项目,集成Vant,配置路由(Vue Router),状态管理(Pinia替代Vuex),以及性能优化技巧如懒加载、代码分割等,这些在引用[2]中有提到。 还需要注意,引用[5]的ly-tab是Vue2的组件,可能需要建议用户寻找Vue3兼容的类似组件,或者使用Vant的标签组件代替。 最后,生成相关问题时要围绕Vue3移动端开发,可能涉及UI库选择、性能优化、状态管理、迁移问题等,确保问题基于引用内容。</think>### Vue3移动端开发教程最佳实践 #### 一、开发准备环境搭建 1. **使用Vite构建工具** Vue3推荐使用Vite替代Webpack,其轻量级特性可显著提升开发效率。例如,初始化项目命令为: ```bash npm create vite@latest my-vue3-app -- --template vue ``` 2. **移动端适配方案** - 通过`viewport`设置实现响应式布局(如`postcss-px-to-viewport`插件自动转换单位)。 - 使用Flex或Grid布局提升灵活性[^4]。 #### 二、移动端UI框架选择 1. **推荐框架:Vant** Vant是专为移动端设计的Vue3组件库,支持按需引入和主题定制,适用于快速构建界面。例如,安装命令为: ```bash npm install vant@next ``` 按需引入组件示例: ```javascript import { Button, Tabbar } from &#39;vant&#39;; ``` 详细教程参考:[Vant官方文档](https://www.w3cschool.cn/vantlesson/vantlesson-htl635uq.html)[^1]。 #### 三、最佳实践 1. **组件化开发** 将页面拆分为可复用的组件(如导航栏、列表项),提升代码可维护性[^2]。 2. **状态管理** 使用Pinia(Vue3推荐的状态管理库)替代Vuex,简化代码结构: ```javascript // store/counter.js import { defineStore } from &#39;pinia&#39;; export const useCounterStore = defineStore(&#39;counter&#39;, { state: () => ({ count: 0 }), actions: { increment() { this.count++ } } }); ``` 3. **路由管理** 集成Vue Router实现页面跳转懒加载: ```javascript const routes = [ { path: &#39;/&#39;, component: () => import(&#39;./views/Home.vue&#39;) }, { path: &#39;/detail&#39;, component: () => import(&#39;./views/Detail.vue&#39;) } ]; ``` 4. **性能优化** - **代码分割**:利用Vite的动态导入功能拆分代码。 - **图片懒加载**:通过`v-lazy`指令优化首屏加载速度。 #### 四、典型案例参考 - **企业管理系统**:通过Fast-Vue3实现高效数据交互[^2]。 - **电商网站**:结合Vant组件库Vue3响应式特性,实现动态商品展示[^2]。 - **在线教育平台**:利用路由懒加载优化课程页面加载性能。 #### 五、迁移注意事项 若从Vue2升级,需注意以下兼容性问题: 1. 使用`@vue/compat`模式逐步迁移。 2. 替换Vue2特有语法(如过滤器、事件总线)为Vue3等效实现[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值