Как обрабатывать переходы состояний в компоненте React/Flux

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

Поскольку текущий компонент на основе Backbone во многих отношениях неисправен, я хотел бы повторно реализовать этот поисковый компонент, используя React и, возможно, Flux архитектуру.

При планировании выяснилось, что мой компонент имеет как минимум 10 различных состояний (а может и больше), он должен реагировать на actions срабатывание по пользовательскому вводу, а также на actions срабатывание по асинхронным ответам сервера.

Вопрос 1. Должен ли я моделировать все состояние в store вместо родительского компонента? Это означало, что каждый пользовательский ввод изменяет состояние хранилища, например, :searchQuery, :searchResults и мой родительский компонент представления реагирует на эти изменения состояния?

Вопрос 2. Или мне следует смоделировать все состояния в самом родительском компоненте и полностью опустить store, dispatcher и actions?

Вопрос3: независимо от обработки состояния в store или в самом родительском компоненте оказалось, что сам компонент может иметь как минимум 10 различных состояний, и должно быть разрешено только определенное количество переходов . Обычно я использую здесь реализацию конечного автомата, моделирую все :states и разрешаю :transitions и выполняю переходы каждый раз, когда store принимает действие или вызывается метод обратного вызова в родительском компоненте. Каков правильный React way для обработки states и transitions между этими states в компоненте?

Вопрос 4. Какова современная реализация Flux для Javascript? До сих пор я видел reflux, но я не уверен, это мой яд.

Я открыт для всех видов предложений здесь.


person GeorgieF    schedule 14.03.2015    source источник
comment
У меня есть некоторые похожие вопросы. У меня есть форма, которая не сохраняется до тех пор, пока не будет нажата кнопка сохранения. Должен ли я заставить компонент изменять свое состояние и вызывать действие только тогда, когда хранилище (или другие компоненты) должны знать об этом? Должен ли компонент уведомлять хранилище каждый раз, когда пользователь вводит данные? Должен ли компонент иметь текущее состояние, а хранилище должно быть устаревшим до тех пор, пока оно не будет переведено в персистентное состояние (или потребуется какая-то более сложная логика)? Не запутает ли это источник истины?   -  person DanCaveman    schedule 19.03.2015


Ответы (1)


Я создаю аналогичный компонент в React с flux прямо сейчас, и я много работал с Backbone в прошлом, поэтому, надеюсь, я дал вам некоторое представление.

Я предполагаю, что ваше решение Backbone имело модель, локальную для вашего представления поиска, которое создавало :searchQuery при обновлении полей. При обратном вызове ajax вы, скорее всего, только что напрямую обновили файл :searchResults.

1-2:

С flux получается немного больше шаблонного кода, но по моему опыту, если я не создам магазин для начала, я всегда сожалею об этом. При этом я бы сделал SearchStore для :searchResults и сохранил :searchQuery в состоянии родительского компонента.

Таким образом, когда вы готовы вызвать свой поиск, вы используете действие просмотра SearchViewActions.getSearchResults(:searchQuery), которое выполняет вызов ajax, а в обратном вызове вызывает SearchServerActions.receiveSearchResults(:searchQuery, :searchResults) и обновляет хранилище. Затем ваш компонент результатов может прослушивать Store изменения и вызывать SearchStore.getResults(), когда увидит изменение. Это помогает разделить два подкомпонента на модули, тогда как вариант 2 тесно связывает два компонента и затрудняет повторное использование внешних компонентов.

3:

Мне нравится ваше решение конечного автомата, в котором вы можете просто спросить, разрешено ли вам сделать переход и вернуть набор свойств для обновления или функцию для выполнения вызова setState({...}) на основе этой информации.

4:

Reflux выглядит великолепно, так как кажется, что он немного уменьшает шаблон. Однако рефлюкс может или не может работать так же хорошо, как сток Flux.

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

person Liam Maier    schedule 15.03.2015