redux在react中的应用,使用antdDesign完成购物车

目录

一.redux的认识

二.什么时候使用redux

三.安装redux

四.redux的使用

1.创建store

2.创建reducer

3.创建action

4.在页面中引入store

(1)在商品列表页引入store

(2)在购物车页面引入store

五.运行效果图


一.redux的认识

redux 和react没有什么直接的关系,在React, Angular, Ember, jQuery, or vanilla JavaScript中都可以使用Redux。

Redux 帮助你管理“全局”状态 - 那些应用程序的许多部分都需要的状态。

二.什么时候使用redux

  • 在应用的大量地方,都存在大量的状态
  • 应用状态会随着时间的推移而频繁更新
  • 更新该状态的逻辑可能很复杂
  • 中型和大型代码量的应用,很多人协同开发

三.安装redux

npm install redux

四.redux的使用

1.创建store

import { legacy_createStore as createStore } from 'redux';
import Reducer from './reducer';
let store = createStore(Reducer);
export default store;

2.创建reducer

import { ADD_CAR, ADD_BUY_NUM, SUBTRACT_BUY_NUM } from './action';const state1 = {carArr: [],
};const goodCar = (state = state1, action) => {const { type, data } = action;switch (type) {case ADD_CAR:return getAddCarData(data, state.goodCar);case SUBTRACT_BUY_NUM:return changeBuyNum(state.goodCar, data.id, '-');case ADD_BUY_NUM:return changeBuyNum(state.goodCar, data.id, '+');default:return state.carArr;}
};// 点击 购物车按钮
const getAddCarData = (obj, arr) => {if (obj) {if (arr.length == 0) {return [...arr, { ...obj, buyNum: 1 }];} else {const idArrs = arr.map((item) => item.id);if (idArrs.includes(obj.id)) {let index = arr.findIndex((item) => item.id == obj.id);arr[index].buyNum = arr[index].buyNum + 1;return arr;} else {return [...arr, { ...obj, buyNum: 1 }];}}} else {return arr;}
};// 点击  +  | —号
const changeBuyNum = (arr, id, flag) => {let index = arr.findIndex((item) => item.id == id);arr[index].buyNum = flag == '+' ? arr[index].buyNum + 1 : arr[index].buyNum - 1;return arr;
};const Reducer = (state, action) => {return {goodCar: goodCar(state, action),};
};export default Reducer;

3.创建action

export const ADD_CAR = 'ADD_CAR';
export const ADD_BUY_NUM = 'ADD_BUY_NUM';
export const SUBTRACT_BUY_NUM = 'SUBTRACT_BUY_NUM';

4.在页面中引入store

(1)在商品列表页引入store

import { PageContainer, ProTable } from '@ant-design/pro-components';
import { Button, Drawer, Input, message } from 'antd';
import React, { useRef, useState } from 'react';
import { history } from 'umi';
import store from '../../store/store.js';//引入storeconst GoodList = () => {const tableData = [{id: 1,name: '包子',num: 5,price: 2,},{id: 2,name: '面条',num: 500,price: 10,},{id: 3,name: '鸡蛋灌饼',num: 300,price: 5,},{id: 4,name: '烤肠',num: 700,price: 3,},];const columns = [{title: 'id',dataIndex: 'id',},{title: '商品名称',dataIndex: 'name',},{title: '库存量',dataIndex: 'num',},{title: '单价',dataIndex: 'price',},{title: '操作',valueType: 'option',key: 'option',render: (text, record, _, action) => [<akey="addCar"onClick={() => {clickAddCarBtn(record);//   action?.startEditable?.(record.id);}}>加入购物车</a>,],},];// 点击 添加购物车按钮const clickAddCarBtn = (obj) => {console.log('添加购物车按钮:', obj);store.dispatch({ type: 'ADD_CAR', data: { ...obj } });history.push('/carList');};return (<PageContainer><ProTable rowKey="id" search={false} columns={columns} dataSource={tableData} /></PageContainer>);
};export default GoodList;

(2)在购物车页面引入store

