Я пытаюсь использовать компонент Form
с subscription={{ submitting: true, pristine: true }}
, чтобы он не перерисовывал всю форму при каждом изменении. У меня есть поле, которое меняет значение другого в форме. Я ожидаю, что компонент Field
будет подписан на изменения его имени. В этом случае он не меняется, и мне нужно обернуть поле с FormSpy
. Это не лучшее решение, поскольку FormSpy
не может подписаться на одно значение и повторно отображает его дочерние элементы при каждом изменении в values
.
Этот код работает, но он не должен нуждаться FormSpy
:
export const CountryForm = ({ regions, countries }) => (
<Form
onSubmit={submittedData => {
console.log({ submittedData })
}}
subscription={{ submitting: true, pristine: true }}
render={({ handleSubmit, form }) => (
<form onSubmit={handleSubmit}>
<FormLabel>Regions</FormLabel>
<FormField
name="region"
render={({ input, ...props }) => (
<Select
options={regions}
input={{
...input,
onChange: (selectedRegion: string) => {
input.onChange(selectedRegion)
const formState = form.getState()
const selectedCountries: string[] = formState.values.countries || []
const countriesFiltered = filter(countries, {
region: selectedRegion,
})
forEach(countriesFiltered, country => {
if (selectedCountries.indexOf(country.code) === -1)
selectedCountries.push(country.code)
})
form.change('countries', selectedCountries)
},
}}
{...props}
/>
)}
/>
<FormLabel>Countries</FormLabel>
<FormSpy subscription={{ values: true }}>
{() => (
<Field
name="countries"
render={props => <Select options={countries} {...props} />}
/>
)}
</FormSpy>
</form>
)}
/>
)
Без компонента FormSpy
он не обновляет поле sh countries
при изменении поля region
.
Моя проблема в том, что я не знаю, является ли это ошибкой при использовании свойства subscription
в Form
или я неправильно использую функцию form.onChange
.