单向数据流思想
Pinia 和 Redux 背后共享同一个思想:单向数据流。数据的变化被约束在一条单行道上:视图 → action → reducer → 新 state → 视图。所有修改都必须走这条管道,不允许在犄角旮旯里偷偷改数据。
它带来两个巨大好处:可预测——state 每次变化都由一个 action 触发,日志里能看到完整的变更历史,出了 bug 可以回放每个 action 定位;可调试——配套的 DevTools 支持时间旅行,能回到任意历史状态。
关键实现细节是 reducer 必须是纯函数:不修改旧 state,而是基于它创建新对象返回({ ...state, count: state.count + 1 })。因为「直接改旧对象」会导致「前后两个 state 其实是同一个对象」,diff 与历史记录全部失效。下面的可运行示例演示了这个模式的核心代码。
本节要点单向数据流:action → reducer → 新 state → 视图;reducer 必须是纯函数,返回新对象而不是修改旧对象;好处是可预测、可回溯。
JavaScript
// 单向数据流:state 只能通过纯函数 reducer 修改 const initialState = { count: 0, list: [] }; function reducer(state, action) { switch (action.type) { case 'increment': // 不改旧对象!返回包含修改的新对象 return { ...state, count: state.count + 1 }; case 'add-todo': return { ...state, list: [...state.list, action.text] }; default: return state; } } // 模拟 dispatch:状态只能这样一步一步流下去 let state = initialState; state = reducer(state, { type: 'increment' }); state = reducer(state, { type: 'increment' }); state = reducer(state, { type: 'add-todo', text: '学习框架' }); console.log(state); // { count: 2, list: ['学习框架'] } // 视图 = f(state):想改变界面,唯一途径是改 state




