children
を直接変更することはできません。ただし、マッピングを介してその出力を「変更」することができます:
const Hydrogen = props => (<div>{props.weight}</div>);
const Oxygen = props => (<div>{props.weight}</div>);
const Water = props => (
<div className='water'>
{React.Children.map(props.children, child => (
React.cloneElement(child, {
weight: props.weight/React.Children.count(props.children)
})
))}
</div>
);
const WaterBalloon = props => (
<div className='water-balloon'>
<Water weight={3}>
<Hydrogen />
<Hydrogen />
<Oxygen />
</Water>
</div>
);
ここでは、Waterに渡された子を「変更」してweightプロパティを渡します。
あなたは「追加/削除」する機能が必要な場合は、おそらくあなたは、「データ」の配列を維持し、そのデータからコンポーネントを取り込むように再設計を検討する必要があります。
https://jsfiddle.net/814jze3z/
const Item = props => (
<li>{props.time}</li>
);
class List extends React.Component
{
constructor() {
super();
this.state = {
items: []
};
this.addItem = this.addItem.bind(this);
this.removeItem = this.removeItem.bind(this);
}
addItem() {
let item = {
id: this.state.items.length + 1,
time: +new Date()
};
this.setState({
items: this.state.items.concat([item])
});
}
removeItem() {
this.setState({
items: this.state.items.concat().splice(1)
});
}
render() {
return (
<div>
<button onClick={this.addItem}>Add Item</button>
<button onClick={this.removeItem}>Remove Item</button>
<ul className='list'>
{this.state.items.map(item => (
<Item key={item.id} time={item.time} />
))}
</ul>
</div>
);
}
}
ありがとうございます!非常に役立ちます。しかし、これは動的にコンポーネントを内部に追加するコンポーネントを作成することができないということにはならない。あなたの答えごとに新しいコンポーネントを追加するだけで、コンポーネントそのものを複製することは一つの方法のようですが、それは最適な(つまり効率的な)やり方ではないようです。ただし、ユーザーが1秒に1回以上コンポーネントを追加または削除しないようなUI(意図)があれば、それは受け入れられないはずです。 – dev
更新された回答を参照してください。 – noahnu
はい、ありがとうございます。実際には、fbのthis.prop.childrenを使用するのではなく、むしろkludgeのようなデータ配列を使用する必要がありました。 – dev