React之购物车+动态获取参数+Hooks+Redux

news/2024/5/8 11:12:30/文章来源:https://blog.csdn.net/Miketutu/article/details/130395676

1、redux-logger中间件

 

1️⃣:安装redux-logger依赖包

 yarn add redux-logger

2️⃣:在store的配置文件index中配置

 import {legacy_createStore as applyMiddleware,applyMiddleware} from 'redux'import counterReducer from './counterReducer'import {composeWithDevTools} from 'redux-devtools-extension'import logger from 'redux-logger'const store=createStore(counterReducer,composeWithDevTools(applyMiddleware(logger)))export default store

购物车

1️⃣:在actionType.js文件中编写代码

 export const GETSHOPCARLIST = 'getShopCarList'

2️⃣:在action文件下创建shopAction.js,action是一个对象,里面有个type属性,,主要是组件通过type来通知action需要更新数据。

 import * as actionTypes from './actionTypes'export const getShopCarList = (payload)=>({type:actionTypes.GETSHOPCARLIST,payload})

⚠️:payload为组件传的值

3️⃣:编写reducer,reduce响应action通知对象,经过处理,将通过return 将state发送给store

 import * as actionTypes from '../action/actionTypes'const shopCarReducer = (state={shopcarList:[]},action)=>{switch(action.type){case actionTypes.GETSHOPCARLIST:return {...state,shopcarList:action.payload}default:return state}}export default shopCarReducer

⚠️:...state解构,将action中的值赋给shopcarList

4️⃣:在组件中分别入Hooks组件:useSelector``useDispatch

useDispatch:调用useDispatch(),可以直接获取到dispatch方法,用来发送action

useSelector:参数为回调函数,在回调函数中可以获取到仓库的状态,然后通过return出数据,用一个变量来接,然后正常使用

 import React ,{useEffect,useMemo,useRef}from 'react'import {useDispatch, useSelector} from 'react-redux'export default function ShopCar(){const dispatch = useDispatch()const list = useSelector((state)=>{return  state.shopCart.shopcarList})return (<div><Table columns={column} dataSource={list} rowKey={'_id'} bordered={true} pagination={false}></Table><div>总价:{totalPrice}</div></div>)}

⚠️:通过useEffect,调用dispatch(getShopCarListAsync)获取购物车列表内容

5️⃣编写thunk的异步方法

  • 安装redux-thunk依赖

 yarn add reduc-thunk
  • 导入thunk

 import thunk from 'redux-thunk'
  • 使用thunk

 const store=createStore(bigReducer,composeWithDevTools(applyMiddleware(thunk)))

redux的作用:让dispatch方法能够接收函数作为参数

6️⃣:编写redux-logger

 import logger from 'redux-logger'const store=createStore(counterReducer,composeWithDevTools(applyMiddleware(logger)))

redux-logger是为了打印日志,记录日志

7️⃣:在store入口文件引入shopReducer,并且将shopReducer放入createStore函数中.

 import {legacy_createStore as createStore,applyMiddleware,combineReducers} from 'redux'import shopCarReducer from './shopReduce/shopReduce'const bigReducer = combineReducers({shopCart:shopCarReducer})const store=createStore(bigReducer,composeWithDevTools(applyMiddleware(logger,thunk)))export default store

8️⃣:将store注册到全局,使用Redux的Provider,

 import { Provider } from 'react-redux'root.render(<Provider store={store}><App></App></Provider>)

Redux的Provider是React-Redux库提供的一个组件,它可以将Redux store传递给整个React应用程序。在使用React-Redux时,我们需要在应用程序的最顶层使用Provider组件,以便所有的子组件都能访问到Redux store中的状态数据。

9️⃣编写shopAsync异步文件

  • 导入axios

 import axios from "axios"
  • 导入shopAction文件

 import {getShopCarList} from '../action/shopAction'
  • 编写thunk的异步方法

 export const getShopCarListAsync = async(dispatch,getState)=>{const {data:{data}} = await axios.get('http://www.zhaijizhe.cn:3001/shopcart/getShopcartData') dispatch(getShopCarList(data))}

reudx-thunk的异步方法是异步回调函数

该回调函数参数说明如下

第1个参数:dispatch对象(是redux原生的dispatch对象)

第2个参数:getState():获取store仓库中的state的方法

⚠️: dispatch(getShopCarList(data))将获取到的列表数据传给action,action接收到值后通过shopReducer将值保存到仓库中

🔟:改变数量的方法

  • 在shopAsync异步文件中编写改变数量的异步方法

export const changeCheckedAsync = (arg)=>{return async(dispatch,getState)=>{console.log('arg',arg);const result = await axios.get(`http://www.zhaijizhe.cn:3001/shopcart/checkProducts?_id=${arg}`)console.log(result.data.code);if(result.data.code==1){console.log(123);dispatch(getShopCarListAsync)}}}

