У меня есть форма, которая стала действительно интенсивной. Примерно 20 входных данных, которые включают в себя несколько сборщиков дат, API-адреса местоположений Google, значения правил и т. Д. Поскольку очень немногие из этих входных данных могут обновляться напрямую, без какого-либо преобразования. Я успешно преобразовал компонент из компонента с состоянием, который слишком много делал в методах жизненного цикла (теперь с помощью formik для управления значениями), но я пытаюсь определить, какой лучший способ определить необходимые вспомогательные функции (например, updatedDateWithTime, formatAddress) с точки зрения производительности и стиля, и может думать только о нескольких вариантах.
Вариант один: функциональные выражения внутри функционального компонента:
const MyHugeForm = () => {
const helper1 = () => { console.log("thing1") }
const helper2 = () => {console.log("thing2") }
return() {...}
}
Опция 2: как «глобальные переменные», определенные в файле, вне функции:
helper1() => console.log("thing1");
helper2() => console.log("thing2");
const MyHugeForm = () => {
return() {...}
}
Вариант 3: в качестве встроенных функций стрелок, используемых внутри дочерних компонентов (то есть разбить каждый вход на собственный компонент и передать подпорки вниз)
const MyHugeForm = (props) => {
return() {
<div>
<DateInput startDate={props.startDate} />
<LocationInput location={props.googleLocation} />
</div>
}
}
const DateInput = (props) => {
<DatePicker onChange={() => console.log("thing1")} />
}
const LocationInput = (props) => {
<input onChange={() => console.log("thing2")} />
}
Кажется неправильным определять примерно 20 из этих вспомогательных функций за пределами (но в том же файле, что и) функционального компонента, но определение их как выражений функций внутри компонента выглядит хуже, а из двух вариантов хуже для производительности. Разбиение частей на дочерние компоненты выглядит как правильный шаблон с точки зрения уменьшения сложности 600-строчного функционального компонента, но если дочерние элементы просто определяют одинаковые функции, встроенные в их рендеринге, разве это не то же самое?