【问题标题】:How do you render or not render table data based on conditions, using a loop in React JS?如何使用 React JS 中的循环根据条件渲染或不渲染表格数据?
【发布时间】:2016-09-08 23:09:52
【问题描述】:

我正在使用 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 以获得指导,但它似乎不起作用。

任何帮助将不胜感激!

【问题讨论】:

  • 请务必返回您正在生成的 jsx。现在它实际上并没有返回你的语句的结果,只是评估它并继续前进。
  • 感谢您的推荐。但是,这在语法上看起来如何?我会在条件句周围或内部使用return () 语法吗?
  • 在里面。而对于多行条件语句,绝对最好使用 if...else 语法而不是三元运算符。
  • if (...) { return (stuff>);} else { return (what else)}
  • 好的!我的循环运行良好,但现在当我重新渲染时,它并没有从 DOM 中删除不需要的元素。我是否需要使用 set-state 而不是调用 render()?还是应该在 else 中明确隐藏那些不满足条件的元素?

标签: javascript reactjs react-jsx tabular


【解决方案1】:

正如我在评论中提到的,您需要返回计算值,这样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>

【讨论】:

  • 这就是我现在所拥有的,它在第一次通过时效果很好,但是当过滤器标志发生变化并且再次调用渲染函数时,DOM 不会更新以删除预先存在的不需要的元素基于标志的新值。我需要做些什么才能做到这一点?
  • 更新为在 map 之前使用 filter 方法来正确过滤结果
【解决方案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'));

我将它重写如下,我们有一个预先构建的过滤器方法,我们不妨使用它而不是重新实现轮子,它使我们的代码更简洁。

【讨论】:

  • 我觉得这个答案很有说服力,但我对 React 完全陌生,不知道如何将它合并到我的代码中。你能看看我的小提琴,给我更多的解释,说明在哪里放什么以及为什么?非常感谢!
  • 当然,给我几分钟。
  • 我已经分叉了你的小提琴,在这里看看我的变化:jsfiddle.net/xnsb9g3p/1。我做了一些更改,其中一项重要的更改是将过滤器移入状态并删除您对渲染的调用,一旦您更改状态,就会自动为您调用渲染。如果您对所做的更改有任何疑问,请告诉我。
  • 谢谢。我必须仔细阅读它才能准确了解发生了什么,尤其是箭头语法和绑定方法,但这正是我要寻找的。​​span>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多