useState
hook позволяет вам определять любой тип состояния, например, Object, Array, Number, String, Boolean и т.д.таким образом, если вы поддерживаете массив или объект и передаете обновителю только значение, которое будет обновлено, это, по сути, приведет к потере других ваших состояний.
Чаще всего это может быть лучшеиспользуйте несколько хуков вместо использования объекта с одним хуком useState
или, если хотите, вы можете написать свой собственный хук, который объединяет значения типа
const useMergerHook = (init) => {
const [state, setState] = useState(init);
const updater = (newState) => {
if (Array.isArray(init)) {
setState(prv => ([
...prv,
...newState
]))
} else if(typeof init === 'object' && init !== null) {
setState(prv => ({
...prv,
...newState
}))
} else {
setState(newState);
}
}
return [state, updater];
}
, или если обновления состояния / состояния должны быть болееcomplex и обработчик необходимо передать компоненту, я бы рекомендовал использовать хук useReducer
, поскольку у вас есть несколько логик для обновления состояния и вы можете использовать сложные состояния, такие как вложенные объекты и логика записи для обновления выборочно