react react-redux数据共享学习记录

news/2024/7/15 18:40:17 标签: react.js, 学习, javascript

react react-redux数据共享

  • 1.目的
  • 2.数据共享版本
    • 2.1Person模块的添加
      • 2.1.1 Containers下的Person
      • 2.1.2 actions下的person.js
      • 2.1.3 reducers下的person.js
    • 2.2 store.js的改写!
    • 2.3 组件中取出状态的时候,记得“取到位”
  • 3.纯函数

1.目的

前面的react和react-redux的使用也只是一个容器组件+一个UI组件和redux进行交互,实际上并没有实现数据共享的目的,没有其他的容器组件+UI组件来进行共享.最终实现的小效果:
在这里插入图片描述

2.数据共享版本

文件目录结构:
在这里插入图片描述

2.1Person模块的添加

2.1.1 Containers下的Person

javascript">import React, { Component } from 'react'
import {nanoid} from 'nanoid'
import {connect} from 'react-redux'
import {createAddPersonAction} from '../../redux/actions/person'

class Person extends Component {

	addPerson = ()=>{
		const name = this.nameNode.value
		const age = this.ageNode.value
		const personObj = {id:nanoid(),name,age}
		this.props.jiaYiRen(personObj)
		this.nameNode.value = ''
		this.ageNode.value = ''
	}

	render() {
		return (
			<div>
				<h2>我是Person组件,上方组件求和为{this.props.he}</h2>
				<input ref={c=>this.nameNode = c} type="text" placeholder="输入名字"/>
				<input ref={c=>this.ageNode = c} type="text" placeholder="输入年龄"/>
				<button onClick={this.addPerson}>添加</button>
				<ul>
					{
						this.props.yiduiren.map((p)=>{
							return <li key={p.id}>{p.name}--{p.age}</li>
						})
					}
				</ul>
			</div>
		)
	}
}

export default connect(
	state => ({yiduiren:state.peoples,he:state.he}),//映射状态
	{jiaYiRen:createAddPersonAction}//映射操作状态的方法
)(Person)

2.1.2 actions下的person.js

javascript">import {ADD_PERSON} from '../constant'

//创建增加一个人的action动作对象
export const createAddPersonAction = personObj => ({type:ADD_PERSON,data:personObj})

2.1.3 reducers下的person.js

javascript">import {ADD_PERSON} from '../constant'

//初始化人的列表
const initState = [{id:'001',name:'tom',age:18}]

export default function personReducer(preState=initState,action){
	// console.log('personReducer@#@#@#');
	const {type,data} = action
	switch (type) {
		case ADD_PERSON: //若是添加一个人
			return [data,...preState]
		default:
			return preState
	}
}

2.2 store.js的改写!

javascript">/* 
	该文件专门用于暴露一个store对象,整个应用只有一个store对象
*/

//引入createStore,专门用于创建redux中最为核心的store对象
import {createStore,applyMiddleware,combineReducers} from 'redux'
//引入为Count组件服务的reducer
import countReducer from './reducers/count'
//引入为Person组件服务的reducer
import personReducer from './reducers/person'
//引入redux-thunk,用于支持异步action
import thunk from 'redux-thunk'

//汇总所有的reducer变为一个总的reducer
const allReducer = combineReducers({
	he:countReducer,
	peoples:personReducer
})

//暴露store
export default createStore(allReducer,applyMiddleware(thunk))

这里也是重点,最后注意

2.3 组件中取出状态的时候,记得“取到位”

在这里插入图片描述
根据store.js中定义暴露的就行对应

3.纯函数

将reducers下的person.js文件代码改变一下:

javascript">import { ADD_PERSON } from '../constant'

//初始化人的列表
const initState = [{ id: '001', name: 'tom', age: 18 }]

export default function personReducer(preState = initState, action) {
	// console.log('personReducer@#@#@#');
	const { type, data } = action
	switch (type) {
		case ADD_PERSON: //若是添加一个人
			console.log('动辄来了')
			preState.unshift(data)
			console.log(preState)
			return preState
		// return [data,...preState]
		default:
			return preState
	}
}

看着完全没有毛病的,只是换了一种写法嘛,但是问题就来了!!!
在这里插入图片描述
根据控制台看得出是执行了方法了的,但是页面没有反映出来。为什么呢
参考:添加链接描述
在这里插入图片描述

