我有一个 React 组件 Activity,带有一个 DataTable 和一个 Drawer(来自 Material UI)。我根据isDrawerOpen
Activity 组件状态的属性设置抽屉是否打开。然而,当isDrawerOpen
更新时,Activity、Drawer、DataTable都会重新渲染。
我不想DataTable
重新渲染,因为什么都没有改变。我尝试在 DataTable 功能组件中使用React.memo
并尝试useEffect
结合使用useRef
,以便在 props 相同的情况下不重新渲染。它不起作用。当这个子组件的任何 props 都没有改变时,如何防止它重新渲染?
const Activity = props => {
const [isDrawerOpen, setIsDrawerOpen] = useState(false);
const [tableData, setTableData] = useState(["banana", "orange", "apple"]);
return (
<div>
<DataTable data={tableData} onRowClick={() => setIsDrawerOpen(true) } />
<Drawer open={isDrawerOpen}>Some Drawer Content </Drawer>
</div>
)
}
Run Code Online (Sandbox Code Playgroud)
Ros*_*len 10
但实际上有些东西正在改变......它在每次渲染上构建一个新函数 for onRowClick
,然后强制子进程重新渲染,因为它获得了新的道具。这就是useCallback
钩子的用途:
const Activity = props => {
const [isDrawerOpen, setIsDrawerOpen] = useState(false);
const [tableData, setTableData] = useState(["banana", "orange", "apple"]);
// Because `setIsDrawerOpen` never changes across renders, it's safe to
// pass an empty deps array as the second argument.
const onRowClick = useCallback(() => setIsDrawerOpen(true), []);
return (
<div>
<DataTable data={tableData} onRowClick={onRowClick} />
<Drawer open={isDrawerOpen}>Some Drawer Content </Drawer>
</div>
);
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
7966 次 |
最近记录: |