【发布时间】:2020-05-07 12:44:16
【问题描述】:
我在子组件中有一组按钮,单击时设置相应的状态值 true 或 false。我在这个子组件中有一个 useEffect 钩子,它还依赖于所有这些状态值,所以如果单击一个按钮,这个钩子然后调用 setFilter ,它作为来自父级的道具传递下来......
const Filter = ({ setFilter }) => {
const [cycling, setCycling] = useState(true);
const [diy, setDiy] = useState(true);
useEffect(() => {
setFilter({
cycling: cycling,
diy: diy
});
}, [cycling, diy]);
return (
<Fragment>
<Row>
<Col>
<Button block onClick={() => setCycling(!cycling)}>cycling</Button>
</Col>
<Col>
<Button block onClick={() => setdIY(!DIY)}>DIY</Button>
</Col>
</Row>
</Fragment>
);
};
在父组件中,我显示了一个项目列表。我在父级中有两种效果,一种是初始加载项目,另一种是在更改过滤器时触发。为了简洁起见,我删除了大部分代码,但我认为我遇到的问题归结为这样一个事实,即在渲染我的 ItemDashboard 时,过滤器被调用了两次。我怎样才能阻止这种情况发生,或者我应该以另一种方式看待这个问题。
const ItemDashboard = () => {
const [filter, setFilter] = useState(null);
useEffect(() => {
console.log('on mount');
}, []);
useEffect(() => {
console.log('filter');
}, [filter]);
return (
<Container>..
<Filter setFilter={setFilter} />
</Container>
);
}
【问题讨论】:
-
为什么不控制父组件中的所有状态变量?这里的主要问题是什么?它不是用 setFilter 方法更新父级的状态吗?
-
是的,它确实会更新父状态,但对过滤器状态的影响会在加载时触发两次,在我的代码中,过滤器会影响从数据库中加载的项目两次。
标签: javascript reactjs react-hooks