2016-05-12 4 views
1

私はReact.jsを使って練習をしていますが、データ配列の繰り返しや、各データノードのプロパティに基づいた要素の選択的なレンダリングに問題があります。React JSのループを使用して、条件に基づいて表データをレンダリングするかどうかをレンダリングしますか?

データセットは次のようにフォーマットされています

var requests = [ 
    {"id":1, "title":"request","updated":"2015-08-15","created":"2015-08-12","status":"Denied"}, ...] 

私のレンダリングコードは、それがまたはレンダリングしてはならないべきかを決定するためにフラグ値を探しています。ロジックはうまく動作しています(つまりconsole.logというときはtrueまたはfalseを返します)。ただし、JSXで記述されたレンダリングコードが問題になります。これは私がこれまでのtbodyセクションで持っているものです。

  <tbody>  
      {requests.map(function(row, i) { 
       {filter === requests[i].status || filter === "" ? 
       <tr key={i}> 
        <td style={tdStyle}>{row.title}</td> 
        <td style={tdStyle}>{row.status}</td> 
        <td style={tdStyle}>{row.created_at}</td> 
        <td style={tdStyle}>{row.updated_at}</td> 
        <td style={tdStyle}><a href="">delete</a></td> 
       </tr> 
       : null} 
      })} 
      </tbody> 

私は指導のためのthis link見てきましたが、それは動作していないようです。

ご協力いただければ幸いです!

+0

生成しているjsxを必ず返してください。今は実際にあなたのステートメントの結果を返すのではなく、評価して移動するだけです。 – shamsup

+0

ご推薦いただきありがとうございます。それはどのように構文的に見えるでしょうか?私は 'return()'構文を私の条件の周りまたは中で使用しますか? – kurofune

+0

内部。また、複数行の条件文の場合は、3項演算子ではなくif ... else構文を使用するのが最善です。 – shamsup

答えて

2
const requests = [ 
    {"id":1, "title":"Request from Nancy","updated_at":"2015-08-15 12:27:01 -0600","created_at":"2015-08-12 08:27:01 -0600","status":"Denied"}, 
    {"id":2, "title":"Request from David","updated_at":"2015-07-22 11:27:01 -0600","created_at":"2015-07-15 12:27:01 -0600","status":"Approved"} 
]; 

const jsx = function(filter) { 

    const isCorrectStatus = (x) => x.status === filter; 

    return <tbody>  
     {requests.filter(isCorrectStatus).map(function(row, i) { 
      return <tr key={i}> 
       <td>{row.title}</td> 
       <td>{row.status}</td> 
       <td>{row.created_at}</td> 
       <td>{row.updated_at}</td> 
       <td><a href="">delete</a></td> 
      </tr> 
     })} 
    </tbody> 
} 

const filter = 'Denied'; 
ReactDOM.render(jsx(filter), document.getElementById('app')); 

は、我々が構築済みのフィルタ方法を持って、我々としても、車輪を再実装するのではなく、それを使用することができ、それが我々のコード少しクリーナーを保持します。

+0

私はこの回答が魅力的だとわかりましたが、私は全く反応していないので、これを自分のコードに組み込む方法がわかりません。私のフィドルを見て、どこに何を、なぜ入れるのか、もう少し説明してください。大変感謝しています! – kurofune

+0

絶対に、私に数分を与えてください。 – sheeldotme

+0

私はあなたのフィドルを分かち合いました。ここで私の変更点を見てください:https://jsfiddle.net/xnsb9g3p/1/。私はいくつかの変更を加えました.1つの重要なものがフィルターを状態に移し、レンダリングの呼び出しを取り除くと、状態レンダリングを変更すると自動的に呼び出されます。あなたが行った変更についてさらに質問があれば教えてください。 – sheeldotme

0

私のコメントで述べたように、計算された値を返す必要があります。これにより、map()関数が正しく機能することができます。

また、この状況では、filter()関数を使用して、条件を満たす要素をマップするだけです。次のように私はそれを書き換えたい

<tbody> 
    // use the filter function to get only the matching elements before mapping 
    {requests.filter(function(row){ 
    // return true to include array element, false to exclude 
    return (filter === row.status || filter === ""); 
    }).map(function(row, i) { 
     // always wrap jsx in parentheses because of line breaks in javascript syntax 
     // make sure to return, this actually adds it 
     return (
     <tr key={i}> 
      <td style={tdStyle}>{row.title}</td> 
      <td style={tdStyle}>{row.status}</td> 
      <td style={tdStyle}>{row.created_at}</td> 
      <td style={tdStyle}>{row.updated_at}</td> 
      <td style={tdStyle}><a href="">delete</a></td> 
     </tr> 
    ); 
    })} 
</tbody> 
+0

これは私が今持っているもので、最初のパスではうまくいくが、フィルタフラグが変わり、 DOMは、フラグの新しい値に基づいて既存の不要な要素を削除するために更新していません。これを実現するためには何をする必要がありますか? – kurofune

+0

マップの前にフィルタメソッドを使用して結果を適切にフィルタリングするように更新しました – shamsup

関連する問題