获取 React 渲染中 map 返回的数组大小

Posted

技术标签:

【中文标题】获取 React 渲染中 map 返回的数组大小【英文标题】:Get size of array returned by map in React render 【发布时间】:2018-02-08 16:56:56 【问题描述】:

我在 React 组件的 render 方法中使用了 array.map。它有效,但我想知道它正在渲染多少行。我正在尝试在构造函数中初始化this.numRows = 0,然后在map 回调中递增它:

<div>
        <p>Number of rows = this.numRows</p>
        this.state.members.map((member) => 
          if (member.display) 
            this.numRows++;
            return <p> member.name </p>  
          
        )
      </div>

但这仍然显示为零。完整代码在这里:jsfiddle.net/ra13jxak/。如何显示返回的行数?

【问题讨论】:

您有不会在members 状态下呈现的成员吗? 在您的构造函数中,使用 this.state= numRows: 0 初始化一个状态,然后在 if 语句中的 map 中执行:this.setState(numRows: this.state.numRows+1) 然后渲染 &lt;p&gt;Number of rows = this.state.numRows&lt;/p&gt; 【参考方案1】:

我认为将其提取到组件中是个好主意:

JSFiddle Example

class App extends React.Component 
  constructor() 
    super()

    this.state = 
      members: [
        ..
      ],

      visibleMembers() 
        return this.members.filter(m => m.display)
      
    
  

  render() 
    const members =  this.state.visibleMembers()

    return (
      <div>
        <p>Number of rows = members.length</p>
        members.map(m => <p key= m.id > m.name </p>)
      </div>
    )
  

我添加了key 属性来抑制警告,您可以在React Documentation 上阅读更多信息。

【讨论】:

【参考方案2】:

您可以考虑先过滤要显示的成员,然后显示结果数组的长度,并对其进行映射以呈现成员:

Fiddle

render() 
    const membersToRender = this.state.members.filter(member => member.display)
    const numRows = membersToRender.length

    return (
      <div>
        <p>Number of rows = numRows</p>
        
          membersToRender.map((member, index) => 
            return <p key=index> member.name </p>
          )
        
      </div>
    );
  

编辑:感谢 Edgar Henriquez,我按照您的建议修复了关键属性警告

【讨论】:

【参考方案3】:

您可以使用过滤器生成一个新数组,然后使用它来显示行数并遍历它。像这样:

const members = this.state.members.filter(member => member.display)
return (
  <div>
    <p>Number of rows =  members.length </p>
    members.map(member => <p> member.name </p>)
  </div>
)

【讨论】:

【参考方案4】:

只需使用这个:

this.state.members.length

【讨论】:

【参考方案5】:

只需在 this.state.members 上使用过滤器在您的情况下是显示属性的特定条件

只需在元素周围包裹一个 div 并获取实际渲染的元素计数,或者您可以在应用具有特定条件的过滤器后使用长度方法。

像这样实现渲染:

render()
    return (
    <div>
       <p>Number of rows = this.numRows</p>
       <div id="members-with-display">
         (this.state.members.filter((value)=>return value.display)).map((member) => 
             return <p> member.name </p>  
         )
    </div>
    </div>
    );

你可以有一个函数来了解渲染的行,例如:

getRenderedRows()
//Either you can use this
return document.getElementById("members-with-display").childElementCount;
 // Or this
return this.state.members.filter((value)=>return value.display).length;

【讨论】:

以上是关于获取 React 渲染中 map 返回的数组大小的主要内容,如果未能解决你的问题,请参考以下文章

在 React 中动态渲染图像非常困难

如何防止 map() 在 react-native 中一次渲染整个数组

从 React Native 中的数组映射函数动态渲染内容

react基础篇四

React:如何防止在`map`中重新渲染子组件?

如何在 React 中渲染嵌套数组元素?