如何使用React JS中的循环基于条件呈现或不呈现表数据?

时间:2016-05-12 22:18:57

标签: javascript reactjs react-jsx tabular

我正在使用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的指导,但它似乎并没有起作用。

非常感谢任何帮助!

2 个答案:

答案 0 :(得分: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'));

我会按如下方式重写它,我们有一个预建的过滤方法,我们也可以使用它而不是重新实现方向盘,它可以使我们的代码更清洁。

答案 1 :(得分: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>