Вопрос или проблема
Я создал несколько сворачивающихся div с использованием функции map(). Но когда я кликаю на один элемент, остальные тоже разворачиваются. То же самое происходит и с отзывом. Есть решение?
Я пробовал этот код, но он не работает у меня.
[`const handleBlogClick = () => { if (item.id !== item.id) { setOpen(!open);
}
};`]
.
Ответ или решение
Для решения проблемы с раскрывающимися элементами в React, использующими функцию map()
, необходимо контролировать состояние каждого элемента отдельно. Когда все элементы расширяются или сворачиваются одновременно при нажатии, скорее всего, причина кроется в неэффективном управлении состоянием. Ниже представлены рекомендации и разъяснения для исправления данной ситуации.
Шаг 1: Управление состоянием
Первым делом, вам необходимо хранить состояние открытия для каждого элемента отдельно. Вместо одного общего состояния open
, подходящим решением будет использование объекта состояния, где ключами являются идентификаторы элементов, а значениями — состояния (открыт/закрыт) каждого из них.
Пример кода
Рассмотрим, как это можно реализовать на практике:
import React, { useState } from 'react';
const CollapsibleList = ({ items }) => {
const [openItems, setOpenItems] = useState({});
const handleBlogClick = (id) => {
setOpenItems(prevState => ({
...prevState,
[id]: !prevState[id] // Смена состояния для конкретного элемента
}));
};
return (
<div>
{items.map(item => (
<div key={item.id}>
<button onClick={() => handleBlogClick(item.id)}>
{openItems[item.id] ? 'Свернуть' : 'Развернуть'}
</button>
{openItems[item.id] && (
<div className="collapsible-content">
{/* Контент, который нужно развернуть */}
{item.content}
</div>
)}
</div>
))}
</div>
);
};
export default CollapsibleList;
Объяснение кода
-
Состояние
openItems
: Используем хукuseState
, чтобы создать объектopenItems
, который будет содержать состояние каждого элемента. Ключами являются идентификаторы элементов, а значениями — логические переменные, указывающие на то, открыт элемент или закрыт. -
Функция
handleBlogClick
: Эта функция отвечает за смену состояния конкретного элемента. Когда пользователь нажимает кнопку, мы обновляем состояние для данного идентификатора, меняя его на противоположное. -
Отрисовка элементов: Мы используем метод
map()
, чтобы перебрать массив элементов. Для каждой кнопки определяем, какой текст отображать на кнопке («Свернуть» или «Развернуть») в зависимости от состоянияopenItems[item.id]
.
Заключение
Используя такой подход, вы сможете добиться желаемого поведения при работе с раскрывающимися элементами в React. Каждый элемент будет контролировать своё состояние отдельно, что исключит возможность одновременного открытия или закрытия всех элементов.
Если вам понадобятся дополнительные разъяснения или возникнут новые вопросы, не стесняйтесь обращаться за помощью.