验证useCallback+useMemo缓存JSX元素的逻辑正确性
问题解答
你的逻辑整体方向是对的,但代码里有个关键疏漏需要修正:
1. 核心逻辑的正确性
你通过useCallback把createJSXButtons的更新时机绑定到parentState,再用useMemo以createJSXButtons为依赖缓存myButtons,这个思路是成立的:
- 只有当
parentState变化时,createJSXButtons才会重新生成新的函数实例 - 此时
useMemo的依赖项变更,才会重新调用createJSXButtons生成新的按钮列表,确保每个按钮的isToggled能拿到最新的parentState值 - 当
parentState不变时,createJSXButtons的实例不会变,useMemo会直接返回缓存的myButtons,避免不必要的JSX重建
2. 必须修正的代码问题
你当前的useMemo回调函数没有返回值,这会导致myButtons始终是undefined,需要补上return:
const myButtons = useMemo(() => { return createJSXButtons(['R', 'U', 'F']) }, [createJSXButtons]);
或者简化成箭头函数的隐式返回:
const myButtons = useMemo(() => createJSXButtons(['R', 'U', 'F']), [createJSXButtons]);
3. 额外优化建议
如果未来你的按钮列表['R', 'U', 'F']变成动态值(比如来自props或其他state),记得把它也加入useMemo的依赖数组,否则当列表变化时,myButtons不会更新:
const buttonList = ['R', 'U', 'F']; // 假设未来可能变成动态值 const myButtons = useMemo(() => createJSXButtons(buttonList), [createJSXButtons, buttonList]);
内容的提问来源于stack exchange,提问作者713sean
相关产品推荐
相关产品推荐