组件dipatch发送action需要传值后,因为reudx-thunk接受值为dispatch,getState,但是调用接口需要传参,这时就需要将changeCheckedAsync改造为回调函数,这样子就能接受到组件传来的值,然后将异步请求函数return出去

11:编写勾选的异步代码:

 export const changeCheckedAsync = (arg)=>{return async(dispatch,getState)=>{console.log('arg',arg);const result = await axios.get(`http://www.zhaijizhe.cn:3001/shopcart/checkProducts?_id=${arg}`)console.log(result.data.code);if(result.data.code==1){console.log(123);dispatch(getShopCarListAsync)}}}

12:组件代码遇到的问题

  1. 在使用antd-design中的Input组件,需要获取Input的值,通过useRef来获取值

  {title:'输入购买量',width:'150px',render:(text)=>{return <Input style={{width:'150px'}}  defaultValue={text.num} ref={inputnum}  onBlur={()=>{NumInput(text._id)}}></Input>}},

这里需要注意的是用的是onBlur事件

  1. Table组件中获取该行的值,通过text参数,参数text拿到的是该行的对象

 title:'小计',align:'center',render:(text)=>{let data = text.price*text.numreturn data.toFixed(2)}

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

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

相关文章

ASM磁盘组增加磁盘

续昨天的问题&#xff0c;DATA磁盘组空间不足的问题&#xff0c;客户也紧张&#xff0c;一早就讨论方案&#xff0c;新增2个2T的磁盘&#xff0c;将原来2个500G磁盘下线&#xff0c;下午存储端配置后&#xff0c;下面就是主机和数据库的事情&#xff08;为了避免客户信息泄露&a…

vue总线bus的使用和移除注意事项

vue总线bus的使用和移除注意事项 本文目录 vue总线bus的使用和移除注意事项初始化并封装发送事件接收事件移除事件监听实际使用正确测试效果错误测试效果 初始化并封装 在main.js中对bus进行初始化&#xff0c; Bus是一个不具备 DOM 的组件&#xff0c;它具有的仅仅只是它实例…

Codeforces Round 867 (Div. 3) (E-G)

Problem - E - Codeforces &#xff08;1&#xff09;题目大意 给你一个字符串&#xff0c;问你让字符串每一对相对应位置都不同的最小操作数是多少&#xff1f;&#xff08;A[i]和A[n - i],A[i 1]和A[n - i - 1]&#xff09; &#xff08;2&#xff09;解题思路 1.首…

十三、51单片机之EEPROM(I2C)

1、EEPROM简介 (1)存储设备类型&#xff1a;ROM、RAM、PROM(可编程ROM)、EPROM(可擦除ROM)、EEPROM(电可擦除ROM)。 (2)为什么需要EEPROM&#xff1f; 某些数据内容我们需要掉电不丢失且在程序运行中可以修改这些数据内容&#xff0c;这就需要用到EEPROM。 (3)EEPROM和flas…

毕业-单片机-嵌入式~三年经历回顾

入行嵌入式软件开发 20年6月疫情第一次缓和、实操51单片机&#xff1b;20年9月郑州实习、温湿度采集类低功耗产品、初次接触ARM Cortex M0/M3 单片机&#xff1b;21年5月毕业来到杭州、不懂应届生的宝贵青春&#xff01;匆匆忙忙进厂&#xff5e;人生中第一个项目&#xff1a;…

简单理解内存分页机制

文章目录 1.CPU寻址方式2.段式内存访问的缺点3.80386两级页表4.PAE三级页表5.x64四级页表6.虚拟内存 思考一个问题&#xff1a;如果没有这样的分页机制时应用程序是怎么访问物理内存地址&#xff1f; 1.CPU寻址方式 Effective Address Base (Index * Scale) Displacement …

CAD DLL 15 crack增加了对SLDASM、FSAT

CAD DLL 15 crack增加了对SLDASM、FSAT 改进的3D&#xff1a; 提高了打开三维文件的速度。 提高了SAT、STEP、SLDPRT、X_T、X_B、OBJ格式的阅读能力。 增加了对SLDASM、FSAT、SAB、SMT、IPT、IFC格式的支持。 增加了导出为SAT、SAB、STL、OBJ格式的功能。 改进了SAT、STE…

在f1tenth仿真中如何实现更快速的跑圈-曲线分析篇

本文使用蓝桥云课&#xff0c;即开即用&#xff0c;如果配置第三方课程资源&#xff0c;通常也在10分钟内完成。 效果如下&#xff1a; 全部参考资料如下&#xff1a; 蓝桥ROS之f1tenth案例学习与调试&#xff08;失败&#xff09; 蓝桥ROS之f1tenth案例学习与调试&#xff…

Salesforce官方_中文学习、考证资源

