Básicamente, estoy tratando de hacer que las pestañas reaccionen, pero con algunos problemas.
Aquí está el archivo page.jsx
<RadioGroup>
<Button title="A" />
<Button title="B" />
</RadioGroup>
Al hacer clic en el botón A, las necesidades de componentes RadioGroup para deseleccionar el botón B .
"Seleccionado" solo significa un className de un estado o propiedad
Aquí está RadioGroup.jsx
:
module.exports = React.createClass({
onChange: function( e ) {
// How to modify children properties here???
},
render: function() {
return (<div onChange={this.onChange}>
{this.props.children}
</div>);
}
});
La fuente de Button.jsx
realmente no importa, tiene un botón de radio HTML regular que activa el onChange
evento DOM nativo
El flujo esperado es:
- Haga clic en el botón "A"
- El botón "A" activa onChange, evento DOM nativo, que se propaga a RadioGroup
- Se llama al oyente de RadioGroup onChange
- RadioGroup necesita de-seleccione el botón B . Esta es mi pregunta.
Aquí está el problema principal que estoy encontrando: no puedo moverme <Button>
aRadioGroup
, porque la estructura de esto es tal que los niños son arbitrarios . Es decir, el marcado podría ser
<RadioGroup>
<Button title="A" />
<Button title="B" />
</RadioGroup>
o
<RadioGroup>
<OtherThing title="A" />
<OtherThing title="B" />
</RadioGroup>
Probé algunas cosas.
Intentar: En RadioGroup
controlador onChange 's:
React.Children.forEach( this.props.children, function( child ) {
// Set the selected state of each child to be if the underlying <input>
// value matches the child's value
child.setState({ selected: child.props.value === e.target.value });
});
Problema:
Invalid access to component property "setState" on exports at the top
level. See react-warning-descriptors . Use a static method
instead: <exports />.type.setState(...)
Intentar: En RadioGroup
controlador onChange 's:
React.Children.forEach( this.props.children, function( child ) {
child.props.selected = child.props.value === e.target.value;
});
Problema: no pasa nada, incluso yo le doy Button
un componentWillReceiveProps
método a la clase
Intento: intenté pasar algún estado específico del padre a los hijos, por lo que puedo actualizar el estado del padre y hacer que los hijos respondan automáticamente. En la función de renderizado de RadioGroup:
React.Children.forEach( this.props.children, function( item ) {
this.transferPropsTo( item );
}, this);
Problema:
Failed to make request: Error: Invariant Violation: exports: You can't call
transferPropsTo() on a component that you don't own, exports. This usually
means you are calling transferPropsTo() on a component passed in as props
or children.
Mala solución n. ° 1 : use el método react-addons.js cloneWithProps para clonar a los niños en el tiempo de renderizado RadioGroup
para poder pasarles propiedades
Mala solución n. ° 2 : implementar una abstracción alrededor de HTML / JSX para que pueda pasar las propiedades dinámicamente (mátame):
<RadioGroup items=[
{ type: Button, title: 'A' },
{ type: Button, title: 'B' }
]; />
Y luego, RadioGroup
construya dinámicamente estos botones.
Esta pregunta no me ayuda porque necesito hacer que mis hijos sin saber qué son
RadioGroup
saber que necesita reaccionar ante un evento de sus hijos arbitrarios? Necesariamente tiene que saber algo sobre sus hijos.