私はReactが初めてです。ユーザーがドロップダウンメニューを使用して、現在使用する色を選択できる、非常に単純な9グリッドボックスを作成して練習しています。唯一のものは、変数を含むクラス(ColorPicker)からグリッドを含むクラス(Box)に変数を渡す方法がわかりません。誰も私にこれを行う方法に関するいくつかの指針を与えることができますか?
私はまだ小道具を他のクラスに渡すことに慣れています。
CodePenへのリンクは次のとおりです。 http://codepen.io/anfperez/pen/RorKge
これが私のコードです
//this displays the color selections for the boxes: red, green, and blue
var ColorPicker = React.createClass({
handleChange: function(e) {
var newColor = e.target.value;
this.props.onChange(color);
},
render: function() {
return (
<div>
<select id="pick-colors" onChange={this.handleChange}>
<option value="red">
Red
</option>
<option value="green">
Green
</option>
<option value="blue">
Blue
</option>
</select>
</div>
)
}
});
//contains the boxes that will eventually change color
var Box = React.createClass({
getInitialState: function() {
return {
//boxes are initially white
color: 'white'
};
},
changeColor: function(newColor) {
var newColor = this.state.color;
this.setState({
color: newColor
});
},
render: function() {
return (
<div >
<div className='box' style={{background:this.state.color}} onClick={this.changeColor}>
</div>
</div>
);
}
});
React親から子に渡される小道具。たとえば、子クラスをレンダリングする親クラスがある場合、親クラスは小道具を子クラスに渡すことができます。例。
class Parent extends React.Component {
render() {
return (
<Child example="foo" />
)
}
}
class Child extends React.component {
render() {
return (
<h1>{this.props.example}</h1>
)
}
}
親クラスは子クラスをレンダリングします。親クラスは、exampleという子に小道具を渡します。子では、this.props.example
を呼び出すことにより、子の値にアクセスできます。
DOMに10回レンダリングする代わりに、他の各コンポーネントをラップする1つのメインコンポーネントをレンダリングする必要があります。他のコンポーネント内でコンポーネントを再利用し、小道具を渡すことができます。
このようなことができます
var ColorPicker = React.createClass({
getInitialState: function() {
return {color: 'white'}
},
handleChange: function(e) {
var newColor = e.target.value;
this.setState({color: newColor})
},
render: function() {
return (
<div>
<select id="pick-colors" onChange={this.handleChange}>
<option value="red">Red</option>
<option value="green">Green</option>
<option value="blue">Blue</option>
</select>
<Box color={this.state.color} />
<Box color={this.state.color} />
<Box color={this.state.color} />
</div>
)
}
});
//contains the boxes that will eventually change color
var Box = React.createClass({
render: function() {
return (
<div >
<div className='box' style={{background:this.props.color}}>
</div>
</div>
);
}
});
ReactDOM.render(<ColorPicker />, document.getElementById('pick_color'));
ボックスを複数回レンダリングするか、上記の@gesuwallの提案を使用する代わりに。彼のやり方はもっと効果的な方法だと思います。
これら2つを含み、選択した色を状態として管理する別のコンポーネントを使用する必要があります。 ColorPicker
が新しい値を取得すると、コンテナの状態が更新され、Box
がこれを取得すると、コンテナの状態から色の値が取得されます。
ColorPicker
は、色の値が変更されたときに実行するコールバックをプロパティから取得する必要があります。
var ColorPicker = React.createClass({
render: function() {
return (
<div>
<select id="pick-colors" onChange={this.props.onChange}>
<option value="red">
Red
</option>
<option value="green">
Green
</option>
<option value="blue">
Blue
</option>
</select>
</div>
)
}
});
var App = React.createClass({
getInitialState: function() {
return {
selectedColor: '#FFFFFF'
}
},
onColorPicked: function(e) {
this.setState({selectedColor: e.target.value })
},
render: function() {
return (
<div>
<ColorPicker onChange={this.props.onColorPicked} />
<Box color={this.state.selectedColor} />
</div>
)
}
}
唯一のステートフルコンポーネントはApp
でなければなりません。その状態を小道具を介して他のコンポーネントに渡します。
これは、ColorPickerクラスとBoxクラスの両方をラップする親コンポーネントに状態を持ち上げる必要がある場合です。新しい親コンポーネントは、現在の色の状態を管理し、変更を処理します。 リフティング状態に関するreactJSドキュメント はあなたに役立ちます。
したがって、サンプルを実装する here 正しいコード
プロパティを親から子に渡す場合、componentDidUpdate()メソッドを使用してプロパティを収集し、使用する必要があります。それ以外の場合、プロパティはまだ初期化されていない可能性があり、子コンポーネントでnull値になります。上記のコードを変更して、componentDidUpdate()メソッドを含めました。
class Parent extends React.Component {
render() {
return (
<Child bandName="foo fighters" />
)
}
}
class Child extends React.Component {
//For props, you use componentDidUpdate
componentDidUpdate(prevProps){
//You must have an if check, or loop forever
if(this.props.bandName !== this.prevProps.bandName){}
//do something like make an API call
//perhaps set this on state for display
}
}
render() {
return (
<h1>{this.props.bandName}</h1>
)
}
}