Давайте посмотрим на значение User и setUser
const [User, setUser] = useState({
id: 1,
name: "ed",
age: Number,
edit: false
});
React.useState
возвращает значение и установщик этого значения. setUser
- это функция. Поэтому, хотя User.name является строкой с начальным значением "ed", setUser.name не существует. Ошибка TypeError: setUser.name is not a function
является результатом попытки передать неопределенное значение аргументу. Один из способов решения этой проблемы - Муртаза Хуссейн и другие ответы:
<input
value={User.name}
onChange={e => setUser(prev => ({...prev, name: e.target.value}))}
/>
В качестве альтернативы вы можете использовать пользовательский хук useObjState
, который предоставляет довольно простой API.
UseObjState hook
const useObjState = initialObj => {
const [obj, setObj] = React.useState(initialObj);
const setObjHelper = useMemo( () => { // the value of setObjHelper is permanent, so even if it is passed to a child component, it shouldn't require extra component updates
const helper = {}
Object.keys(initialObj).forEach(key => {
helper[key] = newVal => setObj({ ...obj, [key]: newVal });
});
return helper
}, [])
return [obj, setObjHelper];
};
Предоставляет гораздо более простой и понятный способ обновления значения свойства name.
function App() {
const [user, setUser] = useObjState({
id: 1,
name: "ed",
age: Number,
edit: false
});
return (
<input
value={user.name}
onChange={e => setUser.name(e.target.value)} />
/>
)
}
Демо