2017-01-23 5 views
1

fb docsによると、this.props.childrenは不透明なデータ構造であり、直接操作しないでください。実際に反応 - this.props.childrenを変更して、子コンポーネントを動的に(プログラムで)追加することができます

、ドキュメントは、我々はライブラリ関数を見てみるとReact.Children

でライブラリ関数を使用する必要があることを言って、彼らは我々がthis.props.children

を変異されるべきではないと信じるように私をリードすべてのゲッター、ありますこれは本当ですか? this.props.children(コンポーネントを動的に挿入するなど)を変更できますか?

ありがとうございます!

答えて

1

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> 
     ); 
    } 
} 
+0

ありがとうございます!非常に役立ちます。しかし、これは動的にコンポーネントを内部に追加するコンポーネントを作成することができないということにはならない。あなたの答えごとに新しいコンポーネントを追加するだけで、コンポーネントそのものを複製することは一つの方法のようですが、それは最適な(つまり効率的な)やり方ではないようです。ただし、ユーザーが1秒に1回以上コンポーネントを追加または削除しないようなUI(意図)があれば、それは受け入れられないはずです。 – dev

+0

更新された回答を参照してください。 – noahnu

+0

はい、ありがとうございます。実際には、fbのthis.prop.childrenを使用するのではなく、むしろkludgeのようなデータ配列を使用する必要がありました。 – dev

関連する問題