在 React 中防止不必要的 re-renders of table rows / children
Preventing unnecessary re-renders of table rows / children in React
假设有一个 table 需要保持某种状态,例如,知道悬停的最后一个元素。为此,我们需要 child 元素上的 onMouseOver
事件,如下所示:
<tr onMouseOver={handleMouseOver}></tr>
然后包含 table 的组件将 re-render 在 setState({lastHovered: e.target})
之后的所有 children(类似这些)
如果悬停的目标是仅对一行进行更改(假设 show/hide 不使用 CSS 的内容)是否有办法将此状态保持在比该行更高的级别并且只呈现 <tr>
中受悬停影响的变化?
例如,假设将鼠标悬停在 table 内或悬停在外时会有延迟。悬停时,children 应该显示工具提示,但前提是直接悬停在上面。 table/parent 需要保持一些状态来跟踪这个 但是有没有办法不必 re-render 整个列表 children ?
对于功能组件
将所有 tr
元素包裹在 React.memo
(read) 中,以仅监听其内部属性的变化。此外,将 onMouseOver
事件放在 table 本身而不是每个子直接元素上,然后检查哪个子元素处于“焦点”(即 event.target
)。
内部 table 组件:
const [lastHovered, setLastHovered] = useState(null);
const [trProps, setTrProps] = useState(null);
return (
<table onMouseOver={event => setLastHovered(event.target) /* Also check if 'TR' type */ }>
<TableRows someData={trProps} />
</table>
)
Table 行组件:
const TableRows = React.memo( ({someData}) => /* Triggers update only if 'someData' changes */
<> { someData.map( data => <tr>{data}</tr> ) } </>
)
注意:以上代码未经测试;编写以演示可能的解决方案。
对于 Class 个组件
如果您使用 class 组件,则创建一个自定义 Table 行元素并添加 shouldComponentUpdate()
(read) to control rerenders, or use PureComponents
(read)。
假设有一个 table 需要保持某种状态,例如,知道悬停的最后一个元素。为此,我们需要 child 元素上的 onMouseOver
事件,如下所示:
<tr onMouseOver={handleMouseOver}></tr>
然后包含 table 的组件将 re-render 在 setState({lastHovered: e.target})
之后的所有 children(类似这些)
如果悬停的目标是仅对一行进行更改(假设 show/hide 不使用 CSS 的内容)是否有办法将此状态保持在比该行更高的级别并且只呈现 <tr>
中受悬停影响的变化?
例如,假设将鼠标悬停在 table 内或悬停在外时会有延迟。悬停时,children 应该显示工具提示,但前提是直接悬停在上面。 table/parent 需要保持一些状态来跟踪这个 但是有没有办法不必 re-render 整个列表 children ?
对于功能组件
将所有 tr
元素包裹在 React.memo
(read) 中,以仅监听其内部属性的变化。此外,将 onMouseOver
事件放在 table 本身而不是每个子直接元素上,然后检查哪个子元素处于“焦点”(即 event.target
)。
内部 table 组件:
const [lastHovered, setLastHovered] = useState(null);
const [trProps, setTrProps] = useState(null);
return (
<table onMouseOver={event => setLastHovered(event.target) /* Also check if 'TR' type */ }>
<TableRows someData={trProps} />
</table>
)
Table 行组件:
const TableRows = React.memo( ({someData}) => /* Triggers update only if 'someData' changes */
<> { someData.map( data => <tr>{data}</tr> ) } </>
)
注意:以上代码未经测试;编写以演示可能的解决方案。
对于 Class 个组件
如果您使用 class 组件,则创建一个自定义 Table 行元素并添加 shouldComponentUpdate()
(read) to control rerenders, or use PureComponents
(read)。