面试题答案
一键面试1. React Hooks 中结合 Context 实现高效状态管理和组件通信
- 创建 Context:
import React from'react'; const MyContext = React.createContext(); export default MyContext;
- 使用 Context.Provider 提供数据:
import React, { useState } from'react'; import MyContext from './MyContext'; const App = () => { const [count, setCount] = useState(0); return ( <MyContext.Provider value={{ count, setCount }}> {/* 其他子组件 */} </MyContext.Provider> ); }; export default App;
- 使用 useContext Hook 消费数据:
import React, { useContext } from'react'; import MyContext from './MyContext'; const ChildComponent = () => { const { count, setCount } = useContext(MyContext); return ( <div> <p>Count: {count}</p> <button onClick={() => setCount(count + 1)}>Increment</button> </div> ); }; export default ChildComponent;
2. 已使用 MobX 时引入 Context 的设计和架构考虑
- 职责划分:
- MobX:用于管理应用的核心业务状态,处理复杂的状态逻辑、计算属性以及副作用等。例如用户登录状态、购物车数据等全局性且变化频繁的数据。
- Context:主要用于跨组件传递一些不需要复杂状态管理,但需要在多个层级组件间共享的数据,如主题模式(黑暗/明亮模式)、当前语言环境等。
- 避免重复状态:
- 确保在 MobX 存储和 Context 中不会出现重复管理的状态。如果有共享数据既可以放在 MobX 又可以放在 Context,优先考虑 MobX,因为其状态管理机制更强大且便于维护。
- 例如,用户的登录信息放在 MobX 中,若某些组件只需要知道用户是否登录(简单布尔值),可以通过 MobX 计算属性获取并通过 Context 传递给相关组件,避免在 Context 中重复存储登录信息。
- 数据更新机制:
- MobX:通过 observable 和 action 来管理状态变化,当 MobX 中的状态变化时,依赖该状态的组件会自动重新渲染。
- Context:当 Context.Provider 的 value 变化时,消费该 Context 的组件会重新渲染。为避免不必要的渲染,在 MobX 状态变化导致 Context 传递数据变化时,确保只传递真正变化的数据。可以使用 useMemo 对 Context.Provider 的 value 进行 memoization。
import React, { useMemo } from'react'; import MyContext from './MyContext'; import { useStore } from './mobxStore'; const App = () => { const store = useStore(); const contextValue = useMemo(() => ({ theme: store.theme, language: store.language }), [store.theme, store.language]); return ( <MyContext.Provider value={contextValue}> {/* 其他子组件 */} </MyContext.Provider> ); }; export default App;
- 组件层级与性能:
- MobX:可以通过依赖跟踪和自动批量更新优化性能,对于深层嵌套组件依赖 MobX 状态的情况,它能有效减少不必要的重新渲染。
- Context:如果在深层嵌套组件中使用 Context,要注意其性能影响。可以通过在中间组件使用 React.memo 或 shouldComponentUpdate 来减少不必要的重新渲染,防止因 Context 变化导致大量无关组件重新渲染。例如:
const MiddleComponent = React.memo((props) => { return ( // 渲染逻辑 ); });