这取决于您是否希望在某些参数更改时调用服务器。如果您无论如何都想要相同的异步调用,则可以将其[]
用作第二个参数。
但是,例如,如果您要显示用户的个人资料页面,其中每个页面都有一个用户 ID 状态/属性,则应将该 ID 作为值传递给第二个参数,useEffect
以便为新用户 ID 重新获取数据. componentDidMount
在这里是不够的,因为如果您直接从用户 A 转到用户 B 的配置文件,则该组件可能不需要重新安装。
在传统的类方式中,你会这样做:
componentDidMount() {
this.fetchData();
}
componentDidUpdate(prevProps, prevState) {
if (prevState.id !== this.state.id) {
this.fetchData();
}
}
使用钩子,那将是:
useEffect(() => {
this.fetchData();
}, [id]);
尝试运行下面的代码并查看结果。例如,将 id 更改为 2 以查看useEffect
再次运行。
function Todo() {
const [todo, setTodo] = React.useState(null);
const [id, setId] = React.useState(1);
React.useEffect(() => {
if (id == null || id === '') {
return;
}
fetch(`https://jsonplaceholder.typicode.com/todos/${id}`)
.then(results => results.json())
.then(data => {
setTodo(data);
});
}, [id]); // useEffect will trigger whenever id is different.
return (
<div>
<input value={id} onChange={e => setId(e.target.value)}/>
<br/>
<pre>{JSON.stringify(todo, null, 2)}</pre>
</div>
);
}
ReactDOM.render(<Todo />, document.querySelector('#app'));
<script src="https://unpkg.com/react@16.8.1/umd/react.development.js"></script>
<script src="https://unpkg.com/react-dom@16.8.1/umd/react-dom.development.js"></script>
<div id="app"></div>
你应该仔细阅读,useEffect
这样你就知道你可以/不能用它做什么。