【发布时间】:2020-08-27 20:13:56
【问题描述】:
谁能向我解释为什么 fetch 语句会导致 2 个 API 调用? chrome 控制台和开发工具 > 网络选项卡都显示了两个版本。以下是我正在使用的代码。
import React, { useState } from 'react';
import './contact.css';
const App = () => {
const [contacts, setContacts] = useState([]);
fetch("https://randomuser.me/api/?results=3")
.then(response => response.json())
.then(data => console.log(data));
return (
<>
{
contacts.map(contact => (
<ContactCard
avatar="https://via.placeholder.com/150"
name={contact.name}
email={contact.email}
age={contact.age}
/>
))
}
</>
)
};
const ContactCard = props => {
const [showAge, setShowAge] = useState(false);
return (
<div className="contact-card">
<img src="https://via.placeholder.com/150" alt="profile" />
<div className="user-details">
<p>Name: {props.name}</p>
<p>Email: {props.email}</p>
<button onClick={() => setShowAge(!showAge)}>{!showAge ? 'Show' : 'Hide'} Age</button>
{
showAge && <p>Age: {props.age}</p>
}
</div>
</div>
);
};
export default App;
【问题讨论】:
-
看一下调用的类型,是不是一个OPTIONS请求?这是 CORS 的一部分。
-
OPTIONS 是 CORS 飞行前 - 但是,我不明白为什么您的代码会触发飞行前 - 刚刚测试过,它不会是 OPTIONS - 它会有所反应相关
-
App被多次执行,如果想在组件挂载时只调用一次fetch,使用useEffect(() => fetch(..), []),[]很重要,它保证了函数传递给useEffect在组件挂载时只运行一次。 -
@Titus 出于某种原因,在最后删除
[],似乎仍然有效......就像,现在我只打1个电话!你知道为什么吗? -
是的,没错。我之前的评论不完整,当你更新状态(例如调用
setContacts)时,该函数也会运行,而不仅仅是在你更新属性时。
标签: javascript reactjs fetch