Пилотом Ивана
Использование Redux для управления всей состоянием вашего приложения вас – это одно. Но убедившись, что структура вашего состояния является оптимальной, чтобы ваш код был поддержан, и эффективно – это совершенно новая игра мяча!
Управление формой состояния вашего приложения абсолютно фундаментально. Когда ваше приложение растет, если ваша государственная форма не очень хорошо организована, управление его можно быстро стать грязным и даже замедлять отзывчивость вашего приложения.
Если вы используете RECT в качестве фронтальной структуры, шансы вы можете использовать Redux для управления состоянием вашего приложения. В этом случае вы будете реализовывать один или несколько редукторов для изменения состояния вашего приложения каждый раз, когда действие отправляется в ответ на действия пользователей. Давайте посмотрим ниже, как перейти от начальной неэффективной структуры формы состояния к тому, что это топ-исполнитель.
Начальная форма состояния
Предположим, мы пишем приложение, где пользователи могут публиковать твиты, и каждый твит имеет комментарии. Давайте также предположим, что твиты могут быть организованы по темам или потокам. Базовая и неэффективная форма состояния будет следующим:
Как вы можете видеть выше, у нас сложная вложенная структура. Эта государственная форма оказывается довольно неэффективной по нескольким причинам:
- Он глубоко вложен, поэтому изменение состояния для обновления свойства Tweet требует, чтобы разработчик написал обширную сумму кода в редукторе.
-
ТвитыМассив делает две вещи: он удерживает данные (то есть индивидуальныйTweetобъект), и заказывая твиты, поскольку твиты находятся внутри массива. - В этой ситуации массивы неэффективны. Представьте, что у вас есть 50 000 твитов в потоке. Нахождение соответствующего твита внутри массива займет время. Время поиска внутри массива – это o (n), поскольку компьютер должен пройти весь список элементов, пока он не найдет правильный.
- Обратите внимание, что ради примера я даже не включал комментарии, связанные с каждым
TweetВ этой вышеуказанной структуре, как бы это было бы даже Меснее.
Не используйте массивы для проведения сложных объектов. Как мы увидим позже, единственная точка использования массивов в нашем состоянии предназначено для элементов заказа. Это связано с тем, что, в отличие от массивов, мы не можем полагаться на объекты для заказа элементов, которые они содержат.
Заменить массивы по объектам
Простое и первое улучшение будет использовать объекты вместо массивов. Используя наш предыдущий пример и фокусировка, на данный момент, на Твиты Только массив, мы могли бы легко изменить это так:
Мы изменили предыдущие Твиты массив и разделить работу, которую она должна была сделать
- Создание
BYIDобъект, работа, чья только для удержания отдельных твитов - Создание
AllidsМассив, чья работа – сортировать твиты – но здесь мы можем просто поставить идентификатор каждого твита вместо всегочирикать.
Текущая структура уже гораздо более эффективна, чем первый. Чтобы найти твит, мы теперь будем ищите его через объект вместо массива. Время поиска через объект – это постоянное время, то есть o (1), что является большим улучшением по сравнению с O (n). Кроме того, нам больше не волнует о положении каждого твита внутри BYID объект. Allids Массив здесь, чтобы сортировать твиты, и теперь он намного проще работать с базовым массивом, таким как Allids Отказ
В том числе комментарии для каждого твита
Не делая наш код Месье, теперь мы можем добавить комментарии, которые будут принадлежать каждому твиту. Одним из методов реализации будет следующим:
Формирование нашего состояния, таким образом, оказывается намного более эффективным по сравнению с первым примером. Внутри каждого объекта Tweet мы ссылаемся только на комментарии, которые принадлежат ему через массив идентификаторов комментариев. Где-то еще у нас есть Комментарии Объект внутри, который мы можем получить информацию о каждом комментарии.
Теперь у нас есть более «сплющенная» структура, на которой мы можем эффективно работать. Обновление этой формы состояния потребует небольшого количества кода внутри наших редукторов. Наш код теперь легко поддерживается, и мы сократили шансы совершать ошибки.
Положить все вместе
Посмотрим, что будет конечным результатом по сравнению с нашим первоначальным подходом.
В отличие от первого подхода, где мы смешивали массивы и объекты, делающие состояние жесткого и болезненного для изменения и обслуживания, этот конечный подход теперь легко работать. Наш код легко поддерживается, и наши операции поиска очень быстро. Это явно победа!
Давайте рассмотрим несколько ситуаций, чтобы увидеть, что нужно сделать при изменении некоторых предметов:
Добавить твит
- Создать новый
Tweetобъект вBYIDобъектТвитыобъект - Добавьте идентификатор нового твита на
AllidsМассивТвитыобъект - Добавьте идентификатор нового твита на
Твитымассив внутри подходящегонитьобъект
Редактировать твит
- Найти выбранный
Tweetобъект по его идентификатору внутриBYIDобъектТвитыОбъект и обновить это
Удалить твит
- Найти выбранный
Tweetобъект по его идентификатору внутриBYIDобъектТвитыобъект и удалить его - Удалить Tweet ID внутри
AllidsМассивТвитыобъект - Удалить Tweet ID внутри
Твитымассив соответствующихнитьобъект
Добавить комментарий
- Создать новый
Комментарийобъект вBYIDобъектКомментарииобъект - Добавьте идентификатор нового комментария к
AllidsМассивКомментарииобъект - Добавьте идентификатор нового комментария к
Комментариимассив внутри подходящегоTweetобъект
Редактировать комментарий
- Найти выбранный
Комментарийобъект по его идентификатору внутриBYIDобъектКомментарииОбъект и обновить это
Селекторы
Один из способов подумать о селекторах – нарисовать параллельно с Getter и Setter. Отправка похожа на установку, поскольку он изменяет состояние, в то время как селектор похож на Getter, поскольку он извлекает данные.
Как правило, вы будете использовать селекторы внутри ваших компонентов контейнера при сопоставлении состояния в реквизиты с MapStatetoPOOPs Отказ Предположим (как указано в нашем примере), что у каждого твита есть Известный Имущество, которое является либо правда или ложь И что только один твит за один раз может быть редактирован. Если вы хотите получить редактируемый Tweet, вы можете написать селектор, как тот, который ниже:
Я только что предоставил один пример, но вы можете написать столько селекторов, сколько вам нужно в зависимости от данных, которые вы хотите получить.
Кроме того, и, как рекомендовано Dan Abramov, лучше всего писать ваши селекторы в том же файле, что и ваш редуктор. Это имеет смысл, особенно если вы думаете о них как о Getter/Benters. Кроме того, вы также можете обратиться к Redux Документация который предоставляет подробную информацию.
Получайте удовольствие от реализации Redux!
Ваше здоровье!
Оригинал: “https://www.freecodecamp.org/news/optimising-the-state-shape-of-your-react-app-with-redux-3a280e6ef436/”