2016-05-12 42 views
1

我正在使用React.js進行練習,並且無法遍歷數據數組,並根據每個數據節點中的屬性選擇性地呈現元素。如何使用React JS中的循環來渲染或不渲染基於條件的表數據?

該數據集的格式是這樣的:

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

我的渲​​染代碼正在尋找一個標誌值,以確定哪些應該或不應該渲染。邏輯工作正常(即當它應該返回true或false時,la console.log),但用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

裏面。對於多行條件語句,最好使用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

我覺得這個答案引人注目,但我對React完全陌生,不確定如何將其合併到我的代碼中。你能看看我的小提琴,並給我多一點解釋,在哪裏放什麼,爲什麼?不勝感激! – kurofune

+0

絕對,給我幾分鐘。 – sheeldotme

+0

我已經分叉你的小提琴,看看我的變化在這裏:https://jsfiddle.net/xnsb9g3p/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