store 目录下

store/reducer.js

import * as actionTypes from './constants'const initalState = {counter: 100,banners: [],recommends: []
}/*** 定义reducer函数:纯函数* @param 参数一:store中目前保存的state* @param 参数二:通过 dispatch 传过来的 action* @returns 返回值:此函数的返回值,会作为,store的最新的state*/
function reducer(state = initalState, action) {/*** 关于此函数的返回值,*  1、有数据进行更新的时候,返回一个新的state*  2、没有数据更新的时候,返回之前的state*/switch (action.type) {case actionTypes.ADD_NUMBER:return { ...state, counter: state.counter + action.num }case actionTypes.SUB_NUMBER:return { ...state, counter: state.counter - action.num }case actionTypes.CHANGE_BANNERS:return { ...state, banners: action.banners }case actionTypes.CHANGE_RECOMMENDS:return { ...state, recommends: action.recommends }default:return state}
}export default reducer

store/index.js

import { createStore, applyMiddleware } from 'redux'`redux-thunk:一个流行的Redux中间件,允许 dispatch 函数(而不仅是对象)`
import { thunk } from 'redux-thunk'import reducer from './reducer'` 默认情况下,Redux的store.dispatch(object),只能是object,不能是function使用 redux-thunk 可以增强store,就能 store.dispatch(function)store.dispatch(function) store.dispatch一个函数,这个函数会被中间件自动执行!`
`当需要更多的中间件时,只需:applyMiddleware(thunk, xxx, xxx, xxx) 即可 `
const store = createStore(reducer, applyMiddleware(thunk))export default store

store/actionCreators.js(这里的方法们,是在 .jsx组件中使用的)

