Рубрики
Без рубрики

Вот как оптимизировать форму состояния вашего приложения React с redux

Пилотом Ивана Вот как оптимизировать формы состояния вашего приложения React с Reduxusing Redux, чтобы управлять всем состоянием вашего приложения, это одно. Но убедившись, что структура вашего состояния является оптимальной, чтобы ваш код был ремонзонным, и эффективно ан. полностью

Пилотом Ивана

Использование Redux для управления всей состоянием вашего приложения вас – это одно. Но убедившись, что структура вашего состояния является оптимальной, чтобы ваш код был поддержан, и эффективно – это совершенно новая игра мяча!

Управление формой состояния вашего приложения абсолютно фундаментально. Когда ваше приложение растет, если ваша государственная форма не очень хорошо организована, управление его можно быстро стать грязным и даже замедлять отзывчивость вашего приложения.

Если вы используете RECT в качестве фронтальной структуры, шансы вы можете использовать Redux для управления состоянием вашего приложения. В этом случае вы будете реализовывать один или несколько редукторов для изменения состояния вашего приложения каждый раз, когда действие отправляется в ответ на действия пользователей. Давайте посмотрим ниже, как перейти от начальной неэффективной структуры формы состояния к тому, что это топ-исполнитель.

Начальная форма состояния

Предположим, мы пишем приложение, где пользователи могут публиковать твиты, и каждый твит имеет комментарии. Давайте также предположим, что твиты могут быть организованы по темам или потокам. Базовая и неэффективная форма состояния будет следующим:

Как вы можете видеть выше, у нас сложная вложенная структура. Эта государственная форма оказывается довольно неэффективной по нескольким причинам:

  • Он глубоко вложен, поэтому изменение состояния для обновления свойства Tweet требует, чтобы разработчик написал обширную сумму кода в редукторе.
  • Твиты Массив делает две вещи: он удерживает данные (то есть индивидуальный Tweet объект), и заказывая твиты, поскольку твиты находятся внутри массива.
  • В этой ситуации массивы неэффективны. Представьте, что у вас есть 50 000 твитов в потоке. Нахождение соответствующего твита внутри массива займет время. Время поиска внутри массива – это o (n), поскольку компьютер должен пройти весь список элементов, пока он не найдет правильный.
  • Обратите внимание, что ради примера я даже не включал комментарии, связанные с каждым Tweet В этой вышеуказанной структуре, как бы это было бы даже Меснее.

Не используйте массивы для проведения сложных объектов. Как мы увидим позже, единственная точка использования массивов в нашем состоянии предназначено для элементов заказа. Это связано с тем, что, в отличие от массивов, мы не можем полагаться на объекты для заказа элементов, которые они содержат.

Заменить массивы по объектам

Простое и первое улучшение будет использовать объекты вместо массивов. Используя наш предыдущий пример и фокусировка, на данный момент, на Твиты Только массив, мы могли бы легко изменить это так:

Мы изменили предыдущие Твиты массив и разделить работу, которую она должна была сделать

  1. Создание BYID объект, работа, чья только для удержания отдельных твитов
  2. Создание 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/”