反应 useState 导致无限循环

时间:2021-02-01 16:56:25

标签: reactjs

import {Navbar, NavbarBrand} from 'reactstrap';
// import Menu from './components/MenuComponent';
import {DISHES} from "./shared/dishes";

export default function App() {

    const [state, updateState] = useState({
        dishes: DISHES
    });
    updateState({...state, name: 'something'});
    console.log(state);
    return (
        <div>
            <Navbar dark color="primary">
                <div className="container">
                    <NavbarBrand href="/">Ristorante Con Fusion</NavbarBrand>
                </div>
            </Navbar>
            {/*<Menu dishes={state.dishes}/>*/}
        </div>
    );
}

这会导致无限循环。在对 updateState 行进行评论后,它可以工作。通过作品,我的意思是它不会进入无限循环。有人可以告诉我我做错了什么吗?

截图附在下面 -

enter image description here

2 个答案:

答案 0 :(得分:1)

问题在这里 updateState({...state, name: 'something'}) ,您甚至在渲染之前更新状态,并且继续更新状态,这将重新渲染,它会继续。使用 useEffect 更新状态。

useEffect(() => {
  updateState({...state, name: 'something'});
}, [])

答案 1 :(得分:1)

问题是您使用 updateState({...state, name: 'something'}); 更新每个渲染的状态,然后触发新的渲染等。

如果您希望状态包含多个变量,您有两个主要选择。

使用多个 useState 钩子:

export default function App() {

    const [dishes, setDishes] = useState(DISHES)
    const [name, setName] = useState('something')

    return <div></div>
}

或者,由于您使用的是当前状态的对象,您可以添加更多属性:

export default function App() {

    const [state, updateState] = useState({
        dishes: DISHES,
        name: 'something'
    });

    return <div></div>
}

第二种方法可行,但是React 不会在对象状态之间进行深度比较,因此使用第一种方法通常更有效。