import { PageContainer, ProTable } from '@ant-design/pro-components';
import { Button, Drawer, Input, message, Card } from 'antd';
import React, { useRef, useState, useEffect } from 'react';
import store from '../../store/store.js';//引入store
import style from './index.less';const CardList = () => {const [carNewArr, setCarNewArr] = useState([]);let actionRef = useRef();const [num, setNum] = useState(0);useEffect(() => {console.log('store:', store.getState());// 商品购物车数组getBuyNumData();}, [num]);console.log('carNewArr:', carNewArr);const columns = [{title: 'id',dataIndex: 'id',},{title: '商品名称',dataIndex: 'name',},{title: '库存量',dataIndex: 'num',},{title: '单价',dataIndex: 'price',},{title: '购买数量',valueType: 'option',key: 'option',render: (text, record, _, action) => [<div key="buyNum" className={style.card}>{record.buyNum > 0 ? (<divclassName={style.circle}onClick={() => {changeBuyNum(record, '-');}}>-</div>) : null}<div className={style.buyNum}>{record.buyNum}</div>{record.buyNum < record.num ? (<divclassName={style.circle}onClick={() => {changeBuyNum(record, '+');}}>+</div>) : null}</div>,],},];const getBuyNumData = () => {const carObj = store.getState();setCarNewArr(carObj?.goodCar);};//修改购物车的数量const changeBuyNum = (obj, flag) => {store.dispatch({ type: flag == '+' ? 'ADD_BUY_NUM' : 'SUBTRACT_BUY_NUM', data: { ...obj } });setNum(num + 1);};return (<PageContainer><Card><ProTable rowKey="id" search={false} columns={columns} dataSource={carNewArr} /></Card></PageContainer>);
};export default CardList;

五.运行效果图

图1

图2 

图3

图4 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/26549.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

小黑跟老黑们夜骑车拍完了毕业照面试了两场的leetcode之旅:793. 阶乘函数后 K 个零

小黑代码 class Solution:def preimageSizeFZF(self, k: int) -> int:# 获取n的阶乘的0个数lru_cachedef get_zero(n):if not n:return 0return (n//5) get_zero(n//5)# 二分查找def bin_search(k):# 定义左右指针left 0right int(1e10)while left < right:mid (lef…

python基础 | Pandas基础

文章目录 &#x1f4da;基本数据结构&#x1f407;Series&#xff1a;存储一维&#x1f407;DataFrame:存储二维&#x1f407;Series和DataFrame的关系 &#x1f4da;常用基本函数&#x1f407;数据基本操作&#x1f955;列的查改增删&#x1f440;查看列&#x1f440;修改列&a…

Python面向对象二(第十二讲)

文章目录 知识点1.私有属性与私有方法1.私有属性2.私有方法 2.成员3.实例属性1.类属性(静态属性)2.属性总结 4.实例方法5.类方法6.静态方法7.封装介绍8.继承(重点)9.新式类与经典类练习 10.单继承1.super()练习 11.作业 知识点 私有属性与私有方法成员属性方法封装继承多态 1…

常用设计模式系列(十)—装饰者模式

第一节 前言 各位好&#xff0c;首先我要先恭喜下自己粉丝即将破百&#xff0c;也谢谢各位的捧场&#xff0c;不过也跟我自己的努力密不可分&#xff0c;我也要继续加油&#xff0c;输出更好的文章来回报大家&#xff0c;也希望大家多提建议&#xff0c;有问题我也会及时改进。…

摆摊计划1(万一以后找不到工作)

货源&#xff1a;阿里巴巴正规平台 卖炸串 硬件&#xff1a; 多功能烤肠机 购买链接&#xff1a;脆皮烤肠机燃煤气商用油炸锅商用摆摊热狗机肠机关东煮组合机批发 (1688.com) 成本&#xff1a;379.6元 食材&#xff1a; 淀粉肠&#xff08;100支试水&#xff09;&#xff…

TCP/IP协议

✏️作者&#xff1a;银河罐头 &#x1f4cb;系列专栏&#xff1a;JavaEE &#x1f332;“种一棵树最好的时间是十年前&#xff0c;其次是现在” 目录 TCP/IP协议应用层协议自定义应用层协议DNS 传输层协议端口号UDP协议UDP协议端格式 TCP协议TCP协议段格式TCP工作机制确认应答…

基于HTML+CSS+JavaScript制作美食文化网站 ——卡通创意的烧烤(5个页面) html静态网页设计制作 dw静态网页成品模板素材网页 web前端网页设计与制作 div静态网页设计

&#x1f468;‍&#x1f393;静态网站的编写主要是用HTML DIVCSS JS等来完成页面的排版设计&#x1f469;‍&#x1f393;,常用的网页设计软件有Dreamweaver、EditPlus、HBuilderX、VScode 、Webstorm、Animate等等&#xff0c;用的最多的还是DW&#xff0c;当然不同软件写出的…

c语言-喝饮料问题

/* 喝饮料问题&#xff1a; 1瓶饮料1元&#xff0c;2个空瓶可以换一瓶饮料&#xff0c;给20元&#xff0c;可以喝多少饮料 */#define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h>int main() {int man 0, kong 0, sum 0;man 20; //一开始可以买的饮料数sum 0; /…

如何完美吃下二叉树?——二叉树练习题

文章目录 开胃前菜 基础概念选择题主菜 二叉树oj题1.单值二叉树题目思路1代码思路2代码递归展开图 2. 检查两颗树是否相同题目代码 3. 对称二叉树题目思路代码 4. 二叉树的前序遍历题目代码 5. 另一颗树的子树思路代码 6.二叉树遍历题目代码 7.二叉树的层序遍历准备环节代码实现…

动物园游记

这是学习笔记的第 1887 篇文章 今天本来打算去科技馆&#xff0c;结果发现就今天闭馆&#xff0c;真是不巧&#xff0c;于是改换了方向去了北京动物园。 早两年说动物园&#xff0c;基本都和服装批发能联系起来&#xff0c;我是纯粹的去看动物的。确切的说是陪孩子去看动物的。…

【Java核心技术卷】I/O详析

文章目录 概述Java io基本概念关于流流的分类 Java io框架一、以字节为单位的输出流的框架图&#xff08;1&#xff09;框架图图示&#xff08;2&#xff09;OutputStream详解&#xff08;3&#xff09;OutputStream子类&#xff08;4&#xff09;引申&#xff1a;打印流 二、以…

深圳-上海-呼伦贝尔-漠河-哈尔滨环行手记

C语言的精髓是指针&#xff0c;这是手艺人的小幸运&#xff0c;但这是程序员的悲哀。 今年&#xff08;2018年春节前&#xff09;的假期比较特殊&#xff0c;我这一出去就是20多天&#xff0c;请了十来天的年假…1月27号就出发离开深圳了&#xff0c;考虑到1月25号和1月26号两天…

魔幻的2020,对我来说却是逐渐觉醒的一年

2020年的最后一天&#xff0c;按照惯例总结一下成果&#xff0c;同时也制定一下来年的目标&#xff0c;每年不总得给自己立几个flag。 关于公众号 先说公众号&#xff0c;其实开通了很多年&#xff0c;直到今天&#xff0c;还差一百多粉丝才突破一万&#xff0c;这样的成绩算…

美团 大规模商品知识图谱的构建与应用

作者 | 曹雪智博士 美团 技术专家 来源 | DataFunTalk 在互联网新零售的大背景下&#xff0c;商品知识图谱作为新零售行业数字化的基石&#xff0c;提供了对于商品相关内容的立体化、智能化、常识化的理解&#xff0c;对上层业务的落地起到了至关重要的作用。 相比于美团大脑中…

连投两笔,低温预制烤肠为何成为小红书的“心头爱”?

近年来&#xff0c;随着人们生活水平的不断提高和生活节奏的加快&#xff0c;消费者的食品消费观念已经从最初的满足于温饱发展成为追求高品质的消费&#xff0c;对食品健康、质量和用餐效率等提出新要求&#xff0c;低温预制食品的需求不断提升。 根据 Frost & Sullivan&…

基于JAVA的网上水果生鲜超市商城SSM【数据库设计、论文、源码、开题报告】

叿狆号:“IT软件学习社” 主要使用技术 springspringmvcmybatisjspmysqltomcat 功能介绍 &#xff08;1&#xff09;登录注册功能&#xff1a;用户打开系统&#xff0c;浏览挑选生鲜&#xff0c;在购买生鲜之前&#xff0c;要进行注册登录&#xff0c;保证一人一个账号&…

路边2元一根的烤肠,里面究竟是什么肉?

放学之后&#xff0c;下班之余&#xff0c;大家有没有被路边滩上红彤彤、2元一根的烤肠&#xff08;热狗&#xff09;所吸引&#xff1f;那个扑鼻香味&#xff0c;能让你瞬间流口水有没有&#xff1f; 可是&#xff0c;单纯的你有没有想过&#xff0c;这些看上去就很美味的烤肠…

泰酷辣!有人把 81 个国内大模型汇总在一张图里!

在科技的世界里&#xff0c;一场革命正在悄然进行。这场革命的主角&#xff0c;就是我们今天要讲的“大模型”。这些大模型&#xff0c;就像一群巨人&#xff0c;正在各个领域中挥舞着他们的力量&#xff0c;引领着一场前所未有的技术变革。 在国内&#xff0c;这场大模型的研发…

Python 吞噬世界,GPT 吞噬 Python!ChatGPT 上线最强应用:分析数据、生成代码都精通

当地 7 月 7 日&#xff0c;OpenAI 在社交平台表示&#xff0c;将向所有 ChatGPT Plus 用户开放代码解析器&#xff08;Code Interpreter&#xff09;功能。消息一出便瞬间引发了开发者们的广泛关注&#xff0c;该功能被有的开发者认为是自 OpenAI 发布 GPT-4 以来最强大的功能…

GPT-4 终于开放了!

2023年&#xff0c;OpenAI的ChatGPT已经成为了一个不可忽视的存在。作为一种基于GPT模型的聊天机器人&#xff0c;ChatGPT在过去的一年多时间里里取得了令人瞩目的进步。从最初的简单问答&#xff0c;到现在能够进行深度对话&#xff0c;甚至可以执行代码&#xff0c;ChatGPT的…