Ecco una soluzione completa che incorpora la migliore risposta e i commenti sottostanti (che potrebbero aiutare qualcuno che fatica a mettere tutto insieme):
AGGIORNAMENTO PER ES6 (2019): utilizzo delle funzioni freccia e distruzione degli oggetti
nel componente principale:
class ReactMain extends React.Component {
constructor(props) {
super(props);
this.state = { fruit: props.item.fruit };
}
handleChange = (event) => {
this.setState({ [event.target.name]: event.target.value });
}
saveItem = () => {
const item = {};
item.fruit = this.state.fruit;
// do more with item object as required (e.g. save to database)
}
render() {
return (
<ReactExample name="fruit" value={this.state.fruit} handleChange={this.handleChange} />
)
}
}
componente incluso (che ora è un funzionale apolide):
export const ReactExample = ({ name, value, handleChange }) => (
<select name={name} value={value} onChange={handleChange}>
<option value="A">Apple</option>
<option value="B">Banana</option>
<option value="C">Cranberry</option>
</select>
)
RISPOSTA PRECEDENTE (usando il bind):
nel componente principale:
class ReactMain extends React.Component {
constructor(props) {
super(props);
// bind once here, better than multiple times in render
this.handleChange = this.handleChange.bind(this);
this.state = { fruit: props.item.fruit };
}
handleChange(event) {
this.setState({ [event.target.name]: event.target.value });
}
saveItem() {
const item = {};
item.fruit = this.state.fruit;
// do more with item object as required (e.g. save to database)
}
render() {
return (
<ReactExample name="fruit" value={this.state.fruit} handleChange={this.handleChange} />
)
}
}
componente incluso (che ora è un funzionale apolide):
export const ReactExample = (props) => (
<select name={props.name} value={props.value} onChange={props.handleChange}>
<option value="A">Apple</option>
<option value="B">Banana</option>
<option value="C">Cranberry</option>
</select>
)
il componente principale mantiene il valore selezionato per fruit (nello stato), il componente incluso visualizza l'elemento selezionato e gli aggiornamenti vengono passati al componente principale per aggiornare il suo stato (che quindi ritorna al componente incluso per modificare il valore selezionato).
Si noti l'uso di un nome prop che consente di dichiarare un singolo metodo handleChange per altri campi nello stesso modulo indipendentemente dal loro tipo.