Invoervelden binden aan een object in React
Stel dat er een object in de state wordt opgeslagen:
jsxconst initObj = {
prop1: 'value1',
prop2: 'value2',
prop3: 'value3',
}
function App() {
const [obj, setObj] = useState(initObj);
return <div>
{obj.prop1}-{obj.prop2}-{obj.prop3}
</div>;
}
Laten we elke eigenschap van ons object weergeven in een apart invoerveld:
jsxfunction App() {
const [obj, setObj] = useState(initObj);
return <div>
<input value={obj.prop1} />
<input value={obj.prop2} />
<input value={obj.prop3} />
<br />
{obj.prop1}-{obj.prop2}-{obj.prop3}
</div>;
}
Laten we nu aan elk invoerveld het
gebeurtenis onChange binden.
We wijzen één gemeenschappelijke functie toe
als handler:
jsxfunction App() {
const [obj, setObj] = useState(initObj);
return <div>
<input value={obj.prop1} onChange={event => handleChange('prop1', event)} />
<input value={obj.prop2} onChange={event => handleChange('prop2', event)} />
<input value={obj.prop3} onChange={event => handleChange('prop3', event)} />
<br />
{obj.prop1}-{obj.prop2}-{obj.prop3}
</div>;
}
Zoals je ziet, accepteert de functie handleChange
als eerste parameter de naam van de corresponderende
eigenschap van het object.
Laten we de implementatie van onze functie schrijven:
jsxfunction handleChange(prop, event) {
const copy = Object.assign({}, obj);
copy[prop] = event.target.value;
setObj(copy);
}
Deze implementatie werkt, maar kan worden vereenvoudigd door gebruik te maken van berekende namen van objecteigenschappen:
jsxfunction handleChange(prop, event) {
setObj({...obj, ...{[prop]: event.target.value}});
}
Laten we alle code samenvoegen:
jsxfunction App() {
const [obj, setObj] = useState(initObj);
function handleChange(prop, event) {
setObj({...obj, ...{[prop]: event.target.value}});
}
return <div>
<input value={obj.prop1} onChange={event => handleChange('prop1', event)} />
<input value={obj.prop2} onChange={event => handleChange('prop2', event)} />
<input value={obj.prop3} onChange={event => handleChange('prop3', event)} />
<br />
{obj.prop1}-{obj.prop2}-{obj.prop3}
</div>;
}
Stel dat er een object met een datum in de state wordt opgeslagen:
jsxconst initDate = {
year: 2025,
month: 12,
day: 31,
}
Toon in een alinea het jaar, de maand en de dag uit de datum die in de state is opgeslagen, evenals de weekdag die daarbij hoort.
Pas de vorige opdracht aan door drie invoervelden toe te voegen voor het bewerken van de datum.