Redux学习笔记

Redux基础

Redux 是一个管理全局应用状态的库。

为什么需要Redux?
我们将学习前端的过程,类比做书本生意的过程。在刚开始学习HTML/CSS时,我们能搭建出基础的网页,相当于我们现在已经摆好了一个书摊。后面学习了React,相当于我们将书摊上杂乱无章的书,分门别类的放好,开成了一家书店。那后续我们要是想继续扩大规模变成图书馆,怎么管理这些图书呢?我们学习的Redux相当于,给书店安了台电脑,将所有图书的状态统一管理,这就是我们为什么学习Redux。

什么时候需要Redux?
1.用户的使用方式复杂
2.不同用户拥有不同的登陆身份
3.服务器需要大量交互
4.视图层需要从多个来源获取数据

一、环境准备

(1)新建一个React文件,这里将文件命名为learn-redux

npx create-react-app learn-redux

(2)安装redux

npm install redux

二、Redux基础

在我们单纯的使用React创建网页时,在各个组件里都会有很多个状态,非常的零散,如果我们能将状态提取出来放在一起,结构就会变得清晰,这一点Redux就可以帮助我们做到。Redux的操作流程如下,当用户在UI界面进行操作时,Action会通过Dispatch传到Store中,Store里面的Reducer会对状态进行处理,传出新的状态,显示在UI界面上。
在这里插入图片描述

Store

应用状态存储在名为store的对象里,store是通过reducer创建的,具有一个getState()方法。

import { createStore } from 'redux'

const store = createStore({ reducer: counterReducer })
console.log(store.getState())

Action

action 是一个具有 type 字段的普通JavaScript 对象,action里面的内容描述了应用程序中发生的事件。

const increment = () => {
  return {
    type: 'INCREMENT'
  }
}

Reducer

reducer 是一个函数,接收当前的 state 和一个 action 对象,必要时决定如何更新状态,并返回新状态。函数签名是:(state, action) => newState。 我们可以将 reducer 视为一个事件监听器,它根据接收到的 action(事件)类型处理事件。

const counter = (state = 0,  action) => {
  switch(action.type){
  		case 'INCREMENT':
  			return state + 1
  	}	
  }
  let store = createStore(counter);

Dispatch

store.dispatch(increment()); 

三、react-redux

redux是为JS准备的,在react中使用还需要下载使用react-redux。

安装:

npm install redux react-redux

Provider

用Provider对APP进行包裹,这样App内的组件就都可以使用store。

import React from 'react'
import ReactDOM from 'react-dom/client'
import { Provider } from 'react-redux'
import store from './store'
import App from './App'

const root = ReactDOM.createRoot(document.getElementById('root'))
root.render(
  <Provider store={store}>
    <App />
  </Provider>
)

connect

使用connect可以关联组件,比如现在两个组件间要进行信息传递,分别为ComA,ComB。
组件A为发送方,实现mapDispatchToProps参数
组件B为接收方,实现mapStateToProps参数

const ComA = () => {}
const mapDisPatchToProps = (dispatch) =>{
	return {
		sendAction :() => {
			dispatch ({
				type : "add_action"
				})
			}
		}
	};
export default connect(null,mapDispatchToProps)(ComA)
const ComB = () => {}
const mapStateToProps = (state) => {
	return state;
}

export default connect(mapStateToProps)(ComB)

四、redux进阶

1.binActionCreators

在我们用mapDispatchToProps,我们需引用action,那么在页面有很多action时,就会产生麻烦,那么这个时候我们就可以将其打包引用。

import * as countActions from "./action/count"

addClick = () =>{
this.props.countActions.increment()
}

const mapDispatchToProps = (dispatch) => {
	countAction:binActionCreactors(countAction,dispatch);
}

2.传递参数和常量提取

传递参数:

import * as countActions from "./action/count"

addClick = () =>{
this.props.countActions.increment(10)
}

const mapDispatchToProps = (dispatch) => {
	countAction:binActionCreactors(countAction,dispatch);
}

/// action/count.js
increment = (num) =>{
	return (
		type:"ADD",
		num
	)

/// reducer.js
...return state=state+action.num; 

常量提取:
新建一个文件夹,export const INCREMENT="INCREMENT",这样可以避免在书写过程当中产生的常量书写错误不报错,找不到错误的问题。

3.combineReducers

在我们有多组reducer需要合并时,可以用combineReducers

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值