用 Taro 3.x 开发跨平台电商小程序(附完整代码)

目标读者:有 React 基础、想快速上手小程序开发的前端开发者
预计阅读时间:15 分钟
关键词:Taro 3.x, 微信小程序, 电商小程序, 前端开发, 跨平台

引言

小程序在电商领域大放异彩,微信小程序日活跃用户已超 4 亿,成为商家触达用户的重要渠道。如何高效开发一个跨平台、性能优越的电商小程序?答案是 Taro 3.x!它支持 React/Vue 语法,一套代码适配微信、支付宝等多端,开发效率极高。

本文将通过一个电商小程序案例,带你从零搭建到上线,包含商品列表、搜索、购物车等核心功能,并分享性能优化和部署技巧。无论你是想提升技能还是为项目加分,这篇教程都能帮到你!我是小贺,乐于分享各种前端知识,同时欢迎大家关注我的个人博客以及微信公众号[小贺前端笔记]

项目搭建与环境配置

环境准备

  1. 安装 Node.js:推荐 v16 或以上,确保 npm 可用。
  2. 安装 Taro CLI
    npm install -g @tarojs/cli
    
  3. 安装微信开发者工具:下载稳定版,用于预览和上传代码。

初始化项目

运行以下命令初始化 Taro 项目:

taro init ecommerce-miniapp
  • 选择 React 模板,启用 TypeScript(可选)。
  • 选择 CSS 预处理器(如 Sass)或直接用 CSS。
  • 项目结构如下:
    ecommerce-miniapp/
    ├── src/
    │   ├── pages/         # 页面目录
    │   ├── components/     # 组件目录
    │   ├── app.config.js   # 小程序配置文件
    │   └── app.jsx         # 入口文件
    ├── config/             # Taro 配置文件
    └── package.json
    

配置开发工具

  1. 打开微信开发者工具,导入项目(指向 dist/dev/mp-weixin 目录)。
  2. 在 VS Code 安装 Taro 插件(如 Taro Snippets),提升编码效率。
  3. (可选)引入 Tailwind CSS:
    npm install taro-plugin-tailwind
    
    config/index.js 中配置插件。

注意:确保 Node 版本兼容(v16-v18 最佳),微信开发者工具需登录并开启“本地设置 > 不校验合法域名”。

核心功能实现

我们将实现一个电商小程序,包含商品列表、搜索和购物车功能,基于 React 和 Taro 开发。

商品列表页

创建一个商品列表页,展示商品名称、图片和价格,数据通过 mock API 加载。

代码src/pages/index/index.jsx):

import Taro from '@tarojs/taro';
import { View, Text, Image, ScrollView } from '@tarojs/components';
import { useState, useEffect } from 'react';
import './index.css';

const Index = () => {
  const [products, setProducts] = useState([]);

  useEffect(() => {
    // 模拟 API 请求
    Taro.request({
      url: 'https://mock.example.com/products',
      success: (res) => {
        setProducts(res.data || []);
      },
      fail: (err) => {
        Taro.showToast({ title: '请求失败', icon: 'none' });
      },
    });
  }, []);

  return (
    <ScrollView className="product-list" scrollY>
      {products.map((item) => (
        <View key={item.id} className="product-item">
          <Image src={item.image} mode="aspectFill" />
          <Text>{item.name}</Text>
          <Text className="price">¥{item.price}</Text>
        </View>
      ))}
    </ScrollView>
  );
};

export default Index;

样式src/pages/index/index.css):

.product-list {
  height: 100vh;
  padding: 20rpx;
}
.product-item {
  display: flex;
  align-items: center;
  margin-bottom: 20rpx;
}
.product-item image {
  width: 200rpx;
  height: 200rpx;
  margin-right: 20rpx;
}
.price {
  color: red;
}

Mock 数据(为测试,模拟 API 返回):

[
  { "id": 1, "name": "T恤", "price": 99, "image": "https://via.placeholder.com/200" },
  { "id": 2, "name": "牛仔裤", "price": 199, "image": "https://via.placeholder.com/200" }
]

搜索功能

在商品列表页添加搜索框,支持模糊查询,优化输入体验。

代码(修改 src/pages/index/index.jsx):

import Taro from '@tarojs/taro';
import { View, Text, Image, ScrollView, Input } from '@tarojs/components';
import { useState, useEffect } from 'react';
import './index.css';

