Aquí hay una solución completa que incorpora la mejor respuesta y los comentarios a continuación (lo que podría ayudar a alguien que lucha por reconstruirlo todo):
ACTUALIZACIÓN PARA ES6 (2019): uso de funciones de flecha y desestructuración de objetos
en componente principal:
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 incluido (que ahora es funcional sin estado):
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>
)
RESPUESTA PREVIA (usando bind):
en componente principal:
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 incluido (que ahora es funcional sin estado):
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>
)
el componente principal mantiene el valor seleccionado para la fruta (en estado), el componente incluido muestra el elemento seleccionado y las actualizaciones se devuelven al componente principal para actualizar su estado (que luego vuelve al componente incluido para cambiar el valor seleccionado).
Tenga en cuenta el uso de un nombre prop que le permite declarar un solo método handleChange para otros campos en el mismo formulario, independientemente de su tipo.