Я начинаю использовать Facebook React в проекте Backbone, и пока все идет очень хорошо.
Однако я заметил, что в мой код React закрадывается некоторое дублирование.
Например, у меня есть несколько виджетов, похожих на формы, с такими состояниями, как INITIAL
, SENDING
и SENT
. Когда кнопка нажата, необходимо проверить форму, сделать запрос, а затем обновить состояние. Состояние, this.state
конечно же, сохраняется в React вместе со значениями полей.
Если бы это были представления Backbone, я бы извлек базовый класс, называемый, FormView
но у меня сложилось впечатление, что React не поддерживает и не поддерживает подклассы для совместного использования логики представления (поправьте меня, если я ошибаюсь).
Я видел два подхода к повторному использованию кода в React:
- Миксины (например, LinkedStateMixin , поставляемый с React);
- Компоненты контейнера (например, react-infinite-scroll ).
Правильно ли я, что миксины и контейнеры предпочтительнее наследования в React? Это осознанное дизайнерское решение? Было бы лучше использовать миксин или компонент-контейнер для моего примера «виджета формы» из второго абзаца?
Вот суть FeedbackWidget
и JoinWidget
в их текущем состоянии . У них схожая структура, аналогичный beginSend
метод, и обоим потребуется некоторая поддержка валидации (пока еще нет).
источник
Ответы:
Сначала я пробовал использовать для этого подкомпоненты и извлекать
FormWidget
иInputWidget
. Однако я отказался от этого подхода на полпути, потому что хотел лучше контролировать сгенерированныеinput
s и их состояние.Две статьи, которые мне больше всего помогли:
Оказалось, что мне нужно было написать всего два (разных) миксина:
ValidationMixin
иFormMixin
.Вот как я их разделил.
ValidationMixin
Миксин валидации добавляет удобные методы для запуска ваших функций валидатора для некоторых свойств вашего состояния и сохранения свойств с ошибками в
state.errors
массиве, чтобы вы могли выделить соответствующие поля.Источник ( суть )
использование
ValidationMixin
имеет три метода:validate
,hasError
иresetError
.Он ожидает, что класс определит
validators
объект, аналогичноpropTypes
:Когда пользователь нажимает кнопку отправки, я звоню
validate
. Вызовvalidate
будет запускать каждый валидатор и заполнятьthis.state.errors
его массивом, содержащим ключи свойств, которые не прошли проверку.В своем
render
методе я используюhasError
для создания правильного класса CSS для полей. Когда пользователь помещает фокус внутри поля, я призываюresetError
убрать выделение ошибки до следующегоvalidate
вызова.FormMixin
Примесь формы обрабатывает состояние формы (редактируется, отправляется, отправлено). Вы можете использовать его для отключения ввода и кнопок во время отправки запроса и для обновления вашего представления при его отправке.
Источник ( суть )
использование
Он ожидает, что компонент предоставит один метод:,
sendRequest
который должен вернуть обещание Bluebird. (Его легко изменить для работы с Q или другой библиотекой обещаний.)Он предоставляет удобные методы, такие как
isFormEditable
,isFormSubmitting
иisFormSubmitted
. Она также обеспечивает способ пнуть запрос:submitForm
. Вызвать его можно изonClick
обработчика кнопок формы .источник
FormInput
разговариваю со своим владельцем черезformLink
.formLink
подобноvalueLink
, и возвращаются изFormMixin
«SlinkValidatedState(name, validator)
методы.FormInput
получает свое значение отformLink.value
и вызываетformLink.requestBlur
иformLink.requestFocus
- они вызывают проверку вFormMixin
. Наконец, чтобы настроить фактический компонент, используемый для ввода, я могу передать егоFormInput
:<FormInput component={React.DOM.textarea} ... />
done
bluebird, и код будет работать, как в Q (или собственных обещаниях) - конечно, bluebird лучше. Также обратите внимание, что с момента ответа синтаксис в React изменился.Я создаю SPA с React (в производстве уже 1 год) и почти никогда не использую миксины.
Единственный вариант использования миксинов, который у меня сейчас есть, - это когда вы хотите поделиться поведением, которое использует методы жизненного цикла React (и
componentDidMount
т. Д.). Эта проблема решается Компонентами высшего порядка, о которых Дэн Абрамов говорит в своей ссылке. (или с помощью наследования классов ES6).Миксины также часто используются во фреймворках, чтобы сделать API фреймворка доступным для всех компонентов с помощью «скрытой» контекстной функции React. Это больше не понадобится и с наследованием классов ES6.
В большинстве случаев используются миксины, но они на самом деле не нужны, и их можно было бы проще заменить простыми помощниками.
Например:
Вы можете очень легко реорганизовать
LinkedStateMixin
код так, чтобы синтаксис был таким:Есть большая разница?
источник