gpt4 book ai didi

javascript - React 组件在使用 useEffect 时多次渲染

转载 作者:行者123 更新时间:2023-11-30 13:54:33 25 4
gpt4 key购买 nike

我使用带有钩子(Hook)的功能性 React 组件。

const [loaded, setLoaded] = React.useState(null);
const [title, setTitle] = React.useState(title);

React.useEffect(() => {
//...
fetch('https://jsonplaceholder.typicode.com/todos/1')
.then(response => response.json())
.then(json => {
setLoaded(true);
setTitle(title);
});
}, []);

在这种情况下,组件被渲染了两次。一方面,这似乎合乎逻辑。

但是我在这个组件中也有一个复选框处理程序

const changeHandler = event => {
//...
setTotal(new_total);
setError(false);
};

在这种情况下,不会发生两次渲染,尽管状态也改变了 2 次。我不明白为什么会这样。

附言

解决这个问题没有问题,我想知道为什么会这样

更新:

如果我在 useEffect 中设置

setLoaded(true);
setTitle(title);
setTitle2(title);
setTitle3(title);

将重新渲染 4 次,如果我在 changeHandler

中设置
setTotal(new_total);
setError(false);
setError2(false);
setError3(false);

将重新渲染 1 次

最佳答案

调用 useState() Hook 的 setter 方法的一个副作用是,这样做会触发组件重新渲染。

避免冗余重新渲染的一种解决方案是像这样合并您的组件状态:

function functionalComponent() {

/* Merge both values into common "state object */
const [{ loaded, title }, setState] = React.useState({
loaded : null,
title : "inital title"
});

React.useEffect(() => {

/*
Single call to setState triggers on re-render only. The
value of "new title" for title could have been set in the
inital state, however I set it here to show how combined
state can be updated with a single call to setState()
*/
setState({ loaded : true, title : "new title" })

/*
setLoaded(true);
setTitle(title);
*/
}, []);

/* Use loaded and title variables as needed during render */
return <div>{ loaded } - { title }</div>
}

关于javascript - React 组件在使用 useEffect 时多次渲染,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57565383/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com