Esasen tepki olarak sekmeler yapmaya çalışıyorum, ancak bazı sorunlar var.
İşte dosya page.jsx
<RadioGroup>
<Button title="A" />
<Button title="B" />
</RadioGroup>
A düğmesine tıkladığınızda, RadioGroup bileşeninin B düğmesinin seçimini kaldırması gerekir .
"Seçildi" yalnızca bir durum veya özellikten bir sınıf adı anlamına gelir
İşte 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>);
}
});
Kaynağı Button.jsx
gerçekten önemli değil, yerel DOM onChange
olayını tetikleyen normal bir HTML radyo düğmesi var
Beklenen akış:
- "A" Düğmesine tıklayın
- "A" düğmesi, RadioGroup'a köpüren onChange, yerel DOM etkinliğini tetikler
- RadioGroup onChange dinleyicisi çağrılır
- RadioGroup'un B düğmesinin seçimini kaldırması gerekir . Benim sorum bu.
İşte karşılaşmak ediyorum asıl sorun: Ben hareket edemez <Button>
içine sRadioGroup
bu yapısı çocuklardır şekildedir, çünkü keyfi . Yani, işaretleme olabilir
<RadioGroup>
<Button title="A" />
<Button title="B" />
</RadioGroup>
veya
<RadioGroup>
<OtherThing title="A" />
<OtherThing title="B" />
</RadioGroup>
Birkaç şey denedim.
Deneme: In RadioGroup
onChange işleyicisi:
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 });
});
Sorun:
Invalid access to component property "setState" on exports at the top
level. See react-warning-descriptors . Use a static method
instead: <exports />.type.setState(...)
Deneme: In RadioGroup
onChange işleyicisi:
React.Children.forEach( this.props.children, function( child ) {
child.props.selected = child.props.value === e.target.value;
});
Sorun: Hiçbir şey olmuyor, Button
sınıfa bir componentWillReceiveProps
yöntem versem bile
Deneme: Ebeveynin belirli bir durumunu çocuklara aktarmaya çalıştım, böylece ebeveyn durumunu güncelleyebilir ve çocukların otomatik olarak yanıt vermesini sağlayabilirim. RadioGroup'un render fonksiyonunda:
React.Children.forEach( this.props.children, function( item ) {
this.transferPropsTo( item );
}, this);
Sorun:
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.
Kötü çözüm 1 : React-addons.js cloneWithProps yöntemini kullanarak çocukları oluşturma zamanında RadioGroup
onlara özellikleri aktarabilmek için klonlayın
Kötü çözüm 2 : HTML / JSX etrafında bir soyutlama uygulayın, böylece özellikleri dinamik olarak aktarabilirim (öldür beni):
<RadioGroup items=[
{ type: Button, title: 'A' },
{ type: Button, title: 'B' }
]; />
Ve sonra RadioGroup
bu düğmeleri dinamik olarak oluşturun.
Bu soru bana yardımcı olmuyor çünkü çocuklarımı ne olduklarını bilmeden render etmem gerekiyor.
RadioGroup
bir olaya tepki vermesi gerektiğini nasıl bilebilir? Çocukları hakkında mutlaka bir şeyler bilmek zorundadır.