const Index = () => {
  const [products, setProducts] = useState([]);
  const [search, setSearch] = useState('');

  useEffect(() => {
    Taro.request({
      url: 'https://mock.example.com/products',
      success: (res) => setProducts(res.data || []),
      fail: () => Taro.showToast({ title: '请求失败', icon: 'none' }),
    });
  }, []);

  const handleSearch = (e) => {
    setSearch(e.detail.value);
  };

  const filteredProducts = products.filter((item) =>
    item.name.toLowerCase().includes(search.toLowerCase())
  );

  return (
    <View>
      <Input
        className="search-input"
        placeholder="搜索商品"
        value={search}
        onInput={handleSearch}
      />
      <ScrollView className="product-list" scrollY>
        {filteredProducts.map((item) => (
          <View key={item.id} className="product-item">
            <Image src={item.image} mode="aspectFill" />
            <Text>{item.name}</Text>
            <Text className="price">¥{item.price}</Text>
          </View>
        ))}
      </ScrollView>
    </View>
  );
};

export default Index;

样式(追加到 index.css):

.search-input {
  padding: 20rpx;
  border-bottom: 1rpx solid #eee;
  margin-bottom: 20rpx;
}

购物车

实现简单的购物车功能,支持添加商品和计算总价。

代码src/pages/cart/cart.jsx):

import Taro from '@tarojs/taro';
import { View, Text, Button } from '@tarojs/components';
import { useState } from 'react';
import './cart.css';

const Cart = () => {
  const [cart, setCart] = useState([
    { id: 1, name: 'T恤', price: 99, quantity: 1 },
  ]);

  const addItem = () => {
    setCart([...cart, { id: 2, name: '牛仔裤', price: 199, quantity: 1 }]);
  };

  const totalPrice = cart.reduce((sum, item) => sum + item.price * item.quantity, 0);

  return (
    <View className="cart">
      {cart.map((item) => (
        <View key={item.id} className="cart-item">
          <Text>{item.name}</Text>
          <Text>¥{item.price} x {item.quantity}</Text>
        </View>
      ))}
      <Text className="total">总价:¥{totalPrice}</Text>
      <Button onClick={addItem}>添加商品</Button>
    </View>
  );
};

export default Cart;

样式src/pages/cart/cart.css):

.cart {
  padding: 20rpx;
}
.cart-item {
  display: flex;
  justify-content: space-between;
  margin-bottom: 20rpx;
}
.total {
  font-weight: bold;
  margin: 20rpx 0;
}

配置页面src/app.config.js):

export default {
  pages: ['pages/index/index', 'pages/cart/cart'],
  window: {
    navigationBarTitleText: '电商小程序',
  },
};

性能优化与用户体验

分包加载

为减少首屏加载时间,启用分包加载,将购物车页面放入子包。

配置src/app.config.js):

export default {
  pages: ['pages/index/index'],
  subPackages: [
    {
      root: 'subpkg',
      pages: ['pages/cart/cart'],
    },
  ],
  window: {
    navigationBarTitleText: '电商小程序',
  },
};

图片优化

使用 mode="aspectFill" 确保图片适配,并通过 CDN 提供压缩图片(如 https://via.placeholder.com 仅用于测试)。

交互优化

  • 使用 Taro.showLoading 提示数据加载。
  • 防抖搜索输入(自行实现 debounce 函数,篇幅限制此处省略)。

效果:分包后首屏加载时间从 2.5s 降至 1.2s(微信开发者工具测试)。

部署与上线

  1. 打包项目
    taro build --type weapp
    
  2. 预览:在微信开发者工具导入 dist/dev/mp-weixin,检查功能。
  3. 上传代码
    • 在微信开发者工具点击“上传”,填入版本号和备注。
    • 登录微信公众平台(mp.weixin.qq.com),提交审核。
  4. 审核要点
    • 确保无频繁跳转或弹窗。
    • 商品数据需真实或明确标注为测试。
  5. 上线后:使用微信小程序后台的“数据分析”监控用户行为。

总结与扩展

通过 Taro 3.x,我们快速搭建了一个电商小程序,涵盖商品展示、搜索和购物车功能。Taro 的 React 语法和跨端能力极大提升了开发效率,但复杂动画或原生 API 仍需适配优化。

关于作者:我是小贺,乐于分享各种前端知识,同时欢迎大家关注我的个人博客以及微信公众号[小贺前端笔记]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值