Обновление: Вот пример Pen
https://codepen.io/anon/pen/vwzGYY?editors=0011
Предисловие
Исходя из моих исследований, мне кажется, что мне нужен совершенно другой подход.Может быть, вы можете предложить один?
Контекст
Я использую Redux-форму (технически более старую версию, но рассматриваемый API кажется действительно стабильным. Мы можем сжечь этот мост, когда доберемся.), Чтобы установить некоторые«фильтры» для своего рода списка результатов поиска.
В частности, поскольку я хочу, чтобы страницы были доступны для ссылок, я также задаю содержимое формы в параметрах URL-запроса через React-Router или изначально настраиваю его при загрузке страницы с помощью аналогичного механизма.
На данный момент единственным полем является "имя_организации", текстовое поле, которое используется для установки значения параметра запроса и запуска запроса API для /endpoint?name={some_name}
.
Например,
<Field
name="organization_name"
component="input"
type="text"
placeholder="Organization Name"
value={value}
/>
Я пробовал несколько вещей, но вот недавний снимок:
Я хватаю reset
, change
и другиевещи из реквизита по умолчанию.Я передаю handleSubmit
, как требуется.
handleSubmit
работает правильно, чтобы выполнить какое-то обновление состояния, установить / передать параметры URL-запроса с помощью React Router, а затем сделать новый вызов API / отображение новых результатов!Woot!
Что я хочу / ожидаю
В долгосрочной перспективе я бы хотел кнопку «Сбросить фильтры», которая возвращает все значения фильтра к значениям по умолчанию (например, установить значение «имя» пустымstring), и повторно отправляет форму (таким образом вызывая handleSubmit).
То, что я впервые попытался реализовать, это кнопка, как таковая:
<button
name="reset_filters_button"
type="button"
onClick={resetAndSubmit}
disabled={pristine || submitting}
>
Clear Search
</button>
Где resetAndSubmit
определено в контейнере формы следующим образом:
const resetAndSubmit = event => {
reset();
handleSubmit();
};
Что на самом деле происходит ... (submit имеет приоритет над отправленными событиями?)
Используя отладчик инструментов разработчика Chrome, Я ясно вижу , что вызывается метод reset
, и возвращает егоdispatch(...)
событие.Однако значения формы и состояния не обновляются до того, как handleSubmit()
запустится и отправит форму.
Я думаю, это может быть связано с тем, что событие отправки имеет приоритет?
Я также попробовал что-то нехорошее, например, импортировал change
(опору по умолчанию для контейнера) и определил кнопку сброса следующим образом:
<button
name="reset_filters_button"
type="button"
onClick={() => {
change('organization_name', '');
methodThatDispatchesSubmitAction();
}}
disabled={pristine || submitting}
>
Clear Search
</button>
Какой (еслиЯ удаляю methodThatDispatchesSubmitAction()
) работает правильно, чтобы вернуть значение поля пустым, что делает форму технически "нетронутой", а также снова.
methodThatDispatchesSubmitAction()
(если это не очевидно) привязывается к родительскому элементу через dispatchToProps
и передается в контейнер формы, где он использует предложение "удаленной отправки", например,
// organization_list_filter == name of the Redux-Form to submit.
dispatch(submit('organization_list_filter'));
TL; DR и последний вопрос:
Как правильно сбросить форму и отправить ее значения по умолчанию / пустые?
Каждый раз, когда я отправляю или напрямую вызываю Redux Form «submit», в итоге отправляется форма до очистки значений из состояния или пользовательского интерфейса. Я прошел через это с отладчиком , и он не пропускает мой вызов на reset
или change
.Это похоже на проблему асинхронности / гонки, но Я признаю Я точно не в своей лиге в данном конкретном случае.
Я просто прямо делаю это неправильно?