JS 框架 词条目录
前端Wiki/JS 框架/深入/路由与状态管理

单向数据流思想

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
🔗 相关词条statePiniaRedux函数