基本上,我们componentDidMount()
在React类组件的生命周期方法中进行API调用,如下所示
componentDidMount(){
//Here we do API call and do setState accordingly
}
但是在React v16.7.0中引入了钩子之后,它几乎都像功能组件一样
我的查询是,我们到底需要在带有钩子的功能组件中进行API调用?
我们有什么类似的方法componentDidMount()
吗?
是的,有一个类似(但不相同!)的componentDidMount
钩子替代品,它就是useEffect
钩子。
其他答案并不能真正回答您在哪里可以进行API调用的问题。您可以通过使用useEffect
并将 空数组或对象作为第二个参数
来代替来进行API调用componentDidMount()
。这里的关键是第二个参数。如果您不提供空数组或对象作为第二个参数,则将在每个渲染器上调用API调用,并且该调用实际上将变为componentDidUpdate
。
如文档中所述:
传递一个空的输入数组[]告诉React您的效果不依赖于组件中的任何值,因此该效果仅在安装时运行,而在卸载时清除;它不会在更新上运行。
以下是一些需要进行API调用的场景的示例:
尝试运行下面的代码,然后查看结果。
function User() {
const [firstName, setFirstName] = React.useState(null);
const [lastName, setLastName] = React.useState(null);
React.useEffect(() => {
fetch('https://randomuser.me/api/')
.then(results => results.json())
.then(data => {
const {name} = data.results[0];
setFirstName(name.first);
setLastName(name.last);
});
}, []); // <-- Have to pass in [] here!
return (
<div>
Name: {!firstName || !lastName ? 'Loading...' : `${firstName} ${lastName}`}
</div>
);
}
ReactDOM.render(<User />, document.querySelector('#app'));
<script src="https://unpkg.com/react@16.7.0-alpha.0/umd/react.development.js"></script>
<script src="https://unpkg.com/react-dom@16.7.0-alpha.0/umd/react-dom.development.js"></script>
<div id="app"></div>
例如,如果要显示用户的个人资料页面,其中每个页面都有一个userID状态/属性,则应将该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
了解您可以/不能使用它。
正如Dan Abramov在此GitHub
Issue
上所说的那样:
从长远来看,我们将不鼓励这种(useEffect)模式,因为它会鼓励比赛条件。例如-
在通话开始和结束之间可能会发生任何事情,并且您可能会获得新的道具。相反,我们建议使用Suspense进行数据提取
因此,请继续关注悬念!
问题内容: 我想使用Java comm api编写一些程序。我找不到可以从中下载此API的站点/页面。谁能告诉我在哪里可以得到这个API? 基本上我想从PC发送短信到手机。手机将通过USB电缆连接到PC。我还想知道将短信发送到手机的可能方法是什么?(我正在寻找不会招致我钱的选择) 提前致谢 ! 编辑1 我不允许使用第三方API。看来Java comm API已经死了。那么,还有其他方法可以从PC向
我遵循了所有步骤。我选择了我想要的API(YouTube数据API)并创建了一个项目。我现在搜索了大约 20 分钟,但找不到 API 密钥?我的用户界面是德语的,有没有可能以API密钥以外的其他东西命名?也许是 Clientschlüssel (Client Key) ? 这是我找到的全部: 还有一个JSON对象,但没有API Key:
问题内容: 我最近在home / myusername / myappname目录中安装了一个nodejs应用程序(梯形)应用程序。 当我访问www.mydomain.com时,什么都没有显示-即使在打开我的nodejs应用程序之后。 这些文件应该在哪里? 我正在运行Ubuntu 16.04。 过去我曾使用过var / www文件夹,但我没有使用apache-我需要手动创建此文件夹吗? 谢谢! 问
https://docs . Microsoft . com/en-us/azure/search/search-how to-index-cosmos db 该页面指出,在使用Mongo DB API时,您需要使用REST(REST API版本2019-05-06-Preview)来完成从Cosmos DB添加数据。我在哪里可以找到这方面的最新介绍?或者有人成功地做到了这一点?
我试图找到电报的Api密钥,但我找不到它。我在网站上哪里可以找到它?如果我使用Api Id,我会在C#控制台应用程序中得到错误。
问题内容: openCV核心扩展的Java jar库在哪里,以便可以将其导入Java代码中? 我找不到他们教过如何正确设置所有内容的地方。我正在使用并且已经安装了openCV。我想在eclipse IDE中使用它,而eclipse需要一个jar文件,以便可以使用openCV函数。我看到下面的链接已经使用了 如何获取这些.jar文件? 问题答案: 您可以在此链接中找到用于Linux的jar,它们可以