useReducer与useContext组合实现跨组件的状态管理
useReducer 参数 1:reducer 函数,参数2:state的初始值。reducer函数接受两个参数 state、 action 。返回一个新的state 和 dispath,dispatch用来发布事件更新 state。
下面的例子中,父组件定义state、dispatch,通过Context与子组件公用state、dispatch。从而实现跨组件的状态管理。
index.react.js
import React, { useReducer } from "react";
import reducer from "../reducer";
import SelectedList from "./selectedList/index.react";
function ChooseMemeber ({listData}) {
const MemeberContext = createContext();
const [state, dispatch] = useReducer(reducer, {
selectedList: [],
isShow: false
});
const {selectedList, isShow} = state;
useEffect(() => {
dispatch({ type: 'saveSelectedList', payload: [...listData] });
}, [listData])
return (
<MemeberContext.Provider value={{ state, dispatch }}>//公用参数
<SelectedList />
</MemeberContext.Provider>
)
}
reducer.js
function reducer(state, action) { switch (action.type) { case 'saveSelectedList': return {...state, selectedList: action.payload} case 'isShow': return {...state, isShow: action.payload} default: return state } } export default reducer
selectedList/index.react
import React, { useContext } from "react";
import { MemeberContext } from "../../index.react";
function SelectedList () {
const memberCtx = useContext(MemeberContext);
const { state: {selectedList}, dispatch } = memberCtx;
const selectItem = (info, key) => {
//todo selectedList
dispatch({type: 'saveSelectedList', payload: [...selectedList]})
}
return (
<div>
{selectedList.map(data => {
return <div>data.name</div>
})}
</div>
)
}
export default SelectedList
useReducer和redux
useReducer 和 redux 十分类似。但是useReducer不是一个整合的store,redux是。
userReducer中的dispatch是各自独立的,不像redux,是共同的。
useReducer和useState
如果你的state被多个component引用,请使用useReducer。

浙公网安备 33010602011771号