在我的应用程序中,我使用钩子来设置变量的值。我有一个调用API并设置“ rooms”变量值的函数。
我使用useEffect
是为了实现componentDidMount
生命周期。但是,即使我输入了代码条件,getRooms()
在我的应用程序中也最多被调用4次。渲染房间的值时,我得到的是同一房间的4倍,而应该只有一次。
这是我的代码:
export default function Rooms() {
const [rooms, setRooms] = useState({})
function getRooms() {
client.get('/rooms').then((s) => {setRooms(s.data.rooms)}, (e) => {console.log(e)});
}
useEffect(() => {
if(Object.values(rooms).length === 0) {
getRooms();
}
})
return (
<React.Fragment>
<InfoPanel
title="rooms"
description="skip this part if you don't have any room in your house"
instruction="select and name every room you have" />
<ActionPanel>
{Object.values(rooms).map((r) => {
return <p>{r.title}</p>
})}
</ActionPanel>
</React.Fragment>
)
}
当组件安装时,如何确保仅一次调用我的代码?
N.B:“客户”是axios。
答案 0 :(得分:1)
我优化了您的解决方案
export default function Rooms() {
const [rooms, setRooms] = useState({})
useEffect(() => {
function getRooms() {
client.get('/rooms').then((s) => {return s.data.rooms}, (e) => {console.log(e)});
}
if(Object.values(rooms).length === 0) {
const apiResult = getRooms();
setState(apiResult);
}
}, [])
return (
<React.Fragment>
<InfoPanel
title="rooms"
description="skip this part if you don't have any room in your house"
instruction="select and name every room you have" />
<ActionPanel>
{Object.values(rooms).map((r) => {
return <p>{r.title}</p>
})}
</ActionPanel>
</React.Fragment>
)
}
答案 1 :(得分:0)
添加一个空数组作为useEffect()
的第二个参数。
useEffect(() => {
doStuff();
}, []);
第二个参数指示哪些更改应触发该函数。空数组意味着只运行一次,但不对进一步的更改做出反应。
请参阅文档here。