经常用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();
-
useSelectorhooks用于获取store,用于React组件中。当store变化时,会触发react更新。
const user = useSelector(({ user }) => user);
-
useUpdateStorehooks用于更新store,用于React组件中。
const update = useUpdateStore("user");
update({ name: "rasir2" });
-
select用于获取store,用户函数中获取最新的状态数据,不会触发react更新。
const user = select(({ user }) => user);
-
useDispatchhooks用于获取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);