一,前言
1.redux
是一个状态管理器,集中管理了应用状态,并且以确定的规则来修改状态,在大型应用中切确的规则使状态的变化更易追踪。
2.不仅react
可以使用redux
来管理状态,其他地方若需要状态管理器都可以使用redux
。
二,安装
1.使用npm
管理工具安装redux
:npm install redux
三,redux
入口
1.redux
的入口是store
:store
是redux
的重要概念,像一个容器仓库集中管理了所有组件的state
。
2.在redux
中我们使用createStore
来初始化一个容器store
,该函数接受一个reducers
函数作为参数。
import { createStore } from 'redux';
const store = createStore({...})
3.redux
是单一数据源,整个应用的 state
被储存在一棵 object tree
中,并且这个 object tree
只存在于唯一一个 store
中,因此我们只需要创建一个store
实例。
四,状态state
和修改状态reducers
1.state
是一个对象,用于定义所有状态,reducers
是唯一能修改state
的地方。在redux
中,通常这两个写在同一个文件,因此放在一起讲。
//一个reducers.js文件示例
const initState={
name:'ll',
age:24,
}
function reducers(state={...initState}, action){
switch(action.type){
case 'add':
return {...state,action.payload}
case xxx:
return {...state,action.payload}
}}
export default reducers
2.reducers
定义了如何根据action.type
来修改state
,函数的第一个参数是初始状态state
,第二个参数是redux
另一个重要的概念action
(包含改变的类型type
和提交载荷payload
)
3.combineReducers
: 用于拆分reducers
,当状态比较多,又没有关联时,我们更倾向对状态进行拆分,使代码更加清晰,combineReducers
可以将拆分的reducers
合并。
import {combineReducers} from 'redux';
reducers1(state={},action){
switch(action.type){
return {...state,...action.payload}},
}
reducers2(state={},action){
switch(action.type){
return {...state,...action.payload}},
}
export default combineReducers({reducer1,reducers2})
五,store
实例方法
1.store.getState()
: 用于生成state
某个时刻的快照。
2.store.dispatch()
: 用于发起一个action
,action
是一个对象:{type:‘xxx’,payload:{}}
。其中type
必须定义。
3.store.subscribe()
:接受一个函数listener
,当state
发生变化时,即会执行listener
,若是在react
中使用,需要在此时重新渲染view
。
六,react-redux
1.为了方便使用,Redux
的作者封装了一个 React
专用的库 React-Redux
2.在react-redux
中store
的定义和原生redux
一样,但是提供了高阶函数connect
和组件Provider
将store
状态和ui
组件关联起来
3.connect
函数函数返回一个高阶组件,用于赋予组件状态量。被connect
包装的组件,props
中会自动含有dispatch
,match
,history
等属性,state
需要通过mapStateToProps
函数参数声明。
function mapStateToProps(state){
return {...state}
} //mapStateToProps会订阅 Store,每当state更新的时候,就会自动执行,重新计算 UI 组件的参数,从而触发 UI 组件的重新渲染。
function mapDispatchToProps(dispatch,state){
a:()=>{dispatch({type:'xxx',payload:{}})}
}
connect(mapStateToProps,mapDispatchToProps)(<App/>) //使用了connect包装的组件含有dispatch函数
4.Provider
容器组件,将reducers
的state
和UI
组件真正连接起来。
<Provider store={store}>
<App/>
</provider>