当前位置: 首页 > news >正文

React学习——美团小案例——Day3

美团小案例

1. 案例演示

在这里插入图片描述

基本开发思路:使用 RTK(Redux Toolkit)来管理应用状态, 组件负责 数据渲染 和 dispatch action

2. 准备环境

  1. 克隆项目到本地(内置了基础静态组件和模版)
git clone http://git.itcast.cn/heimaqianduan/redux-meituan.git 

在这里插入图片描述

  1. 安装所有依赖
npm i 
  1. 启动mock服务(内置了json-server)
npm run serve 
  1. 启动前端服务
npm run start 

3. 分类和商品列表渲染

在这里插入图片描述

1- 编写store逻辑: src/store/modules/takeaway.js

// 编写store
import { createSlice } from "@reduxjs/toolkit"
import axios from "axios"
// 1、编写同步部分的store
const foodsStore = createSlice({name: 'foods',// (1).初始化值initialState: {// 商品列表foodsList: []},// (2).修改方法reducers: {// 更改商品列表setFoodsList (state, action) {state.foodsList = action.payload}}
})// 2、解构
const { setFoodsList } = foodsStore.actions
// 异步获取部分
const fetchFoodsList = () => {return async (dispatch) => {// 编写异步逻辑const res = await axios.get('http://localhost:3004/takeaway')// 调用dispatch函数提交actiondispatch(setFoodsList(res.data))}
}// 3、导出
export { fetchFoodsList }const reducer = foodsStore.reducer
export default reducer

2 -组合store: src/store/index.js

import { configureStore } from "@reduxjs/toolkit";
import foodsReducer from "./modules/takeaway";const store = configureStore({reducer: {foods:foodsReducer}
})export default store

3- 组件使用store数据: src/App.js

// 省略部分代码
import { useDispatch, useSelector } from 'react-redux'
import { fetchFoodsList } from './store/modules/takeaway'
import { useEffect } from 'react'const App = () => {// 触发action执行// 1. useDispatch -> dispatch // 2. actionCreater导入进来 // 3.useEffectconst dispatch = useDispatch()useEffect(() => {dispatch(fetchFoodsList())}, [dispatch])return (<div className="home">{/* 导航 */}<NavBar />{/* 内容 */}<div className="content-wrap"><div className="content"><Menu /><div className="list-content"><div className="goods-list">{/* 外卖商品列表 */}{foodsList.map(item => {return (<FoodsCategorykey={item.tag}// 列表标题name={item.name}// 列表商品foods={item.foods}/>)})}</div></div></div></div>{/* 购物车 */}<Cart /></div>)
}export default App

4- Menu组件中使用store数据: src/componmens/Menu/index.js
在这里插入图片描述

4. 点击分类激活交互实现

在这里插入图片描述
在这里插入图片描述

1- 编写store逻辑: src/store/modules/takeaway.js
在这里插入图片描述在这里插入图片描述

2- 编写组件逻辑: src/componmens/Menu/index.js
在这里插入图片描述

5. 商品列表切换显示

在这里插入图片描述
src/App.js
在这里插入图片描述

6. 添加购物车实现

在这里插入图片描述
在这里插入图片描述
实现思路:

  1. 使用RTX管理新状态cartList
    (思路:如果添加过,只更新数量count,没有添加过,直接push进去)
  2. 组件中点击时收集数据提交action添加购物车(src/components/FoodsCategory/FoodItem/index.js)

1- 编写store逻辑: src/store/modules/takeaway.js

// 编写storeimport { createSlice } from "@reduxjs/toolkit"
import axios from "axios"const foodsStore = createSlice({name: 'foods',reducers: {// 添加购物车addCart (state, action) {// 是否添加过?以action.payload.id去cartList中匹配 匹配到了 添加过const item = state.cartList.find(item => item.id === action.payload.id)if (item) {item.count++} else {state.cartList.push(action.payload)}}}
})// 导出actionCreater
const { addCart } = foodsStore.actionsexport { addCart }const reducer = foodsStore.reducerexport default reducer

2- 编写组件逻辑: src/components/FoodsCategory/FoodItem/index.js

<div className="goods-count">{/* 添加商品 */}<span className="plus" onClick={() => dispatch(addCart({id,picture,name,unit,description,food_tag_list,month_saled,like_ratio_desc,price,tag,count:count||1}))}></span>
</div>

7. 统计区域实现

在这里插入图片描述

实现思路

  1. 基于store中的cartList的length渲染数量
  2. 基于store中的cartList累加price * count
  3. 购物车cartList的length不为零则高亮
// 计算总价 
const totalPrice = cartList.reduce((a, c) => a + c.price * c.count, 0){/* fill 添加fill类名购物车高亮*/}
{/* 购物车数量 */}
<div onClick={onShow} className={classNames('icon', cartList.length > 0 && 'fill')}>{cartList.length > 0 && <div className="cartCornerMark">{cartList.length}</div>}
</div>

在这里插入图片描述

8. 购物车列表功能实现

在这里插入图片描述

在这里插入图片描述

1-控制列表渲染
src/components/Cart/index.js

const Cart = () => {return (<div className="cartContainer">{/* 添加visible类名 div会显示出来 */}<div className={classNames('cartPanel', 'visible')}>{/* 购物车列表 */}<div className="scrollArea">{cartList.map(item => {return (<div className="cartItem" key={item.id}><img className="shopPic" src={item.picture} alt="" /><div className="main"><div className="skuInfo"><div className="name">{item.name}</div></div><div className="payableAmount"><span className="yuan">¥</span><span className="price">{item.price}</span></div></div><div className="skuBtnWrapper btnGroup">{/* 数量组件 */}<Countcount={item.count}/></div></div>)})}</div></div></div>)
}export default Cart

2- 购物车增减逻辑实现
src/store/modules/takeaway.js

// count增
increCount (state, action) {// 关键点:找到当前要修改谁的count idconst item = state.cartList.find(item => item.id === action.payload.id)item.count++
},
// count减
decreCount (state, action) {// 关键点:找到当前要修改谁的count idconst item = state.cartList.find(item => item.id === action.payload.id)if (item.count === 0) {return}item.count--
}

src/store/modules/takeaway.js

<div className="skuBtnWrapper btnGroup">{/* 数量组件 */}<Countcount={item.count}onPlus={() => dispatch(increCount({ id: item.id }))}onMinus={() => dispatch(decreCount({ id: item.id }))}/>
</div>

3-清空购物车实现
src/store/modules/takeaway.js

// 清除购物车
clearCart (state) {state.cartList = []
}

src/components/Cart/index.js

import { clearCart } from "../../store/modules/takeaway";
<div className="header"><span className="text">购物车</span><span className="clearCart" onClick={() => dispatch(clearCart())}>清空购物车</span>
</div>

9. 控制购物车显示和隐藏

在这里插入图片描述
在这里插入图片描述
src/components/Cart/index.js
在这里插入图片描述
在这里插入图片描述

http://www.dtcms.com/a/293847.html

相关文章:

  • 一种集合式方法:实现高效且有效的大语言模型零样本排序
  • PHP:经典与现代交织的编程语言,持续赋能Web开发
  • 浙大Fast Lab:融合3D激光雷达与强化学习的「端到端导航」,让无人机“飞”在点云上!
  • javaSE(List集合ArrayList实现类与LinkedList实现类)day15
  • OSPF(多区域)
  • Android14 锁屏密码修改为至少6位
  • 开源深度学习新宠:Burn框架助您无忧高效建模
  • USB4.0:开启高速数据传输的新时代
  • Upload-Labs通关全攻略详细版
  • Keepalived高可用模型
  • [matlab]matlab上安装xgboost安装教程简单版
  • Excel——设置打印的区域
  • Unity × RTMP × 头显设备:打造沉浸式工业远控视频系统的完整方案
  • 将AI协作编程从“碰运气”的提示工程(Prompt Engineering)提升到“可预期”的上下文工程(Context Engineering)
  • 驯服AI的“魔法咒语”:Prompt提示词工程使用教程
  • 【Spring Cloud Gateway 实战系列】基础篇:路由、断言、过滤器、负载均衡深度解析
  • AI产品经理面试宝典第46天:模型评估与Prompt工程核心考点解析
  • 1553B心得总结
  • VSCODE 禁用git 功能
  • k8s:docker compose离线部署haborV2.13.1及采用外部的postgresql及redis数据库
  • 设计模式九:构建器模式 (Builder Pattern)
  • Hexo - 免费搭建个人博客01 - 安装软件工具
  • 在 Ubuntu 22.04 上运行 cAdvisor 时遇到 mountpoint for cpu not found 错误
  • DeepSeek 助力 Vue3 开发:打造丝滑的日历(Calendar),日历_家庭维护示例(CalendarView01_31)
  • Linux 环境下安装 MySQL 8.0.34 二进制 详细教程 附docker+k8s启动
  • 【Redis】在Ubentu环境下安装Redis
  • 探索 Linux 权限的奥秘:守护系统安全的关键
  • Cell Meb | 国自然热点DNA甲基化和蛋氨酸代谢共同解析癌症恶病质肌肉萎缩的机制
  • 嵌入式平台DMXRDM协议开源项目说明
  • DIOR-ViT:用于病理图像癌症分类的差分序数学习视觉Transformer|文献速递-医学影像算法文献分享