尝试解决 React Context 的问题
Trying to resolve issue with React Context
我的同事发现 React Context 可能存在问题。他在CodeSandBox中创建了两组代码来演示这个问题。
Redux 版本(没有任何问题)
- 使用Chrome,请打开这个link:https://codesandbox.io/s/redux-test-6hqzp
- 在另一个选项卡中打开独立 link:https://6hqzp.csb.app/
- 在独立选项卡中,打开 Chrome DevTools 并单击 React DevTools 组件选项卡。
- 在配置中,确保选中"Highlight updates when components render"。
- 在文本框中键入内容,注意彩色矩形仅出现在 Comp[onent] 1 和 2 周围。
- 这是我们的基本情况,说明了我们期望在每次按键时重新呈现的内容。
上下文版本(说明问题)
- 使用Chrome,请打开这个link:https://codesandbox.io/s/context-test-1288z
- 在另一个选项卡中打开独立 link:https://1288z.csb.app/
- 在独立选项卡中,打开 Chrome DevTools 并单击 React DevTools 组件选项卡。
- 在配置中,确保选中"Highlight updates when components render"。
- 在文本框中键入。请注意,现在,组件 3 和整个应用程序都在每次按键时重新呈现。
同样重要的是要注意 AppContext
中的嵌套上下文模式源自 Kent C. Dodds:https://kentcdodds.com/blog/how-to-use-react-context-effectively
我想知道我的同事是否发现了 React Context 的根本缺陷,或者我们是否没有正确使用它?换句话说,是否可以修改上下文代码,使组件 3 和整个应用程序不会在每次按键时重新呈现?
问题在于 React 的默认行为是始终递归渲染。当父组件渲染时,React 将重新渲染该子树中的每个后代组件。
当你有一个存储状态并将其放入上下文的根组件时,该根组件中的 setState()
会导致它重新渲染,然后 React 也会导致所有子组件渲染.
为避免这种情况,您需要在 AppInner
组件上添加一个 React.memo()
(或 PureComponent
或使用 shouldComponentUpdate
)以防止它重新出现- 在其父渲染时渲染。
我的同事发现 React Context 可能存在问题。他在CodeSandBox中创建了两组代码来演示这个问题。
Redux 版本(没有任何问题)
- 使用Chrome,请打开这个link:https://codesandbox.io/s/redux-test-6hqzp
- 在另一个选项卡中打开独立 link:https://6hqzp.csb.app/
- 在独立选项卡中,打开 Chrome DevTools 并单击 React DevTools 组件选项卡。
- 在配置中,确保选中"Highlight updates when components render"。
- 在文本框中键入内容,注意彩色矩形仅出现在 Comp[onent] 1 和 2 周围。
- 这是我们的基本情况,说明了我们期望在每次按键时重新呈现的内容。
上下文版本(说明问题)
- 使用Chrome,请打开这个link:https://codesandbox.io/s/context-test-1288z
- 在另一个选项卡中打开独立 link:https://1288z.csb.app/
- 在独立选项卡中,打开 Chrome DevTools 并单击 React DevTools 组件选项卡。
- 在配置中,确保选中"Highlight updates when components render"。
- 在文本框中键入。请注意,现在,组件 3 和整个应用程序都在每次按键时重新呈现。
同样重要的是要注意 AppContext
中的嵌套上下文模式源自 Kent C. Dodds:https://kentcdodds.com/blog/how-to-use-react-context-effectively
我想知道我的同事是否发现了 React Context 的根本缺陷,或者我们是否没有正确使用它?换句话说,是否可以修改上下文代码,使组件 3 和整个应用程序不会在每次按键时重新呈现?
问题在于 React 的默认行为是始终递归渲染。当父组件渲染时,React 将重新渲染该子树中的每个后代组件。
当你有一个存储状态并将其放入上下文的根组件时,该根组件中的 setState()
会导致它重新渲染,然后 React 也会导致所有子组件渲染.
为避免这种情况,您需要在 AppInner
组件上添加一个 React.memo()
(或 PureComponent
或使用 shouldComponentUpdate
)以防止它重新出现- 在其父渲染时渲染。