Это должно быть state["person.name"]
, так как «person.name» - это ключ, используемый для хранения значения. Javascript объекты являются ассоциативными массивами пар ключ-значение.
const state = {};
state["person.name"] = "some value";
console.log(state);
console.log(state["person.name"]);
Данный обработчик:
function updateState(e) {
const { name, value } = e.target;
setState({ ...state, [name]: value });
}
Входное значение должно быть:
<input
type="textbox"
name="person.name"
value={state["person.name"]}
onChange={updateState}
/>
Если у вас более сложная форма состояния, то есть объект со свойствами различной глубины, тогда вам нужно спроектировать свой обработчик так, чтобы он соответствовал каждому свойству, которое можно обновить, создать отдельные обработчики для каждого типа обновления, разделить ваше состояние на более легкие в управлении чанки, использовать шаблон действия / редуктора, et c ...
Вот пример разделения состояния на куски глубиной не более 2 (т. е. 1 уровень вложенности):
export default function App() {
const [group, setGroup] = useState('A1');
const [person, setPerson] = useState({
name: "xyz",
age: 31
});
const updateState = stateObject => e => {
const { name, value } = e.target;
switch(stateObject) {
case 'group':
setGroup(value);
return;
case 'person':
setPerson(person => ({ ...person, [name]: value }));
return;
default:
// ignore
}
}
useEffect(() => {
console.log(group, person);
});
return (
<div className="App">
<h1>Hello CodeSandbox</h1>
<h2>Start editing to see some magic happen!</h2>
<label>Group</label>
<input
type="textbox"
name="group"
value={group}
onChange={updateState('group')}
/>
<hr />
<label>Name</label>
<input
type="textbox"
name="name"
value={person.name}
onChange={updateState('person')}
/>
</div>
);
}
Здесь я разделил состояние и создал обработчик карри, который принимает в качестве первого параметра «область» состояния, которое он обрабатывает, а второй - событие объект. Область состояний входит в оператор switch для обработки этого состояния определенным c образом.