2016-09-21 5 views
4

こんにちは:)私はwpの残りのAPIと反応してjsと私は正常にwp残りのAPIからデータを取得し、適切な方法でデータを反応させる。コンソールに「配列またはイテレータ内の各子に固有の」キー「prop」が必要ですというエラーメッセージが表示されます。私はこの問題に関する反応の文書を読んだが、理解しなかった。ここまでは私がこれまでに書いたものです。すべてのヘルプ素晴らしいことだどのように適切に反復するWp残りのAPIを介して検索されたポストオブジェクトの配列を介して反応するjs

 class Home extends React.Component{ 
     componentDidMount(){ 
     const API_URL = 'http://localhost/wordpress/wp-json/wp/v2/posts/'; 
     this.serverRequest = $.get(API_URL, function (result) { 
      this.setState({ 
      result:result, 
      loaded:true 
      }); 
     }.bind(this)); 
     } 
     constructor(props) { 
     super(props); 
     this.state ={result:null,loaded:false}; 
     autoBind(this); 
     } 
     render(){ 
     if (this.state.loaded) { 
      return(
      <div> 
       {this.state.result && <Portfolio data = {this.state.result}/>} 
      </div> 
     ) 
     } 
     return(
      <div>loading... 
      </div> 
     ) 

     } 
    } 
    export default Home; 

あなたに感謝し、データを支える先のポートフォリオのコンポーネントが渡され、適切な方法

class Portfolio extends React.Component{ 
    constructor(props) { 
    super(props); 
    autoBind(this); 
    } 
    render(){ 
    var contents=[]; 
    for (var i = 0; i < this.props.data.length; i++) { 
    if (this.props.data[i].categories[0] == 5) { 
     var productImage ={ 
     backgroundImage:'url('+ this.props.data[i].featured_image + ')', 
     backgroundSize: '100% 100%' 
     } 
     contents.push(
      <div id="portfolio-product-item" style ={productImage} > 
       <div id ="portfolio-product-item-details" > 
       <h3>{this.props.data[i].slug}</h3> 
       <div dangerouslySetInnerHTML={{__html: this.props.data[i].content.rendered}} /> 
       </div> 
      </div> 
    ); 
    } 
    } 
    return(
     <section className="portfolio"> 
      {contents} 
     </section> 
    ) 
    } 
} 
export default Portfolio; 

答えて

1

Portfolioコンポーネントをクリーナーにする。

私は、ロジックを分割し、メインレンダリングとは別のメソッドを作成することをお勧めします。

class Portfolio extends React.Component{ 
    constructor(props) { 
    super(props); 
    autoBind(this); 
    } 

    renderPortfolioOption(index, option) { 
    const { data } = this.props; 

    if (option.categories[0] == 5) { 
     var productImage ={ 
     backgroundImage:'url('+ option.featured_image + ')', 
     backgroundSize: '100% 100%' 
     } 

     return(
     <div key={index} id="portfolio-product-item" style ={productImage} > 
      <div id ="portfolio-product-item-details" > 
      <h3>{option.slug}</h3> 
      <div dangerouslySetInnerHTML={{__html: option.content.rendered}} /> 
      </div> 
     </div> 
    ); 
    } 
    } 

    render() { 
    const { data } = this.props; 

    if (data.length) return null; 

    return(
     <section className="portfolio"> 
     { data.map((index, option) => { return this.renderPortfolioOption(index, option); }) } 
     </section> 
    ) 
    } 
} 

export default Portfolio; 
+0

ありがとうございます:)これはたくさんのクリーナーコードです。私は反応の初心者ですが、ポートフォリオコンポーネントのレンダリング部分でif文がnullを返し、何も表示されず、ユニークな "キー"小道具のエラーですこれらの問題に対処できますか? –

+0

データがない場合、何を表示しますか? map関数でパラメータ "index"を追加することで "key"の問題を解決できます:) map関数の働きを見てくださいhttps://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map – JoseAPL

+0

私は答えを更新しました。 – JoseAPL

2

ではありません。このようなデータは私がすべてを渡ったしていないレンダリングあなたのコードは、ちょうどあなたが持っている "キー"エラーに関連しています。 問題はここにある -

contents.push(
     <div id="portfolio-product-item" style ={productImage} > 
      <div id ="portfolio-product-item-details" > 
      <h3>{this.props.data[i].slug}</h3> 
      <div dangerouslySetInnerHTML={{__html: this.props.data[i].content.rendered}} /> 
      </div> 
     </div> 
); 

portfolio-product-itemのidを持つ父親のdiv要素もそう属性key書き込むための適切な方法を持っている必要があり、それは - https://facebook.github.io/react/docs/multiple-components.html#dynamic-childrenため -

contents.push(
     <div key={i} id="portfolio-product-item" style ={productImage} > 
      <div id ="portfolio-product-item-details" > 
      <h3>{this.props.data[i].slug}</h3> 
      <div dangerouslySetInnerHTML={{__html: this.props.data[i].content.rendered}} /> 
      </div> 
     </div> 
); 

はを見てくださいさらに詳しい情報

+0

ありがとう:)私の問題を解決している、実際にそれを読むにはあまりにも多忙になるので、私は、コードでは省略した親のdivのより多くがあった、再びありがとう:)私は助けることができる –

+0

うれしいです! :) – alexunder

関連する問題