2016-05-12 57 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