为什么多次调用useEffect?

时间:2020-03-24 12:42:14

标签: javascript reactjs

在我的应用程序中,我使用钩子来设置变量的值。我有一个调用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。

2 个答案:

答案 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