面试题答案
一键面试利用函数式编程优化 React 状态管理
- 不可变数据:在 Redux 或 MobX 中,使用不可变数据可确保状态变化的可预测性。例如在 Redux 中,action 触发 reducer 时,不直接修改原状态,而是返回新状态。
// 传统方式可能会直接修改原状态(错误示范) // function reducer(state, action) { // if (action.type === 'ADD_TODO') { // state.todos.push(action.payload); // return state; // } // return state; // } // 使用不可变数据(正确示范) function reducer(state, action) { if (action.type === 'ADD_TODO') { return { ...state, todos: [...state.todos, action.payload] }; } return state; }
- 纯函数:reducer 必须是纯函数,即给定相同输入,返回相同输出,且无副作用。在 MobX 中,可使用 autorun 等函数时确保函数的纯性。
// MobX 示例,使用纯函数更新状态 import { makeObservable, observable, action } from'mobx'; class Store { constructor() { this.todos = []; makeObservable(this, { todos: observable, addTodo: action }); } addTodo(todo) { this.todos = [...this.todos, todo]; } }
优势
- 可预测性:不可变数据和纯函数使状态变化更易追踪和预测,利于调试和维护。比如在 Redux 中,通过时间旅行调试工具,可轻松追溯状态变化。
- 性能优化:不可变数据便于进行浅比较,在 React 中可利用 shouldComponentUpdate 或 React.memo 减少不必要的渲染。
潜在挑战
- 学习曲线:函数式编程概念对习惯命令式编程的开发者较难理解,如不可变数据的更新方式需要重新学习。
- 复杂数据结构处理:对于复杂嵌套数据结构,保持数据不可变会增加代码复杂度,如深度克隆等操作。