我在前端使用ReactJS向Djando API发出POST请求。在发出POST请求后,我希望React组件能够自动更新,而无需刷新整个页面。我使用useEffect钩子调用my endpoint(GET)来检索刚刚更新的数据。
import React from 'react'
import CampaignList from '../components/CampaignList'
import {useState, useEffect} from 'react'
const campaignRequest = () => {
fetch('http://localhost:8000/api/v1/campaigns/', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({
email_address: "zztop1111122233344556677889910101010@gmail.com",
first_name: "i",
last_name: "k",
stage: "1"
})
})
.then(res => res.json())
.then(data => console.log(data))
.catch(error => console.log(error))
}
let Campaigns = () => {
const [recipients, setRecipients] = useState([]);
const [isLoading, setIsLoading] = useState(true);
console.log("Campaign is re-mounted")
useEffect(() => {
setIsLoading(true);
fetch('http://localhost:8000/api/v1/campaigns/')
.then((res) => res.json())
.then((data) => {
setRecipients(data);
setIsLoading(false);
})
.catch(error => console.log(error));
// fetchData()
}
,[]);
if (isLoading) {
return <p>Loading...</p>;
}
return (
<div>
<div>Campaigns</div>
<CampaignList recipientss={recipients}/>
{/* <div>
{recipients.map((recipient, index) => (
<h3 key={index}>{recipient.email_address}
</h3>
))}
</div> */}
<button onClick={campaignRequest}>Click Me</button>
</div>
)
}
export default Campaigns
3条答案
按热度按时间brgchamk1#
我想这个应该可以用。现在你每次点击的时候收件人都会更新。
x8goxv8g2#
这是因为您没有任何东西触发get fetch再次被调用
把这个放到你的onClick
这就是你的使用效果
pgx2nnw83#
看起来您希望在单击
Click Me
时将一些数据POST
到http://localhost:8000/api/v1/campaigns/
,然后在POST
完成时自动从同一URL中GET
数据。在您的代码片段中,
GET
请求位于useEffect
钩子内,该钩子具有一个空依赖项数组,因此它将只执行一次-在初始呈现时。如果希望保持相同的代码结构,则必须引入一个新的状态变量来触发
useEffect
钩子,例如isAddCampaignLoading
,然后可以将const campaignRequest = () => {...}
移到Campaigns
组件中,并在campaignRequest
成功时更改isAddCampaignLoading
的状态。你将把isAddCampaignLoading
添加到你的useEffect
钩子的dependencies数组中,以使它在每次isAddCampaignLoading
改变时执行。我还在钩子内部添加了一个检查,以确保只有当isAddCampaignLoading
是false
(campaignRequest
成功)时才获取活动。