【发布时间】:2021-10-15 19:15:27
【问题描述】:
我试图阻止在 React 功能组件中重新渲染,但不确定如何或实现什么来实现这一点。 阅读建议使用备忘录,但我不明白如何在这里实现它。
props 包括 'selectAll' (propType=boolean ),onSelected 是一个回调函数,我使用 stateHook 进行选择。
因此,如果调用 'setSelected(newSelects)' 方法,它会进入无限的 reRender 循环; 我有一个关于返回标记的工作,它有效,但我更愿意使用、学习和理解管理 React 的状态。
代码:
function OptimiserTableBody(props) {
const {Id, columns, send, onSelected, selectAll} = props;
const [selected, setSelected] = useState([]);
// Retrieve the data
const resOData = useQuery(o_data_query, {
variables: {
id: id,
use: use
},
fetchPolicy: 'cache-and-network'
});
// Create an array from the retrieved data for the table, this is used to create the table rows
let steps = resOData.data != undefined ? resOData.data.jobO.data : [];
useEffect(() => {
if (selectAll === true) {
let newSelects = steps.map((n) => n.workStepId);
setSelected(newSelects);
}
}, [selectAll])
return (
<TableBody>
{steps.map((step, index) => (
let isItemSelected = isSelected(step.workStepId);
// Workaround
if (selectAll === true)
{
isItemSelected = true;
}
return (
<TableRow ... >
<TableCell key={'select'} padding="checkbox" >
<Checkbox
checked={isItemSelected}
inputProps={{ 'aria-labelledby': step.workStepId }}
style={{color: kbaColors.grey1}}
onClick={(event) => handleClick(event, step.workStepId)}
/>
</TableCell>
</TableRow>
))}
</TableBody>
);
}
export default React.memo(OptimiserTableBody);
谢谢
【问题讨论】:
标签: reactjs react-hooks state rendering rerender