1、什么是redux?
一个组件里可能会有很多的状态,比方管制某个内容显示的flag,从后端获取的展现数据,那么这些状态能够在本人的单个页面进行治理,也能够抉择别的治理形式,redux就是是一种状态治理的形式。
2、为什么要用redux?
(1) 数据共享,当咱们的很多页面都要用到同一数据时,就能够把数据放到redux中,达到状态共享的目标。
(2) 合并治理状态,业务当中可能会有很多的状态须要保护,且各个状态之间可能还有相互依赖的关系,不对立治理的话很难追踪状态的变动。
3、redux的根底概念
(1) store
store是一个仓库,用来存储数据,它能够获取数据,也能够派发数据,还能监听到数据的变动。
(2) action
action了解为动作,action的值个别为一个对象,格局如 { type: “”, data: “” },type是必须要的,因为reducer解决数据的时候要依据不同的type来进行不同的操作。
(3) reducer
reducer是初始化以及解决派发的action的纯函数。
4、如何应用redux?
首先装置redux的依赖,npm i redux -D
(1) 定义action
export const countAction = (num) => ({ type: "ADD_NUMBER",data: num })
(2) 定义解决的action的reducer
export function counterReducer(prevState = 0, action){
switch(action.type){
case 'ADD_NUMBER':
return prevState + num;
default
return prevState;
}
}
(3) 创立store
import { createStore } from 'redux'
import { counterReducer } from './counterReducer'
export const store = createStore(counterReducer)
到这里,store就创立实现了,在组件里能够间接引入store和action,进行派发action的操作,此时有一个Home的组件,咱们要在这里更改state中的数据。
import { store } from './store'
import { countAction } from './countAction'
store.dispatch(countAction(5))
store.getState() // 5
5、redux的三大外围
(1) 繁多数据源
当咱们有多个数据须要放到redux中治理时,是放在一个对象里,这个对象放在store中治理,尽管redux并没有强制只能创立一个store,然而多个数据源的话不那么容易治理,繁多的数据源能够更好的追踪状态的变动。
(2) state是只读的
想要扭转state,无奈在组件上间接手动批改state的值,这样能够保障状态不会被随便扭转,惟一的形式就是派发action,而是通过集中管理的模式去扭转state。
(3) reducer是纯函数
纯函数指的是有雷同的输出必然有雷同的输入,在这种状况下,不能够批改入参,也不能发送网络申请,也不能进行获取随机数这样的操作,通过reducer将上一个state的状态和以后派发的action连接起来,返回一个新的状态。
6、redux如何进行异步操作?
redux中派发的action默认是只能进行同步的操作的,action被规定为一个对象,那如果想要在redux中进行异步操作,比方发送网络申请该怎么做?
这个时候须要用到中间件,罕用的中间件有redux-thunk和redux-saga,须要装置依赖 npm i redux-thunk -D/ npm i redux-sage -D
redux-thunk容许派发的action为一个函数,能够在这个函数中进行异步申请,申请执行实现之后再派发一个同步的action,用于批改store中的数据。
redux-saga派发的action依然为一个对象,然而saga在外侧拦挡action,应用生成器函数来监听action,当派发的action中的type为监听的type时,再进行网络申请的发送,以及扭转store中的数据。
这里演示一下redux-thunk,在定义store时,须要将中间件传入
import { createStore, applyMiddleware } from 'redux'
import { counterReducer } from './counterReducer'
import thunk from 'redux-thunk'
export const store = createStore(counterReducer,applyMiddleware(thunk))
action就能够写成函数的模式了
import { countAction } from './countAction'
export const getInfo = (data) => {
return (dispatch) => {
// 执行异步操作,异步操作执行实现后,再派发一个同步的action
// 这里用fetch做一个演示,发送网络申请后,更改之前的count的值
fetch('/')
.then(xhr=>xhr.text())
.then(result=>dispatch(countAction(10)))
}
}
7、拆分reducer
当reducer须要解决的逻辑比拟多时,一个reducer须要进行十分多的switch case的判断,其中有获取异步申请数据的、有全局保留的状态,这时候逻辑就会比拟芜杂,此时能够将reducer拆分,而后再进行合并。
假如此时有两个reducer,别离为 countReducer、userInfoReducer,别离的状态保留在store的countInfo和userInfo,此时能够应用 combineReducer 这个办法来合并
import countReducer from './countReducer '
import userInfoReducer from './userInfoReducer'
import { combineReducers } from 'redux'
const reducer = combineReducers({
countInfo: countReducer,
userInfo: userInfoReducer
})
export default reducer
此时返回的reducer依然是一个纯函数,combineReducer这个函数就是顺次执行传入的reducers,如果store里贮存的值产生了变动,就返回新的state,如果没有变动,就返回原来的state。
发表回复