Salesforce将Trailhead描述为学习热门技能的有趣且免费的平台。该平台有助于缩小技能差距&#xff0c;是所有Salesforce用户的宝藏资源。 Trailhead适合所有学习者。它涵盖了适用于Salesforce任何角色的主题和学习模块&#xff0c;从管理员、开发人员、销售主管到最终用户。学…

第7章 “字典”

1.字典简介 字典是什么&#xff1f; 解答&#xff1a;与集合类似&#xff0c;也是一种存储唯一值的数据结构&#xff0c;但它是以键值对的形式来存储。(键值对是最重要的特性)在Es6中新增了字典&#xff0c;名为Map字典的常用操作&#xff1a;增删改查 const map new Map()/…

免费ChatGPT接入网站-网站加入CHATGPT自动生成关键词文章排名

网站怎么接入chatGPT 要将ChatGPT集成到您的网站中&#xff0c;需要进行以下步骤&#xff1a; 注册一个OpenAI账户&#xff1a;访问OpenAI网站并创建一个账户。这将提供访问API密钥所需的身份验证凭据。 获取API密钥&#xff1a;在您的OpenAI控制台中&#xff0c;您可以找到您…

OSCP-Nickel(爆破pdf、本地http提权)

目录 扫描 HTTP 提权 扫描 FileZilla不接受匿名FTP登录。 端口21上的SSH和3389上的RDP很少是初始入口点,但是如果遇到一些凭据,可以记住这一点。 HTTP 打开Web浏览器并导航到端口8089和3333,用于的HTTP服务器。端口8089似乎是某种类型的开发环境。 单击一个按钮重定向到…

Tomcat 配置与部署

http 协议就是 http 客户端和 http 服务器之间通信的协议 , 而Tomcat 就是 java 圈子中最广泛使用的 http 服务器. 下载Tomcat Tomcat官网 Tomcat 的版本 , 和后续的 servlet 版本是强相关的 , 此处使用 tomcat 8 , 对应的 servlet 就是 3.1 下载一个 zip 压缩包解压缩即可 T…

输入 jupyter notebook 报错 ModuleNotFoundError: No module named ‘pysqlite2‘ 解决方案

今天在cmd命令行中输入jupyter notebook想要打开jupyter时&#xff0c;出现了以下问题&#xff1a;即找不到模块‘pysqlite2’。 找到出问题的文件“sessionmanager.py”&#xff0c;发现出问题的地方在于&#xff1a;尝试导入sqlite3没有导致失败 因此&#xff0c;以下是解决…

java反转字符串的方法

1、首先我们定义一个方法&#xff0c;用来反转字符串。用 public static void &#xff08;String&#xff09;方法初始化一个对象&#xff0c;然后使用 private static &#xff08;&#xff09;方法对该对象进行初始化&#xff0c;并检查是否有某个字符串和字符串本身相同&am…

复现Nginx 解析漏洞

目录 漏洞原理 漏洞复现 编译环境 制作图片马 一&#xff1a;随便弄一张图片 二&#xff1a;准备写一个.php文件&#xff0c;写上木马 三&#xff1a;合成图片马 上传图片马 修复漏洞 漏洞原理 1、 由于nginx.conf的如下配置导致nginx把以’.php’结尾的文件交给fast…

科大讯飞版ChatGPT开始内测《讯飞星火》

科大讯飞版ChatGPT产品&#xff0c;提前交卷了&#xff01; 就在昨夜&#xff0c;讯飞骤然向开发者提供了内测通道&#xff0c;取名为讯飞星火认知大模型对外开启内测。 还有个神奇的英文名字Spark Desk&#xff0c;据说有“火花桌面智能助手”的意思。 申请的过程很简单。用…

leetcode21 - - 合并两个有序链表

文章目录 1.题目描述2.解题思路方法1&#xff1a;方法2&#xff1a; 1.题目描述 题目链接&#xff1a;力扣21&#xff0c;合并两个有序链表 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 2.解题思路 方法1&#xff1a;…

Docker安装mysql8.0文档

第一步需要安装Docker基础环境&#xff0c;具体可以看看这篇 docker基础篇 第二步&#xff0c;拉取mysql8.0的镜像 docker pull mysql:8.0 第三步&#xff0c;镜像启动和文件挂载 复制下面命令执行&#xff0c;33006是对外访问暴露的端口&#xff0c;当然你也可以设置为3306…

这个假期有这些游戏就不怕无聊了

1、塞尔达传说旷野之息 Switch端的优秀游戏体验不容错过&#xff01; 人气王《塞尔达传说》&#xff01; 被玩家誉为“唯一让人长大后有种回到童年的感觉的作品”。 豆瓣网友写道&#xff1a;“在雨夜&#xff0c;我在寺庙里看到了一条白龙划过天空&#xff0c;在岩壁上看到了…