【发布时间】:2020-03-28 12:13:56
【问题描述】:
假设我有以下代码:(太冗长了)
function usePolicyFormRequirements(policy) {
const [addresses, setAddresses] = React.useState([]);
const [pools, setPools] = React.useState([]);
const [schedules, setSchedules] = React.useState([]);
const [services, setServices] = React.useState([]);
const [tunnels, setTunnels] = React.useState([]);
const [zones, setZones] = React.useState([]);
const [groups, setGroups] = React.useState([]);
const [advancedServices, setAdvancedServices] = React.useState([]);
const [profiles, setProfiles] = React.useState([]);
React.useEffect(() => {
policiesService
.getPolicyFormRequirements(policy)
.then(
({
addresses,
pools,
schedules,
services,
tunnels,
zones,
groups,
advancedServices,
profiles,
}) => {
setAddresses(addresses);
setPools(pools);
setSchedules(schedules);
setServices(services);
setTunnels(tunnels);
setZones(zones);
setGroups(groups);
setAdvancedServices(advancedServices);
setProfiles(profiles);
}
);
}, [policy]);
return {
addresses,
pools,
schedules,
services,
tunnels,
zones,
groups,
advancedServices,
profiles,
};
}
当我在我的函数组件中使用这个自定义 Hook 时,在 getPolicyFormRequirements 解析后,我的函数组件重新渲染 9 次(我调用 setState 的所有实体的计数)
我知道这个特定用例的解决方案是将它们聚合到一个状态并调用 setState 一次,但我记得(纠正我,如果我错了)事件处理程序(例如 @987654327 @) 如果连续调用多个setStates,则在事件处理程序执行完成后只会发生一次重新渲染。
我有没有办法告诉React,或者React 会知道自己,在这之后setState 会出现另一个setState,所以跳过重新渲染,直到你找到一秒钟的呼吸。
我不是在寻找性能优化技巧,我想知道上述(粗体)问题的答案!
或者你认为我想错了吗?
谢谢!
-------------
更新 我如何检查我的组件渲染了 9 次?
export default function PolicyForm({ onSubmit, policy }) {
const [formState, setFormState, formIsValid] = usePgForm();
const {
addresses,
pools,
schedules,
services,
tunnels,
zones,
groups,
advancedServices,
profiles,
actions,
rejects,
differentiatedServices,
packetTypes,
} = usePolicyFormRequirements(policy);
console.log(' --- re-rendering'); // count of this
return <></>;
}
【问题讨论】:
-
有了完整的
class Thing extends React.Component,您就可以拥有shouldComponentUpdate。 -
如果它们一直一起更新,那么也许你应该考虑一个更统一的状态对象。
-
向我们展示您如何检查组件是否呈现 9 次的示例。
-
@DennisVash ``` export default function PolicyForm({ onSubmit, policy }) { const { 地址、池、计划、服务、隧道、区域、组、高级服务、配置文件、} = usePolicyFormRequirements(policy ); console.log(' --- 重新渲染');返回 >```
-
有一种方法可以强制更新批处理。看看this article 看看它是如何工作的。我正在使用它,它会将渲染减少到一个。
标签: reactjs performance react-hooks setstate react-state-management