import * as actionTypes from './constants'
import axios from 'axios'export const addNumberAction = num => ({type: actionTypes.ADD_NUMBER,num
})export const subNumberAction = num => ({type: actionTypes.SUB_NUMBER,num
})export const changeBannersAction = banners => ({type: actionTypes.CHANGE_BANNERS,banners
})export const changeRecommendsAction = recommends => ({type: actionTypes.CHANGE_RECOMMENDS,recommends
})export const fetchHomeMultidataAction = () => {function foo(dispatch, getState) {axios.get('http://121.200.320.20:8180/home/multidata').then(res => {const banners = res.data.data.banner.listconst recommends = res.data.data.banner.list// dispatch({ type: actionTypes.CHANGE_BANNERS, banners })// dispatch({ type: actionTypes.CHANGE_RECOMMENDS, recommends })dispatch(changeBannersAction(banners))dispatch(changeRecommendsAction(recommends))})}return foo
}

src 下的 index.js

src/index.js

import React from 'react'
import ReactDOM from 'react-dom/client'`* 步骤1 - 通过 react-redux 库的高阶组件,减少使用过程中 .jsx文件中的冗余代码* Provider :react-redux 库的高阶组件,用于将 Redux 的 store 传递给整个 React 应用,* Provider 必须包裹根组件(如:<App />),并传入 store 作为 prop。`
import { Provider } from 'react-redux'
`2 - import 你的 store`
import store from './store'import App from './App'const root = ReactDOM.createRoot(document.getElementById('root'))root.render(<React.StrictMode>`3 - 必须传入一个store`<Provider store={store}><App /></Provider>`4 - 在具体的.jsx组件中,在子组件(如 about.jsx)中,通过 connect 函数或 useSelector 钩子连接 Redux store,无需手动导入 store。`</React.StrictMode>
)

category.jsx

import React, { PureComponent } from 'react'
import { connect } from 'react-redux'
import { fetchHomeMultidataAction } from '../store/actionCreators'export class Category extends PureComponent {componentDidMount() {this.props.fetchHomeMultidata()}render() {return (<div><h2>Catefory Page</h2></div>)}
}const mapDispatchToProps = dispatch => ({fetchHomeMultidata() {dispatch(fetchHomeMultidataAction())}
})export default connect(null, mapDispatchToProps)(Category)

about.jsx 【含 connect 详解】

import React, { PureComponent } from 'react'
import { connect } from 'react-redux'
import { addNumberAction, subNumberAction } from '../store/actionCreators'export class About extends PureComponent {calcNumber(num, isAdd) {if (isAdd) {this.props.addNumber(num)} else {this.props.subNumber(num)}}render() {const { counter, banners, recommends } = this.propsreturn (<div><h2>about: {counter}</h2><div><button onClick={e => this.calcNumber(6, true)}>+6</button><button onClick={e => this.calcNumber(88, true)}>+88</button><button onClick={e => this.calcNumber(6, false)}>-6</button><button onClick={e => this.calcNumber(88, false)}>-88</button></div><div className="banner"><h2>轮播图数据</h2><ul>{ banners.map((item, index) => {return <li key={index}>{item.title}</li> })}</ul></div><div className='recommend'><h2>推荐数据</h2><ul>{ recommends.map((item, index) => {return <li key={index}>{item.title}</li> })}</ul></div></div>)} // end - render
} // end - class`* connect是一个函数,而且,connect的返回值,是一个高阶函数(高阶函数,接收一个组件作为参数)所以,这个 connect 是这样使用的:connect(fn1, fn2)(about)* fn1函数,会接收一个state【就是store中的state (完整的 Redux state 树)】,作用:将 Redux store 的 state 映射到组件的 props。* fn2函数,会接收一个dispatch((就是store中的dispatch))作用:将 Redux 的 dispatch 方法映射到组件的 props。export default connect(fn1)(fn2)(About) 这样操作之后,就在 About组件中,使用 const { counter } = this.props,即可拿到store的state的counter属性了也可以调用this.props.addNumber(1)、this.props.subNumber(2)* 这个 fn1 是随便写的,一般都用 mapStateToProps* 这个 fn2 是随便写的,一般都用 mapDispatcchToProps
`
function fn1(state) {return {counter: state.counter, `说明,About组件,会使用store的state的counter属性,`` xxx: state.xxx 说明,About组件,会使用store的state的xxx属性,`` 总之,About组件,使用啥,就在这里列出来即可 `banners: state.banners,recommends: state.recommends}
}
const mapStateToProps = state => ({ counter: state.counter })function fn2(dispatch) {`这里 return 的对象的属性,也会被合并到props中 `return {addNumber(num) {dispatch(addNumberAction(num))},subNumber(num) {dispatch(subNumberAction(num))}}
}
const mapDispatcchToProps = dispatch => ({addNumber: num => dispatch(addNumberAction(num)),subNumber: num => dispatch(subNumberAction(num))
})export default connect(fn1, fn2)(About)
// export default connect(mapStateToProps, mapDispatcchToProps)(About)
connect 的工作流程
/*** connect 的工作流程* 1、订阅Store:connect 会让组件订阅 Redux store 的变化* 2、注入Props:mapStateToProps 将需要的 state 片段注入到组件的 propsmapDispatchToProps 将 action 分发函数注入到组件的 props。* 3、自动更新:当 Redux store 的 state 变化时,mapStateToProps 会重新执行,如果返回的数据变化,组件会重新渲染* 4、触发 Action:组件通过 this.props.addNumber() 等方法调用 mapDispatchToProps 返回的函数,触发 Redux action 更新全局状态*/

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

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

相关文章

数据分布是如何影响目标检测精度

文章目录一、研究背景与目标模型效果提升数据集优化二、研究问题明细各方向的关联性与核心逻辑1. 高质量数据集的高效筛选与主动学习应用2. 基于推理结果的数据补充与增强方向优化3. 多类别场景下目标尺度与模型精度的关联性4. 损失函数与数据增强对精度的量化影响5. 目标类型专…

高效批量转换Java接口为MCP服务:降低重复劳动的实战指南

高效批量转换Java接口为MCP服务:降低重复劳动的实战指南 在AI大模型技术飞速发展的今天,企业需要将现有Java接口快速适配为模型计算协议(MCP,Model Calculation Protocol)服务,以便与大模型生态无缝对接。然而,手动逐个转换接口不仅耗时耗力,还容易因人为疏忽导致错误…

Eclipse Debug 配置指南

Eclipse Debug 配置指南 引言 Eclipse 作为一款功能强大的集成开发环境(IDE),在Java开发者中享有盛誉。在开发过程中,调试功能是必不可少的。本文将详细介绍如何在Eclipse中配置调试环境,以便更高效地进行代码调试。 1. 开发环境准备 在开始配置Eclipse调试环境之前,…

modelscope ProxyError: HTTPSConnectionPool(host=‘www.modelscope.cn‘, port=443)

目录 Windows CMD&#xff1a; powershell Linux / macOS / Git Bash&#xff1a; win11 设置全局系统变量代理 modelscope ProxyError: HTTPSConnectionPool(hostwww.modelscope.cn, port443) 报错&#xff1a; requests.exceptions.ProxyError: HTTPSConnectionPool(host…

Python学习之——序列化与反序列化

Python学习之——序列化与反序列化yaml & json & xmlyamljsonPython自带Json库xml一个综合示例pickle & msgpack & marshalpicklemsgpackmarshal自定义导出py文件一个导出py文件的示例yaml & json & xml YAML & JSON &XML 如何选择 yaml Py…

设计模式之代理模式:掌控对象访问的优雅之道

代理模式&#xff1a;掌控对象访问的优雅之道 引言&#xff1a;设计模式的重要性 在软件开发中&#xff0c;设计模式是解决常见问题的可复用方案&#xff0c;它们如同建筑师的蓝图&#xff0c;为开发者提供了经过验证的最佳实践。在23种经典设计模式中&#xff0c;代理模式因其…

sqli-labs靶场通关笔记:第18-19关 HTTP头部注入

第18关 User-Agent注入登录正确的用户名密码&#xff0c;它会将User-Agent的信息回显到页面上。猜测UA头可能存在注入点。利用bp抓包&#xff0c;在UA头后面加一个单引号&#xff0c;发现报错了。观察报错信息&#xff0c;显示nearxx,admin)&#xff0c;推测后面应该还有两个参…

基于按键开源MultiButton框架深入理解代码框架(三)(指针的深入理解与应用)

文章目录3、分析代码3.3 按键的插入3.4 按键的删除3.5 继续分析状态机核心理解4、写在最后的总结5、思想感悟篇6、慈悲不渡自绝人3、分析代码 3.3 按键的插入 // Button handle list headstatic Button* head_handle NULL;/*** brief Start the button work, add the handle…

ACOUSLIC-AI挑战报告:基于低收入国家盲扫超声数据的胎儿腹围测量|文献速递-医学影像算法文献分享

Title题目ACOUSLIC-AI challenge report: Fetal abdominal circumferencemeasurement on blind-sweep ultrasound data from low-income countriesACOUSLIC-AI挑战报告&#xff1a;基于低收入国家盲扫超声数据的胎儿腹围测量01文献速递介绍胎儿生长受限&#xff08;FGR&#xf…

集群聊天服务器各个类进行详解

1.dh.h类定义概要类名&#xff1a; MySQL功能&#xff1a; 简化MySQL的连接、查询和更新操作&#xff0c;提供接口给上层应用使用。成员变量private:MYSQL *_conn;_conn&#xff1a;指向MYSQL结构体的指针&#xff0c;用于代表数据库连接实例。由mysql_init()初始化&#xff0c…

电缆安全双保险:不止防盗,更能防触电的塔能智慧照明守护方案

城市照明、地下车库以及园区路灯所涉及的电缆安全问题&#xff0c;向来都是运维管理方面颇为棘手的难题。在传统的运维管理模式之下&#xff0c;电缆一旦被盗&#xff0c;那么所造成的影响可不小&#xff0c;一方面会带来直接的经济损失&#xff0c;另一方面还极有可能因为线路…

Leetcode刷题营第二十九,三十题:二叉树的中序以及后序遍历

94.二叉树的中序遍历 给定一个二叉树的根节点 root &#xff0c;返回 它的 中序 遍历 。 示例 1&#xff1a; 输入&#xff1a;root [1,null,2,3] 输出&#xff1a;[1,3,2]示例 2&#xff1a; 输入&#xff1a;root [] 输出&#xff1a;[]示例 3&#xff1a; 输入&#x…

Rabbitmq Direct Exchange(直连交换机)可以保证消费不被重复消费吗,可以多个消费者,但是需要保证同一个消息,不会被投递给多个消费者

在 RabbitMQ 中&#xff0c;默认情况下&#xff0c;不能保证消息不被重复消费&#xff0c;但可以通过 队列绑定方式 消费者竞争机制 来确保 同一消息只被一个消费者处理。以下是几种可行的方案&#xff1a;方案 1&#xff1a;单队列 竞争消费者模式&#xff08;默认行为&…

常用的OTP语音芯片有哪些?

唯创知音在 OTP 语音芯片有着26年的历史&#xff0c;有着丰富的技术积累与产品迭代历程。1999 年&#xff0c;唯创知音在广州成立&#xff0c;彼时便开始在电子领域积极探索。2000 年&#xff0c;公司敏锐捕捉到语音芯片行业的发展潜力&#xff0c;正式进军该领域。经过数年技术…

分布式光伏发电系统中的“四可”指的是什么?

在分布式光伏电站规模爆发式增长的今天&#xff0c;“看不见、管不住、调不动”的难题却成为行业痛点。如何让散布各处的光伏电站真正成为稳定高效的“绿色能量站”&#xff1f;2025年《分布式光伏发电开发建设管理办法》大型工商业项目&#xff08;≥6MW&#xff09;明确要求具…

健康管理系统新趋势:AI + 物联网如何重塑健康管理

一、传统健康管理的痛点与变革之必然长久以来&#xff0c;我们熟悉的健康管理方式存在明显局限&#xff1a;数据孤岛严重&#xff1a;体检报告在抽屉里沉睡&#xff0c;健身手环数据仅存于手机&#xff0c;不同医疗机构信息互不相通&#xff0c;个人健康信息犹如碎片散落各处。…

git基本操作【GIT-2】

git基本操作初始化一个仓库&#xff08;repository&#xff09;、开始或停止跟踪&#xff08;track&#xff09;文件、暂存&#xff08;stage&#xff09;或提交&#xff08;commit&#xff09;更改如何配置 Git 来忽略指定的文件和文件模式、如何迅速而简单地撤销错误操作、如…

【数据准备】——深度学习.全连接神经网络

目录 1 数据加载器 1.1 构建数据类 1.1.1 Dataset类 1.1.2 TensorDataset类 1.2 数据加载器 2 数据加载案例 2.1 加载csv数据集 2.2 加载图片数据集 2.3 加载官方数据集 2.4 pytorch实现线性回归 1 数据加载器 分数据集和加载器2个步骤~ 1.1 构建数据类 1.1.1 Dat…

健康生活,从细节开始

健康生活&#xff0c;从细节开始在当今快节奏的生活中&#xff0c;健康逐渐成为人们关注的焦点。拥有健康的身体&#xff0c;才能更好地享受生活、追求梦想。那么&#xff0c;如何才能拥有健康呢&#xff1f;这就需要我们从生活中的点滴细节入手&#xff0c;培养良好的生活习惯…

javax.servlet.http.HttpServletResponse;API导入报错解决方案

javax.servlet.http.HttpServletResponse;API导入报错解决方案与Postman上传下载文件验证 1. 主要错误&#xff1a;缺少 Servlet API 依赖 错误信息显示 javax.servlet.http 包不存在。这是因为你的项目缺少 Servlet API 依赖。 解决方案&#xff1a; 如果你使用的是 Maven&…