通过源代码,我们发现,var nextStateForKey = reducer(previousStateForKey, action), nextStateForKey就是通过 reducer 执行后返回的结果(state),然后通过hasChanged = hasChanged || nextStateForKey !== previousStateForKey来比较新旧两个对象是否一致,此比较法,比较的是两个对象的存储位置,也就是浅比较法,所以,当我们 reducer 直接返回旧的 state 对象时,Redux 认为没有任何改变,从而导致页面没有更新。

所以react也规定reducer必须是纯函数,纯函数我理解的就是:
1.参数相同,输出结果相同
2.不能对参数再进行赋值改变
3.不能出现Math.random(),Data.now()之类的产生不确定因素的结果的方法
4.不能调用异步接口,也会受网络等影响导致结果不一致


http://www.niftyadmin.cn/n/106019.html

相关文章

把 ChatGPT 加入 Flutter 开发,会有怎样的体验?

前言 ChatGPT 最近一直都处于技术圈的讨论焦点。它除了可作为普通用户的日常 AI 助手&#xff0c;还可以帮助开发者加速开发进度。声网社区的一位开发者"小猿"就基于 ChatGPT 做了一场实验。仅 40 分钟就实现了一个互动直播 Demo。他是怎么做的呢&#xff1f;他将整个…

Mysql 常用日期处理函数

Mysql 常用日期处理函数 1 建表语句 SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS 0; -- ---------------------------- -- Table structure for emp -- ---------------------------- DROP TABLE IF EXISTS emp; CREATE TABLE emp (EMPNO int(4) NOT NULL,ENAME varchar(10…

密码学基础概念

把一段原始数据通过某种算法处理成另外一种数据&#xff08;原始数据为明文&#xff0c;处理后的数据为密文&#xff09;。明文->密文&#xff1a;称之为加密。密文->明文&#xff1a;称之为解密。 在加密过程中我们需要知道下面的这些概念&#xff1a; 1&#xff09;明文…

如何管理好仓库/库房?

仓库管理是企业管理中不可缺少的一部分&#xff0c;事关企业能否正常运行的关键之一&#xff0c;古人有云&#xff1a;“三军未动粮草先行”&#xff0c;一个企业仓库管理做不好&#xff0c;他的生产管理肯定也是做不好的&#xff0c;不是说生产管理人员的管理能力不具备&#…

Eureka注册中心-Ribbon负载均衡

1、Eureka注册中心服务注册与发现提供了一个服务注册中心、服务发现的客户端&#xff0c;还有一个方便查看所有注册的服务的界面。所有的服务使用Eureka的服务发现客户端来将自己注册到Eureka的服务器上。1.1 、Eureka的结构和作用1.1.1、Eureka的作用1.1.2、获取地址信息的流程…

一起了解井用污水采样器——让井下污水采样更人性化

井用采样器的工作环境比较特殊。比如&#xff1a;雨水管网、窨井、污水井、排污口、下水道&#xff0c;海洋、河流、沟渠等恶劣狭小的环境。这就要求采样设备小巧灵活&#xff0c;方便环境检测执法检查人员在排污井、检查井、雨水管网等特殊环境中进行水质采样。 **井用采样器主…

华为OD机试题,用 Java 解【最多等和不相交连续子序列】问题

最近更新的博客 华为OD机试题,用 Java 解【停车场车辆统计】问题华为OD机试题,用 Java 解【字符串变换最小字符串】问题华为OD机试题,用 Java 解【计算最大乘积】问题华为OD机试题,用 Java 解【DNA 序列】问题华为OD机试 - 组成最大数(Java) | 机试题算法思路 【2023】使…

【博学谷学习记录】超强总结,用心分享丨人工智能 Pandas数据分析 数据可视化方法总结

目录MatplotlibPandasSeaborn单变量双变量多变量Matplotlib 两种作图方式&#xff1a; # 状态接口 fig, ax plt.subplots(figsize(15,3)) #创建坐标轴对象 ax.plot(x, y) #调用坐标轴的绘图方法 ax.set_xlim(-4, 8) # 调用坐标轴的设置x轴上下限的方法 ax.set_ylim(0, 11) …