【问题标题】:How do I access specific items within an array that I've mapped into table rows? - React如何访问已映射到表行的数组中的特定项目? - 反应
【发布时间】:2019-03-28 23:53:41
【问题描述】:

我正在使用 React.js 在我们的网站上创建一个名称列表。人员信息作为对象存储在数组中。我已经成功地使用 .map 在表格行中创建列表,现在我希望能够将鼠标悬停在每个给定名称(或真的)上,以创建一个包含来自同一对象的更多信息的弹出窗口。 我的问题在于再次访问正确的对象。我不确定如何在 handleMouseEnter 函数中正确引用它。

这里有一些代码:

class PersonList extends React.Component {
  constructor(props) {
    super(props);
    this.handleMouseEnter = this.handleMouseEnter.bind(this);
    this.handleMouseLeave = this.handleMouseLeave.bind(this);
  }

  handleMouseEnter() {
    alert(patients[???].phone});
  }
  handleMouseLeave() {

  }

  render() {

    let list = patients.map((patients, p) =>
     <tr  onMouseEnter={this.handleMouseEnter}
          onMouseLeave={this.handleMouseLeave}
          key={'patient_' + p}>{patients.name}</tr>)

    return(
      <div className="list">
        <table>
          {list}
        </table>
      </div>
    );
  }
}

警报功能只是一个占位符。我猜我的问题实际上在于当我用 .map 创建表时声明了一些不同的东西,但我不确定。

【问题讨论】:

  • 只是一个元提示:如果您为自己的问题提供解决方案。不要编辑您的问题,而是对您自己的问题做出专门的回答并接受它。 (是的,Stackoverflow 就是这么奇怪)

标签: arrays reactjs


【解决方案1】:

试试:

let list = patients.map((patient, p) =>
   <tr  onMouseEnter={()=>{this.handleMouseEnter(patient)}}

和:

handleMouseEnter(patient) {
    alert(patient.phone);
  }

仅供参考:这并不是最高效的做事方式,但应该可以帮助您入门。通常不鼓励在渲染中使用绑定和箭头函数。

【讨论】:

  • 感谢您的提示 - 我对 React 还很陌生,所以我很想知道创建表和/或引用的替代(尤其是更有效)方法是什么数组中的对象。
  • 知道了。在那篇文章中,作者只是将函数放在渲染函数之外,作为组件类的单独方法。我想我可以做类似的事情。在得知 cmets 仅支持内联代码块之前,我尝试在这里打出 15 次粗略的草稿。无论如何,我所做的是创建组件类(createList)的方法来创建列表而不是渲染函数中的变量,然后调用 {this.createList} 而不是列表。这是一个可行的解决方法吗?
  • 否,因为在每个渲染过程中也会调用它并重新创建箭头函数。需要明确的是,这不一定是坏事,它可能只是意味着长列表的性能下降。作者所做的是为&lt;tr&gt; 元素创建一个新组件,并在单击它时将其从父级(&lt;tr&gt;)执行的回调传递给它。所以渲染函数中没有动态箭头绑定。唉,现在树有更多的组件开销和深度。
  • 感谢您帮助我理解 - 似乎不是箭头函数是一个有问题的方法,因为他使用了一个叫做 renderUser 的方法。问题是箭头函数 within 当用户触发事件时调用该方法:在他的情况下单击,在我的情况下悬停。因此,通过创建一个新组件,在新组件中构建事件侦听器(作为方法本身可以是箭头函数,但不包含箭头函数),引用该新组件并从原始组件传递它的道具,我避免了重新渲染问题?
猜你喜欢
  • 2021-12-25
  • 2016-07-05
  • 2021-01-01
  • 1970-01-01
  • 2012-05-28
  • 1970-01-01
  • 2015-06-02
  • 2017-05-20
相关资源
最近更新 更多