Пытаясь догнать React Hooks . Я читаю, что они рекомендуют использовать Крюк useReducer
при работе с комплексом state
. Но мои сомнения начинаются со следующей схемы:
Использование React + Typescript , предположим, у меня есть состояние с несколькими полями (я приведу пример с классами):
type Person = {
username: string,
email: string
}
type Pet = {
name: string,
age: number
}
this.state: MyState = {
person: Person,
pet: Pet,
loading: boolean
}
Если бы я хотел обработать это состояние с помощью нового подхода на основе хуков, я мог бы подумать о нескольких вариантах:
Вариант 1: с использованием хука useState
для каждого поля
const [person, setPerson] = useState<Person>(null)
const [pet, setPet] = useState<Pet>(null)
const [loading, setLoading] = useState<boolean>(false)
Недостатком этого метода является низкая масштабируемость, и некоторые из моих реальных состояний имеют как минимум 15 полей. Это неуправляемо.
Вариант 2: Использование одного setState
для всего объекта
const [state, setState] = useState<MyState>({
person: null,
pet: null,
loading: false
})
Этот метод кажется мне наиболее простым, где я могу просто сделать setState((prev) => {...prev, person: {username: 'New', email: 'example@gmail.com'}})
или адаптировать его к любой модификации поля. Я даже могу обновить несколько полей одновременно.
Вариант 3: использовать useReducer
для каждого из сложных полей, передавая указанный c редуктор для каждого, использовать useState
для простых
const [person, dispatchPerson] = useReducer<Person>(personReducer)
const [pet, dispatchPet] = useReducer<Pet>(petReducer)
const [loading, setLoading] = useState<boolean>(false)
Я нахожу это управляемым, но я не вижу смысла настраивать функцию уменьшения с помощью многострочного переключателя, в дополнение к утомительному процессу установка типов диспетчеризации в Typescript для каждой функции сокращения, когда вы можете просто использовать setState и покончить с этим.
Опция 4: использовать один useReducer
для всего состояния
const [state, dispatch] = useReducer(generalReducer)
Основная проблема с этим - тип редуктора, - 15 полей, где все типы и структура информации для их обновления различны . Указание типов в Typescript не масштабируется или неясно. Есть несколько статей по этому поводу, и ни одна из них не решает проблему чисто ( пример 1 ), или они чрезвычайно просты и не относятся к проблеме ( пример 2 ) ).
Как лучше всего справляться с делами такого типа? Где количество полей в состоянии велико и может иметь несколько уровней глубины. Существуют ли передовые практики или официальные примеры, представляющие эти случаи? Примеры с числовым полем для работы с простым счетчиком, который так нравится блоггерам или официальным документам, не очень полезен.
Любой свет на эту тему будет более чем приветствоваться! Заранее спасибо и извините за мой Engli sh