Автор оригинала: 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
может принимать объект или функцию
Не забывайте, что вы должны пройти функцию, когда ваше следующее состояние зависит от вашего предыдущего состояния.
Библиография
- Реагистрационная документация
- Достигните технические курсы Ryan Florence , который я действительно рекомендую.
Большое спасибо!