状态管理使用样例
创始人
2024-03-02 18:53:10
0

什么是状态管理

在react中,我们可以用过props完成一些特定场景下的状态共享,比如父子组件。但是当遇到一些其他场景时,状态共享显得特别繁琐,比如常见的跨级组件,同级组件等。虽然react提供了context API 来试图解决这方面的问题,但是还是不够优雅。现在市面上有很多优秀的状态管理库,我们一起分析看看那个更适合我们。

Redux

特点:

    • 三大原则:单向数据流,state只读,只能通过reduce修改,reducer必须是一个纯函数。
    • 由store,reducer,action三部分组成。store用于存放数据,reducer是触发action之后调用的更新方法更新store,action用于调用reducer。
    • redux是js的状态管理库,在react更好的使用需要搭配react-redux。
    • 不支持异步处理。需要使用三方异步中间件 。(redux-thunk,redux-saga)
    • 有一定的上手成本,需要按照规范定义模版结构,也因此是大型项目状态管理的首选方案。
// main.js
import store from './store';  
import { Provider } from 'react-redux';ReactDOM.createRoot(document.getElementById('root') as HTMLElement).render(
);// store.js
import { applyMiddleware, legacy_createStore as createStore, compose } from 'redux';
import reducer from './reducer';
import thunk from 'redux-thunk';
const composeEnhancers = window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ || compose;
const store = createStore(reducer, composeEnhancers(applyMiddleware(thunk)));
export default store;// reducer.jsimport { combineReducers } from "redux";import { reducer as IndexReducer } from '@/pages/index/store';export default combineReducers({Index: IndexReducer,
})

Mobx

特点:

    • 响应式数据流,监听数据变化暴漏给所有依赖的观察者组件。
    • 上手相对于redux简单,自由化相对较高。(适合中小型项目,不适合多人开发)
    • 支持异步。
// store.js
import { action, observable, makeObservable } from 'mobx';class Store {constructor() {makeObservable(this, {count: observable,list: observable,setCount: action,setList: action})}count = 1;list = {};setCount() { this.count++ };setList(data) { this.list = data };
}export const store = new Store();// demo.js 
import { useObserver, useLocalStore } from 'mobx-react';
import { store } from './store';
const Demo1 = () => {const localStore = useLocalStore(() => store);const addCount = () => {localStore.setCount()}const changeList = () => {localStore.setList({ name: 'kobe' })}return useObserver(() =>

count:{localStore.count}

list:{localStore.list.name}

) } export default Demo1;

Recoil

特点:

    • 与redux相似,在根组件用过RecoilRoot包裹,通过context传递上下文。
    • 使用atom(无依赖),selector(有依赖)创建数据。
    • 上手简单,没有那么多条条框框,直接简单粗暴的定义,修改即可完成使用。
import { atom, selector } from 'recoil';export const countState = atom({key: 'countState',default: 0
})export const dataListState = atom({key: 'dataListState',default: {}
})export const dataState = selector({key: 'dataState',get: ({ get }) => {const count = get(countState);const dataList = get(dataListState);return {count,dataList}}
})//  消费 
import { useRecoilState, useSetRecoilState,useRecoilValue,useResetRecoilState } from 'recoil';const [count, setCount] = useRecoilState(countState); // 与useState类似,提供读写方法
const setDataList = useSetRecoilState(dataListState); // 仅修改
const { count, dataList } = useRecoilValue(dataState);// 只读
const reset = useResetRecoilState(dataState);// 重置

Zustand

特点:

    • 通过create创建数据,在回调方法中暴漏set,get等api用于读写当前数据。
    • 上手简单,写法上与Recoil类似。
    • 支持异步。
// store.js
import create from "zustand";const useStore = create((set) => ({votes: 0,list: {},addVotes: () => set(state => ({ votes: state.votes + 1 })),subVotes: () => set(state => ({ votes: state.votes - 1 })),getList: async () => {const data = await mockData();set({ list: data })}
}))
export { useStore }// demo.js
import { useStore } from './store';
import shallow from 'zustand/shallow';
const Demo1 = () => {const { addVotes, subVotes, getList } = useStore(state => ({ addVotes: state.addVotes, subVotes: state.subVotes, getList: state.getList }), shallow);// const subVotes = useStore(state => state.subVotes);return 
}export default Demo1;

Dva

特点:

    • react状态管理的轻量框架,dva = react-router + redux + redux-sage + fetch。
    • api简单,上手难度低。
    • 支持异步,与umi搭配之后,复杂度更低。
