Вы когда-нибудь хотели создать раскрывающийся список, по которому пользователи могут щелкнуть? В этом случае использования этот список имеет больше списков, и каждый список имеет больше списков! Я собираюсь охарактеризовать этот список как объект JavaScript. В этом уроке мы собираемся воспроизвести этот опыт шаг за шагом с нуля.
Требования
Я предполагаю, что у вас есть базовые знания о рекурсии, так как это было вдохновлено ею.
Начиная с нуля с помощью приложения create-реагировать
После того, как вы все настроите, обязательно удалите ненужный текст. Добавьте 20px к краю компонента приложения. Это делается для удобочитаемости и не позволяет тексту отталкиваться от края экрана.
После этого мы собираемся добавить статические данные в наш файл App.js, чтобы протолкнуть другие наши компоненты. Скопируйте и вставьте объект категорий из моей ссылки на github.
https://github.com/cruzgerman216/вложенные-списки-сделано-в-реакции/blob/main/src/App.js
Мыслительный процесс
Всякий раз, когда пользователь нажимает на каждый текст, мы хотим отобразить любой контент, который находится «там». Каждый div, содержащий текст, будет иметь какое-то состояние, чтобы управлять расширением или сжатием его содержимого. Мы не хотим перебирать этот объект только потому, что не будем контролировать расширение или сжатие вложенных объектов. Что нам нужно сделать в первую очередь, так это создать компонент с полным состоянием, который позволит нам отображать его содержимое с помощью щелчка пользователя.
Компонент с отслеживанием состояния для обработки расширяющихся или сокращающихся списков
Создайте папку «Компоненты». Создайте файл с именем Block.js
Внутри App.js импортируйте Block.js и установите атрибут с именем category для наших статических данных и включите его имя в качестве ключевого атрибута, чтобы избежать повторяющихся ошибок.
В нашем файле Block.js мы хотим иметь возможность отслеживать, расширяется или сжимается div, поэтому создайте вызываемый ключ и установите для него значение false для объекта состояния.
Чтобы убедиться, что все работает, создайте div и распечатайте ключ объектов с именем name из того, что передается как реквизит с именем category.
Вы даже можете использовать console.log для props.data, чтобы увидеть, что происходит, и подумать о том, что мы будем здесь делать. На этом этапе мы хотим щелкнуть этот дочерний элемент div и, как только мы это сделаем, создать новые элементы с той же функциональностью, поскольку они могут расширять и сжимать свое содержимое.
Создайте метод с именем Expand. Этот метод будет отвечать за установку для this.state.on значения false или true.
Чтобы отобразить наш контент, мы собираемся добавить новый ключ в состояние с именем. Таким образом, когда мы перебираем наш объект, мы будем хранить элементы в этом массиве для их отображения. Если вы еще не знаете, если react/jsx увидит массив, полный элементов/компонентов, он отобразит их.
Создайте переменную. Называй как хочешь, я свою обр. Установите его в пустой массив. Этот массив будет захватывать подобъекты из объекта props.data, который проходит через него.
Перебрать объект this.props.category. Мы хотим иметь возможность помещать в этот массив объекты, у которых нет имени ключевого слова, потому что это не объекты, а скорее строки.
Идея рекурсии
Это сложная часть, которая потребует немного размышлений. Мы хотим иметь возможность помещать в этот массив новые элементы с той же функциональностью, что и его родительский компонент. Проблема в том, что мы не можем использовать рекурсию в формате, основанном на классе, только в формате, основанном на функции. Мы не можем реализовать ту же самую функциональность в компоненте без состояния, потому что нам нужно отслеживать, расширяется или сжимается ли div за счет функциональности состояния. Чтобы решить эту проблему, мы собираемся создать отдельный файл с именем Section.js. В этом файле импортируйте Block, а затем включите Block. Передайте реквизиты, которые получает Секция. Будет казаться, что компонент Block рекурсивно находится внутри своего собственного компонента.
Измените app.js, чтобы включить Section.
Измените метод расширения в Block.js, чтобы проталкивать компоненты раздела по мере того, как мы передаем новую информацию о свойствах. Обязательно измените состояние на новый сформированный массив.
Добавьте щелчок в div, печатающий data.name
а затем добавьте троичный операнд, чтобы показать this.state.data, если это правда.
Бонус: добавление стиля
Мы собираемся отслеживать стиль через состояние. При переборе объектов убедитесь, что мы не создаем компонент Section для ключевого слова «стиль».
наконец, включите атрибут стиля в текстовый div.
Чтобы увидеть полный код, посетите
https://github.com/cruzgerman216/вложенные-списки-сделано-в-реакции