Почему я получаю бесконечный цикл, когда я обновляю объект с помощью setState?

Я пытаюсь изменить имя класса, используя имя класса библиотеки. И у меня возникла проблема при обновлении данных моего объекта для сохранения состояния className. Я уверен, что это не проблема с именем класса библиотеки. Кто-нибудь может мне помочь?

    export default function Sidebar() {
    const [active, setActive] = useState({
        home: false,
        category: false,
        product: false,
        order: false,
    });
    const handleActive = (name) => {
        setActive({
            ...active,
            [name]: !active[name],
        });
    };
    return (
        <Col md = {2} id = "sidebar">
            <ul>
                <li className = {classNames({ active: active.home })} onClick = {handleActive("home")}>
                    <NavLink to = {`/home`}> Home </NavLink>
                </li>
                <li className = {classNames({ active: active.category })} onClick = {handleActive("category")}>
                    <NavLink to = {`/category`}> Category </NavLink>
                </li>
                <li className = {classNames({ active: active.product })} onClick = {handleActive("product")}>
                    <NavLink to = {`/product`}> Product </NavLink>
                </li>
                <li className = {classNames({ active: active.order })} onClick = {handleActive("order")}>
                    <NavLink to = {`/order`}> Order </NavLink>
                </li>
            </ul>
        </Col>
    );
}

Ошибка: слишком много повторных рендеров. React ограничивает количество рендеров, чтобы предотвратить бесконечный цикл.

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
0
0
80
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

ПРОБЛЕМА

Вы вызываете функцию прямо здесь onClick = {handleActive("order")}, которая запускает несколько повторных рендеров. Что вы говорите коду здесь, давайте вызывать обработчик onClick всякий раз, когда компонент монтируется.

РЕШЕНИЕ

() => handleActive("home") назначьте функцию обработчикам onClick следующим образом. Что вы говорите коду здесь, так это то, что я назначаю функцию обработчикам onClick, вызываю функцию всякий раз, когда кто-то щелкает элемент.

<li className = {classNames({ active: active.home })} onClick = {() => handleActive("home")}>
    <NavLink to = {`/home`}> Home </NavLink>
</li>

Спасибо, я привык пользоваться onClick = {handleClick}, а теперь знаю по-другому onClick = {handleClick()}

Cyan Coder 24.12.2020 06:06

@Cyan В вашем случае вы предоставляете ссылку, поэтому она будет отображаться бесконечно. Когда вы сделаете функцию стрелки, она будет работать.

Arunkumar09 12.04.2022 12:12

Другие вопросы по теме