// app.js
import dva from 'dva';//  Initialize
const app = dva();//  Model
app.model(require('./models/example').default);//  Router
app.router(require('./router').default);//  Start
app.start('#root');// 定义modalimport { mockData } from '../utils/mock'
export default {namespace: 'example',state: {list: {}},reducers: {getlist(state, { data }) {console.log('state====', state);return { ...state, list: data };},},effects: {*getlistAsync({ payload }, { call, put }) {const data = yield call(mockData);yield put({ type: 'getlist', data });},},
};// 消费
import { connect } from 'dva';
import Name from './name'function IndexPage(props) {const { dispatch } = propsconst getlist = () => {dispatch({type: "example/getlistAsync",})};return (
); }const mapStateToProps = (state) => {return {example: state.example,}; }; export default connect(mapStateToProps)(IndexPage);// name 子组件import { connect } from 'dva' const Name = ({ list }) => {return

name:{list.name}

}; const mapStateToProps = (state) => {return {list: state.example.list}; }; export default connect(mapStateToProps)(Name);

引用

Recoil

Mobx

Redux

Zustand

Dva

相关内容

热门资讯

天津港优势货类年中系列推介会成... 转自:新华财经第三届天津国际航运产业博览会期间,天津港集团所属单位于6月11日-13日举办了优势货类...
75亿潜江药企少帅,大卖牛磺酸... 本文字数:2181|预计3分钟读完临危受命,夹缝突围。潜江药企二代,敏感时刻公开露面了。6月13日,...
【文化和自然遗产日】盘点121... 自2006年起,国务院将每年6月的第二个星期六设立为“文化遗产日”,后更名为“文化和自然遗产日”,以...
杭州警方通报“女子在万象城地下... 据潮新闻报道,6月13日,“女生在万象城地下车库遭劫持”一事引发关注。6月14日,杭州市公安局上城区...
专访刘轶芳:从跟随到共塑,中国... “企业在持续发展的道路上,可能面临着一个个等待翻越的山丘,其中第一个山丘就是信息披露。”在6月13日...
首旅酒店旗下诺金国际重整高端板... 新京报贝壳财经讯(记者曲筱艺)6月12日,首旅酒店集团旗下的高端奢华品牌管理平台诺金国际首次对外亮相...
粤港澳三地专家热议大湾区康复产... 中新网广州6月14日电 (记者 蔡敏婕)随着粤港澳大湾区在科技创新领域、社保跨境结算、跨境养老等方面...
“气象精灵”上岗,昌平公路分局... 转自:北京交通本周六,北京迎来今年入汛后首场明显降雨过程,北京市交通委员会昌平公路分局提前启动防汛预...
贵州:用数字化解码非遗DNA 今年3月,习近平总书记来到黔东南州黎平县肇兴侗寨考察时指出,少数民族文化是中华文化不可或缺的组成部分...
科学家提出动力学扩展定律,支持...   炒股就看金麒麟分析师研报,权威,专业,及时,全面,助您挖掘潜力主题机会! 近日,美国卡内基梅隆...
有AI千年来相会 转自:中国台湾网  当刚劲古朴的兵马俑打起行云流水的太极拳,三星堆青铜面具欣赏川剧变脸绝活,长信宫灯...
网传“女子在万象城地下车库遭绑... 来源:每日商报刚刚,杭州上城警方发布一则警情通报:来源 上城警方值班编辑:陈敏特别声明:以上内容仅代...
老街巷成消费新地标 体验烟火气... 近日,商务部公布了第一批全国零售业创新提升试点城市名单,包括北京、上海、杭州等在内的38个城市入选。...
暴雨蓝色预警中,预计降雨这时结... 转自:天津发布今天白天我市天空云量较多下午迎明显降雨过程降雨实况截至14日16时,全市平均降雨量10...
杭州警方通报女子万象城遭挟持 #杭州万象城劫持女子嫌犯已死亡#【#杭州警方通报女子万象城遭挟持#】#警方通报网传女生杭州万象城被挟...
杭州警方通报:嫌犯李某涛(男,... 网传“女生万象城遭挟持”,杭州上城警方通报审核 | 卢长银编辑 | 王晓娇
金爵红毯|《长夜将尽》:聚焦老... 由王通执导,饶晓志、屈楚萧、国义骞等主演的电影《长夜将尽》,6月14日晚来到上海国际电影节的金爵盛典...
上海合作组织:强烈谴责以色列对... 上海合作组织关于伊朗遭受军事打击的声明上合组织对中东局势升级表示严重关切,强烈谴责以色列6月13日对...
交棒!申万研究新所长 (转自:伟海精英)交棒!申万研究新所长传闻多时后,上海申银万国证券研究所有限公司(简称:申万研究所)...
【文化和自然遗产日】非遗薪火代...   6月14日是2025年“文化和自然遗产日”。连日来,全国各地围绕“融入现代生活——非遗正青春”主...