Zasadniczo staram się, aby karty reagowały, ale z pewnymi problemami.
Oto plik page.jsx
<RadioGroup>
<Button title="A" />
<Button title="B" />
</RadioGroup>
Po kliknięciu w przycisk A, potrzeby elementów RadioGroup de-wybierz przycisk B .
„Wybrane” oznacza po prostu nazwę klasy ze stanu lub właściwości
Oto 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>);
}
});
Źródło Button.jsxnie ma tak naprawdę znaczenia, ma zwykły przycisk opcji HTML, który wyzwala natywne onChangezdarzenie DOM
Oczekiwany przepływ to:
- Kliknij przycisk „A”
- Przycisk „A” uruchamia natywne zdarzenie onChange DOM, które przechodzi do RadioGroup
- Wywołuje się odbiornik RadioGroup onChange
- RadioGroup musi de-wybierz przycisk B . To jest moje pytanie.
Oto główny problem mam napotykając: I nie można przenieść <Button>s doRadioGroup , ponieważ struktura tego jest taki, że dzieci są arbitralne . Oznacza to, że znaczniki mogą być
<RadioGroup>
<Button title="A" />
<Button title="B" />
</RadioGroup>
lub
<RadioGroup>
<OtherThing title="A" />
<OtherThing title="B" />
</RadioGroup>
Próbowałem kilku rzeczy.
Próba: W RadioGroup„s onChange obsługi:
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 });
});
Problem:
Invalid access to component property "setState" on exports at the top
level. See react-warning-descriptors . Use a static method
instead: <exports />.type.setState(...)
Próba: W RadioGroup„s onChange obsługi:
React.Children.forEach( this.props.children, function( child ) {
child.props.selected = child.props.value === e.target.value;
});
Problem: Nic się nie dzieje, nawet ja daję Buttonklasie componentWillReceivePropsmetodę
Próba: próbowałem przekazać dzieciom określony stan rodzica, więc mogę po prostu zaktualizować stan rodzica i sprawić, by dzieci zareagowały automatycznie. W funkcji renderowania RadioGroup:
React.Children.forEach( this.props.children, function( item ) {
this.transferPropsTo( item );
}, this);
Problem:
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.
Złe rozwiązanie nr 1 : użyj metody reag-addons.js cloneWithProps , aby sklonować elementy podrzędne w czasie renderowania, RadioGroupaby móc przekazać im właściwości
Złe rozwiązanie nr 2 : Zaimplementuj abstrakcję wokół HTML / JSX, aby móc dynamicznie przekazywać właściwości (zabij mnie):
<RadioGroup items=[
{ type: Button, title: 'A' },
{ type: Button, title: 'B' }
]; />
A następnie RadioGroupdynamicznie buduj te przyciski.
To pytanie nie pomaga, ponieważ muszę wydać moje dzieci, nie wiedząc, czym one są
RadioGroupmoże wiedzieć, że musi zareagować na zdarzenie swoich arbitralnych dzieci? Musi koniecznie wiedzieć coś o swoich dzieciach.