私は本質的にタブを反応させようとしていますが、いくつか問題があります。
こちらがファイルです page.jsx
<RadioGroup>
<Button title="A" />
<Button title="B" />
</RadioGroup>
ボタンAをクリックすると、RadioGroupコンポーネントはボタンBの選択を解除する必要があります。
「選択された」とは、状態またはプロパティのclassNameを意味します
ここにあり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>);
}
});
のソースは特にButton.jsx
問題ではありません。ネイティブのDOM onChange
イベントをトリガーする通常のHTMLラジオボタンがあります。
予想されるフローは次のとおりです。
- ボタン「A」をクリックします
- ボタン「A」は、RadioGroupにバブルアップするonChange、ネイティブDOMイベントをトリガーします
- RadioGroup onChangeリスナーが呼び出されます
- RadioGroupはボタンBの選択を解除する必要があります。これが私の質問です。
これが私が遭遇している主な問題です:sをに移動できません<Button>
RadioGroup
。これの構造は、子が任意であるようなものだからです。つまり、マークアップは
<RadioGroup>
<Button title="A" />
<Button title="B" />
</RadioGroup>
または
<RadioGroup>
<OtherThing title="A" />
<OtherThing title="B" />
</RadioGroup>
私はいくつかのことを試しました。
試み:でRadioGroup
のの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 });
});
問題:
Invalid access to component property "setState" on exports at the top
level. See react-warning-descriptors . Use a static method
instead: <exports />.type.setState(...)
試み:でRadioGroup
ののonChangeハンドラ:
React.Children.forEach( this.props.children, function( child ) {
child.props.selected = child.props.value === e.target.value;
});
問題:Button
クラスにcomponentWillReceiveProps
メソッドを与えても何も起こらない
試行:親の特定の状態を子に渡そうとしたため、親の状態を更新して、子に自動的に応答させることができます。RadioGroupのレンダリング機能で:
React.Children.forEach( this.props.children, function( item ) {
this.transferPropsTo( item );
}, this);
問題:
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.
悪い解決策#1:react-addons.js cloneWithPropsメソッドを使用して、レンダリング時に子を複製し、RadioGroup
プロパティを渡せるようにする
悪い解決策#2:プロパティを動的に渡すことができるように、HTML / JSXの抽象化を実装します(私を殺します):
<RadioGroup items=[
{ type: Button, title: 'A' },
{ type: Button, title: 'B' }
]; />
そして次に RadioGroup
これらのボタン動的に構築します。
私は子供たちが何であるかを知らずに子供をレンダリングする必要があるので、この質問は私を助けません
RadioGroup
場合、任意の子のイベントに反応する必要があることをどのようにして知ることができますか?それは必然的にその子供たちについて何かを知っている必要があります。