У меня есть опыт работы с redux-form
, а также я проверил его API, но не нашел документированного способа получения полей в том виде, в котором они отображаются в форме.
Однако вот как я бы это сделал:
Я создам Редуктор, который будет отслеживать поля в порядке,
они зарегистрированы (отображаются в форме).
У нас очень подробное действие . Как вы уже упоминали - @@redux-form/REGISTER_FIELD
действие отправляет все поля в процессе регистрации в правильном порядке. Это действие имеет следующую полезную нагрузку:
{
type: '@@redux-form/REGISTER_FIELD',
meta: {
form: 'user'
},
payload: {
name: 'firstName',
type: 'Field'
}
}
Создать редуктор . Поэтому я просто создам Редуктор, который будет прослушивать все действия @@redux-form/REGISTER_FIELD
. Примерно так:
// The reducer will keep track of all fields in the order they are registered by a form.
// For example: `user` form has two registered fields `firstName, lastName`:
// { user: ['firstName', 'lastName'] }
const formEnhancedReducer = (state = {}, action) {
switch (action.type) {
case '@@redux-form/REGISTER_FIELD':
const form = action.meta.form
const field = action.payload.name
return { ...state, [form]: [...state[form], field] }
default:
return state
}
}
- Использование . Чтобы получить упорядоченные поля с помощью формы, вы просто имеете доступ к свойству Store (state) formEnhancer с именем формы:
state.formEnhanced.user
.
Имейте в виду, что вы должны рассматривать некоторые случаи как @@redux-form/DESTROY
, но я думаю, что это довольно простая реализация.
Я бы предпочел сохранить простоту и просто подписаться на @@redux-form/REGISTER_FIELD
и просто немного изменить реализацию редуктора, чтобы предотвратить дублирование полей формы. Поэтому я просто проверим, если поле формы уже зарегистрировано и не будет заботиться о поддержке @@redux-form/DESTROY
.
Надеюсь, это поможет.