Sto essenzialmente cercando di far reagire le schede, ma con alcuni problemi.
Ecco il file page.jsx
<RadioGroup>
<Button title="A" />
<Button title="B" />
</RadioGroup>
Quando si fa clic sul pulsante A, le esigenze dei componenti RadioGroup per deselezionare il pulsante B .
"Selezionato" significa semplicemente un className da uno stato o una proprietà
Ecco 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>);
}
});
L'origine di Button.jsx
non ha molta importanza, ha un normale pulsante di opzione HTML che attiva l' onChange
evento DOM nativo
Il flusso previsto è:
- Fare clic sul pulsante "A"
- Il pulsante "A" attiva onChange, evento DOM nativo, che si sposta fino a RadioGroup
- Viene chiamato il listener di RadioGroup onChange
- RadioGroup ha bisogno di de-selezionare il pulsante B . Questa è la mia domanda.
Ecco il problema principale che sto incontrando: non posso trasferirmi <Button>
inRadioGroup
, perché la struttura di questo è tale che i bambini sono arbitrari . Cioè, il markup potrebbe essere
<RadioGroup>
<Button title="A" />
<Button title="B" />
</RadioGroup>
o
<RadioGroup>
<OtherThing title="A" />
<OtherThing title="B" />
</RadioGroup>
Ho provato alcune cose.
Tentativo: nel RadioGroup
gestore onChange:
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(...)
Tentativo: nel RadioGroup
gestore onChange:
React.Children.forEach( this.props.children, function( child ) {
child.props.selected = child.props.value === e.target.value;
});
Problema: non succede nulla, anche io do Button
un componentWillReceiveProps
metodo alla classe
Tentativo: ho tentato di trasmettere uno stato specifico del genitore ai figli, quindi posso semplicemente aggiornare lo stato genitore e fare in modo che i bambini rispondano automaticamente. Nella funzione di rendering di 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.
Cattiva soluzione n. 1 : usa il metodo react-addons.js cloneWithProps per clonare i bambini in fase di rendering RadioGroup
per poter passare loro le proprietà
Cattiva soluzione n. 2 : implementa un'astrazione attorno a HTML / JSX in modo che io possa passare dinamicamente le proprietà (uccidimi):
<RadioGroup items=[
{ type: Button, title: 'A' },
{ type: Button, title: 'B' }
]; />
E poi RadioGroup
crea dinamicamente questi pulsanti.
Questa domanda non mi aiuta perché ho bisogno di rendere i miei figli senza sapere cosa sono
RadioGroup
forse sapere che ha bisogno di reagire a un evento dei suoi figli arbitrari? Deve necessariamente sapere qualcosa sui suoi figli.