如何在 url 参数更改后重新触发或让 useEffect 更新以显示不同的 API 响应
How do I re-fire or get useEffect to update after url parameter change to show a different API response
你好,首先我要说我对 React 和一般编码还很陌生。我目前正在阅读 React Doc 并学习。很抱歉,如果这是微不足道的。
我这里有一个问题代码:https://pastebin.com/rkwS1x66 我试图根据用户点击按钮来更新 table。我相信我的逻辑在实际渲染之前是可靠的。我的点击处理功能工作正常,并且在切换时它可以通过 alert() 显示 url 更改。问题是尽管 URL 变量发生变化,但 table 不会重新呈现。我希望 table 本质上重新呈现并显示不同的 API 调用。基本上,它应该根据按钮点击动态地显示在 table 中呈现的 SWAP api 或 Pokemon api。
link 包含我的压缩代码。我的项目包含更多代码,但我认为这足以解决手头的问题。
function HeaderSection() {
let baseUrl = "https://swapi.dev/api/people";
const [data, setData] = useState([]);
const [currentStatus , setStatus] = useState(false);
let urlToggle = false;
function urlChange(){
urlToggle = !urlToggle;
if(urlToggle)
{
baseUrl = "https://swapi.dev/api/people";
}
else
{
baseUrl = "https://pokeapi.co/api/v2/berry";
}
}
useEffect(()=>{
fetch(baseUrl)
.then((response) =>{
if(!response.ok)
{
return Promise.reject( new Error("Response Error!"));
}
else
{
return response.json();
}
})
.catch ( (err) =>{
console.log(err);
})
.then((json) => {
try{
setData(json.results);
setStatus(true);
}
catch
{
return Promise.reject(new Error(`State Error!: Data: ${data} , Connection:${currentStatus}`));
}
})
.catch((err) =>{
console.log(err);
})
},[baseUrl]);
return (
<div className='gio-main'>
<div className='gio-container-3'>
<h1>API Switch</h1>
<h4>Endpoint request using vanilla JS displayed in custom table</h4>
<p>You can switch between endpoints using this button!</p>
<button onClick={urlChange}>Change API</button>
{!currentStatus ? <h2>Loading... </h2> : <Table data={data}/>}
</div>
</div>
);
}
export default HeaderSection;
您的 useEffect
挂钩未在 baseUrl
上触发的原因
并如您所料更改 data
的值是 baseUrl
不是状态。
第二个参数,useEffect
期望状态的列表,并且会导致useEffect
在状态改变时触发,所以使用“普通”变量不会触发钩子.
要修复它,只需将 baseUrl
更改为 useState
。
在您的代码中:
// change #1
const [baseUrl, setBaseUrl] = useState("https://swapi.dev/api/people");
//change #2
function urlChange(){
urlToggle = !urlToggle;
if(urlToggle)
{
setBaseUrl("https://swapi.dev/api/people");
}
else
{
setBaseUrl("https://pokeapi.co/api/v2/berry");
}
}
现在,当 baseUrl 更改时,useEffect
挂钩将重新触发。
useEffect docs - 看“注释”部分
你好,首先我要说我对 React 和一般编码还很陌生。我目前正在阅读 React Doc 并学习。很抱歉,如果这是微不足道的。
我这里有一个问题代码:https://pastebin.com/rkwS1x66 我试图根据用户点击按钮来更新 table。我相信我的逻辑在实际渲染之前是可靠的。我的点击处理功能工作正常,并且在切换时它可以通过 alert() 显示 url 更改。问题是尽管 URL 变量发生变化,但 table 不会重新呈现。我希望 table 本质上重新呈现并显示不同的 API 调用。基本上,它应该根据按钮点击动态地显示在 table 中呈现的 SWAP api 或 Pokemon api。
link 包含我的压缩代码。我的项目包含更多代码,但我认为这足以解决手头的问题。
function HeaderSection() {
let baseUrl = "https://swapi.dev/api/people";
const [data, setData] = useState([]);
const [currentStatus , setStatus] = useState(false);
let urlToggle = false;
function urlChange(){
urlToggle = !urlToggle;
if(urlToggle)
{
baseUrl = "https://swapi.dev/api/people";
}
else
{
baseUrl = "https://pokeapi.co/api/v2/berry";
}
}
useEffect(()=>{
fetch(baseUrl)
.then((response) =>{
if(!response.ok)
{
return Promise.reject( new Error("Response Error!"));
}
else
{
return response.json();
}
})
.catch ( (err) =>{
console.log(err);
})
.then((json) => {
try{
setData(json.results);
setStatus(true);
}
catch
{
return Promise.reject(new Error(`State Error!: Data: ${data} , Connection:${currentStatus}`));
}
})
.catch((err) =>{
console.log(err);
})
},[baseUrl]);
return (
<div className='gio-main'>
<div className='gio-container-3'>
<h1>API Switch</h1>
<h4>Endpoint request using vanilla JS displayed in custom table</h4>
<p>You can switch between endpoints using this button!</p>
<button onClick={urlChange}>Change API</button>
{!currentStatus ? <h2>Loading... </h2> : <Table data={data}/>}
</div>
</div>
);
}
export default HeaderSection;
您的 useEffect
挂钩未在 baseUrl
上触发的原因
并如您所料更改 data
的值是 baseUrl
不是状态。
第二个参数,useEffect
期望状态的列表,并且会导致useEffect
在状态改变时触发,所以使用“普通”变量不会触发钩子.
要修复它,只需将 baseUrl
更改为 useState
。
在您的代码中:
// change #1
const [baseUrl, setBaseUrl] = useState("https://swapi.dev/api/people");
//change #2
function urlChange(){
urlToggle = !urlToggle;
if(urlToggle)
{
setBaseUrl("https://swapi.dev/api/people");
}
else
{
setBaseUrl("https://pokeapi.co/api/v2/berry");
}
}
现在,当 baseUrl 更改时,useEffect
挂钩将重新触发。
useEffect docs - 看“注释”部分