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

Как стать профессионалом с помощью ATT STETSTATE () за 10 минут

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

Автор оригинала: FreeCodeCamp Community Member.

Эта статья направлена на людей, которые уже имели свой первый подход к реагированию, а кто, как новичков, имеют сомнения в том, как SetState Работает и как его использовать правильно. Он также должен помочь в середине старших разработчиков используйте более чистые и более абстрагированные способы установки состояния, а также сделать обрабные функции с более высоким порядком и абстрактным государством.

Просто прочитайте и веселитесь!

Так возьмите чашку кофе и продолжайте читать! ?

Основные понятия SetState ()

Компоненты реагирования позволяют разделить пользовательский интерфейс (UI) в независимые, многоразовые части, поэтому вы можете подумать о каждой части в изоляции.

Концептуально компоненты похожи на JavaScript функции. Они принимают произвольные входы (называемые «реквизиты») и возвращает элементы реагирования, описывающие, что должно появиться на экране.

Если вам нужно дать пользователю возможность вводить что-то или каким-то образом изменить переменные, компонент получает как реквизиты, вам понадобится SetState Отказ

Если вы объявляете компонент как функцию или класс, он никогда не должен изменять свои собственные реквизиты.

Все компоненты реагирования должен действовать как чистые функции по отношению к их реквизиту. Это означает функции, которые никогда не пытаются изменить свои входы и всегда возвращать тот же результат для тех же входов.

Конечно, применение UIS динамически и меняется со временем. Вот почему Государство был создан.

Государство Позволяет реагировать компоненты изменять свой выход с течением времени в ответ на действия пользователей, реакциям сети и что-либо еще, не нарушая это правило.

Компоненты, определенные в качестве классов, имеют некоторые дополнительные функции. Локальное состояние – это функция доступна только классам компонентов.

SetState Метод API снабжен библиотекой, так что пользователь может определить и управлять состоянием со временем.

Три правил большого пальца при использовании setState ()

Не изменяйте состояние напрямую

Государственные обновления могут быть асинхронными

Реагирование может быть множественным setState () звонит в одно обновление для производительности.

Потому что Это .props и Это Может быть обновлен асинхронно, вы не должны полагаться на их значения для расчета следующего состояния.

Вы всегда должны делать такие манипулирования с функциональным подходом, поставляя Государство и реквизит и возвращение нового Государство на основе первого.

Государственные обновления объединены

Когда вы звоните setState () Реагирование объединяет объект, который вы предоставляете в текущий Государство Отказ

В приведении ниже мы обновляем переменную Догнидстваваццинация независимо от другого Государство Переменные.

Объединение мелкая, так this.setState ({dogneedsvacination: true}) Оставляет другие переменные нетронутыми, заменяя только значение Догнидстваваццинация Отказ

Уважение потока данных и избегайте состояния максимума

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

Вот почему Государство часто называют локальным или инкапсулированным. Это не доступно для любого компонента, отличного от того, которого владеет и устанавливает его.

Когда ты SetState Опора и использовать его в своем компоненте, вы нарушаете поток реквизитов рендеринга. Если по какой-то причине проповедуется в ваш компонент изменился в родительском компоненте, ребенок не будет перенесен автомагически?!

Давайте проверим пример:

Здесь у вас есть Главная Компонент, который генерирует волшебный номер каждый 1000 мс и устанавливает его на свой собственный Государство Отказ

После этого он оказывает номер и вызывает три Ребенок Компоненты (братья и сестры), которые получат волшебный номер с целью отображения его с использованием трех разных подходов:

Первый подход

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

Второй подход

Компонент Childofhomebrother получает реквизит от его родителя и, вызовов ComponentDidmount , устанавливает волшебный номер в Государство Отказ Тогда он делает State.magicnumber Отказ

Этот пример не работает, потому что Render () не знает, что опора Изменилось, так что не вызывает повторное рендеринг компонента. Как компонент больше не восстанавливается, ComponentDidmount не вызывается, и дисплей не обновляется.

Третий подход

Обычно, когда мы пытаемся сделать его работу, используя второй подход, мы думаем, что что-то отсутствует. Вместо того, чтобы сделать шаг назад, мы продолжаем добавлять вещи в код, чтобы он работал!

Так что в этот третий подход мы добавили ComponentDidupdate Чтобы проверить, есть ли изменения в реквизит Чтобы вызвать повторное рендеринг компонента. Это ненужно и приводит нас к нечистому коду. Он также приносит с ним эксплуатационные расходы, которые будут умножены на количество раз, когда мы делаем это в большом приложении, где у нас есть много прикованных компонентов и побочных эффектов.

Это неправильно, если вам не нужно позволять пользователю изменять полученное значение SPOP.

Если вам не нужно менять значение SPOP, всегда старайтесь держать вещи, работающие в соответствии с потоком реагирования (первый подход).

Вы можете проверить рабочую веб-страницу с этим примером, который я подготовил для вас в Глюк Отказ Посмотрите и веселитесь?

Также проверьте код в Home.js и HomeCoDeCleaned.js (без HTML вещей) в мой репо об этой статье.

Как setState.

Итак, на данный момент я думаю, пришло время добиться наших рук!

Давайте немного играть с SetState И улучшить это! Просто следите и возьмите еще одну чашку кофе!

Давайте создадим небольшую форму для обновления пользовательских данных:

Вот код для примера выше:

Мы устанавливаем Государство в качестве объекта, и нет проблем, потому что наше текущее состояние не зависит от нашего последнего государства.

Что, если мы создадим еще одну форму формы, чтобы представить и отобразить фамилию?

