2026-10-22 13:20:39
状态管理库(Redux/Vuex)的核心原理是通过集中管理应用状态,确保状态变化可预测、可追踪,并解决大型项目中组件间通信混乱的问题。其实现围绕单一状态树、状态只读与纯函数更新、响应式更新机制及中间件扩展能力展开,Redux与Vuex的设计思想高度相似,但具体实现因框架特性而异。
一、单一状态树:集中存储与可追踪性Redux:
Action:普通对象,必须包含type字段,描述“发生了什么”(如{ type: 'ADD_TODO', text: 'Learn Redux' })。
Reducer:纯函数,接收旧状态和action,返回新状态(不修改原状态)。通过combineReducers组合多个reducer,管理不同模块状态。
示例:function todoReducer(state = [], action) { switch (action.type) { case 'ADD_TODO': return [...state, { text: action.text }]; // 返回新数组 default: return state; }}
Vuex:
Mutation:唯一能修改状态的地方,必须是同步函数,通过commit提交(如store.commit('addTodo', { text: 'Learn Vuex' }))。
Action:处理异步逻辑(如API调用),完成后提交mutation(如dispatch('fetchData'))。
示例:const store = new Vuex.Store({ state: { todos: [] }, mutations: { addTodo(state, payload) { state.todos.push(payload); // 直接修改state(Vue响应式自动处理) } }, actions: { async fetchData({ commit }) { const data = await api.getData(); commit('setData', data); } }});
示例(React):function TodoList() { const todos = useSelector(state => state.todos); return <div>{todos.map(todo => <div key={todo.id}>{todo.text}</div>)}</div>;}
Redux:通过applyMiddleware注入中间件,增强dispatch能力。
常用中间件:
redux-thunk:支持异步action(如返回函数的action)。
redux-logger:打印状态变化日志。
示例:const store = createStore(rootReducer, applyMiddleware(thunk, logger));
Vuex:通过插件机制扩展功能,监听mutation实现日志、持久化等。
示例:const loggerPlugin = store => { store.subscribe((mutation, state) => { console.log(`Mutation type: ${mutation.type}, new state:`, state); });};const store = new Vuex.Store({ plugins: [loggerPlugin] });
单一数据源:所有状态集中存储。
状态只读:必须通过action/mutation修改。
纯函数更新:reducer/mutation无副作用。
更新机制:Vuex依赖Vue响应式,Redux需手动订阅。
异步处理:Vuex中action处理异步后提交mutation,Redux通过中间件(如redux-thunk)处理异步action。
getState():返回当前状态。
dispatch(action):调用reducer生成新状态。
subscribe(listener):注册状态变化回调。
总结:Redux与Vuex通过单一状态树、纯函数更新和中间件机制,实现了可预测的状态管理。理解其核心后,可灵活应用于不同框架或自定义简易版Store,关键在于保持状态变更的透明性和可控性。