经常用react
的兄弟,一定知道redux-saga
。redux-saga
是redux
的中间件,封装了很多好用的api
。但是随着项目的越来越大,redux本身就显得很重了,再加上redux-saga
,让项目更笨重。所以,越来越多轻量型的react
状态管理工具出现了。最近,我们前端项目在推jotai
,就是这样的工具。
但是,我们这些老家伙,毕竟用了不少年的redux
和redux-saga
,对它的api
更得心应手。再加上很多旧项目都是用的redux-saga
,要对它们进行改造,也是一件费时费力的事情。
因此,我对jotai 进行了二次封装,模拟redux-saga的一些常用的api。
talk is cheap,let's coding.
工具名 @rasir/jotai-redux
封装 jotai 模拟 redux-saga 的 api
安装
npm i @rasir/jotai-redux
使用方法
// APIs
import {
select,
useSelector,
useUpdateStore,
useDispatch,
createStore,
updateState,
getStore,
addStores,
dispatch,
} from "@rasir/jotai-redux";
-
createStore
用于初始化store
const store = createStore({
states: {
user: { id: 1, name: "rasir" },
},
actions: {
user: {
update:async ({type:"user/update",payload},{select,put,update,all}) => {
const {id} = select(({user}) => user);
if(id === payload.id){
await all([
put({type:"user/updateName",payload:payload.name}),
put({type:'user/updateId',payload:payload.id})
])
}
},
updateName:async ({type:"user/updateName",payload},{select,put,update,all}) => {
await update('user',{name:payload});
},
updateId:async ({type:"user/updateId",payload},{select,put,update,all}) => {
await update('user',{id:payload});
},
},
},
});
-
addStores
用于添加store
。参数与createStore
相同,不同点在于,addStores
会合并到已有的store
addStores({
states: { todo: { id: 1, name: "todo1" } },
actions: { todo: { update: () => {} } },
});
-
updateState
用于更新store
中某个state
updateState("user", { name: "rasir2" });
-
getStore
用于获取store
中所有的state
const store = getStore();
-
useSelector
hooks
用于获取store
,用于React
组件中。当store
变化时,会触发react
更新。
const user = useSelector(({ user }) => user);
-
useUpdateStore
hooks
用于更新store
,用于React
组件中。
const update = useUpdateStore("user");
update({ name: "rasir2" });
-
select
用于获取store
,用户函数中获取最新的状态数据,不会触发react更新。
const user = select(({ user }) => user);
-
useDispatch
hooks
用于获取dispatch
,用于React
组件中。用于替代redux
的useDispatch
。获取的dispatch
函数与9
中的是一样的。
const dispatch = useDispatch();
dispatch({ type: "user/update", payload: { id: 2, name: "rasir2" } });
-
dispatch
用于获取触发action
的方法
dispatch({ type: "user/update", payload: { id: 2, name: "rasir2" } });
-
- 高阶组件(
HOC
)connect
类似于react-redux
的connect
,用于将store
中的state
和dispatch
与组件进行绑定
- 高阶组件(
const App = ({ name, update }) => {
return (
<button onClick={() => update({ id: 1, name: "rasir2" })}>{name}</button>
);
};
export default connect(
({ user: { name } }) => ({ name }),
(dispatch) => ({
update: (payload) => dispatch({ type: "user/update", payload }),
})
)(App);