Хороший! Мы абстрагировали HandleMachange Способ иметь возможность обрабатывать все поля ввода и SetState Отказ

Что, если мы добавим кнопку Toggle, чтобы отметить данные как действительные или неверные и счетчики, чтобы узнать, сколько изменений мы сделали с государством?

Ага! Мы качаемся! Мы абстрагировали много вещей!

Хммм … Допустим, я не хочу флажок контролировать IsValid переменная, но простая кнопка переключения.

Давайте также отделим счетчик счетчика от этого метода. Работает хорошо, но в более сложных ситуациях, когда реагировать на реакцию, необходимо переменную/группу, это не хорошая политика, чтобы полагаться на this.state.counter переменная, чтобы добавить еще один. Это значение может измениться без того, чтобы вы не знаете об этом.

Мы используем неглубокую копию его в момент, когда вызывается операция, и в этом определенном момент времени вы не знаете, является ли его значение тем, что вы ожидали или нет!

Давайте пойдем немного функционально!

Хорошо – мы потеряли абстракцию, потому что мы отделили обработчиков, но это для веской причины!

Так что в это время мы держим HandleMachange Передача объекта к SetState Метод API. Но Handlecounter и HandsisValid Методы теперь функциональны и начнутся с помощью текущего состояния, а затем, в зависимости от этого состояния, изменяя его на следующий.

Это правильный способ изменения Государство переменных, которые зависят от предыдущего состояния.

Что если мы хотим console.log () Государственные изменения Имя и фамилия Входные формы каждый раз происходит изменение? Давайте попробуем!

Хороший! Каждый раз HandleMachange происходит (что означает, что новый ключ Press произошел) logfields () Метод вызывается и регистрирует текущее состояние в консоль!

Давайте проверим консоль браузера:

Ждать! Что случилось здесь, ребята? Журнал консоли – одно изменение перед текущей входной формы! Почему это происходит?

setstate async !!

Мы уже знали это, но теперь мы видим это с нашими глазами! Что там происходит? Давайте посмотрим на HandleMachange и logfields Методы выше.

Итак, HandleMachange Метод получает имя и значение события, затем делает SetState Из этих данных. Затем он называет Handlecounter Чтобы обновить информацию о счетчике, а в конце сзывает logfields метод. logfields Метод захватывает CurrentState и возвращает «эдуард» вместо «Eduardo».

Дело в том, что SetState асинхн и не действует в данный момент. Реагировать выполняет свою работу и выполняет logfields Сначала метод, оставляя SetState для следующего контура событий.

Но как мы можем избежать такой ситуации?

Ну, SetState API имеет Обратный вызов Чтобы избежать этой ситуации:

Если мы хотим logfields () Чтобы принять во внимание недавние изменения, которые мы сделали в государстве, нам нужно призвать его в обратном вызове, как это:

Хорошо, сейчас это работает!

Мы говорим отреагируем: «Эй, отреагируемся! Осторожно, когда вы вызываете logfields Метод, я хочу, чтобы у вас было Государство Уже обновлено хорошо? Я доверяю тебе!»

РЕАКТ говорит: «Хорошо, Эдо! Я собираюсь справиться со всей этой партией вещей, которые я обычно делаю на заднем дворе с SetState Мачина и только когда я закончу с этим, я призвую logfields () ! Cool Man! Расслабься! “

И на самом деле – это сработало!

Ладно всем! К этому времени мы обрабатывали основные ловушки SetState Отказ

У вас есть смелость выйти за пределы стены? Возьмите чашку кофе и давайте по-настоящему нажм …

Получение модных с setState ()

Теперь, когда у нас есть Handlecounter и HandsisValid Методы и setState () Выраженные функциями, мы можем составить государственное обновление с другими функциями! Меня любимая композиция! Давай повеселимся!

Мы можем взять логику внутри SetState на функцию за пределами компонента класса. Давайте назовем это TodgleisValid Отказ ☝️.

Теперь эта функция может жить вне компонента класса, где угодно в вашем приложении.

Что делать, если мы используем функцию более высокого порядка?

Ух ты! Теперь мы не вызываем TodgleisValid функция больше. Мы вызываем абстрактную функцию более высокого порядка Todglekey и прохождение ключа (строка в этом случае) в него.

Как нам нужно изменить TodgleisValid Функция сейчас?

Какие?! Теперь у нас функция называется Todglekey который получает ключ и возвращает новую функцию, которая меняет состояние в соответствии с прилагаемым ключом.

Это Todglekey Может быть в библиотеке или в помощнике файла. Он может быть вызван во многих различных контекстах, чтобы изменить состояние всего, что вы хотите напротив.

Большой!

Давайте сделаем то же самое с обработчиком приращения:

Ага! Оно работает! Так мило. Давайте сейчас сойдем с ума …

Стрелять по луне и возвращаться

Что делать, если мы создадим общий Makeupdater Функция, которая принимает функцию трансформации, которую вы хотите подать заявку, принимает ключ и возвращает функцию состояния управления состоянием с функцией преобразования и ключом? Немного запутался? Пошли!

Хорошо, этого достаточно … Давайте остановимся здесь. ?

Вы можете проверить весь код, который мы сделали в этом Github Repo Отказ

Последний, но тем не менее важный

Не забудьте избежать максимального использования состояния и уважение рендеринга RACH REPPS CASCADE.

Не забывайте SetState это асинхр.

Не забывайте SetState может принимать объект или функцию

Не забывайте, что вы должны пройти функцию, когда ваше следующее состояние зависит от вашего предыдущего состояния.

Библиография

  1. Реагистрационная документация
  2. Достигните технические курсы Ryan Florence , который я действительно рекомендую.

Большое спасибо!