当前位置: 首页 > 知识库问答 >
问题:

将单击处理程序与参数绑定的'React-ES6方式'

常海
2023-03-14

我读了一大堆关于()=

那么,处理这个问题最有效的“反应方式”是什么?

对于不需要传递参数的函数,构造函数中的绑定似乎工作得很好,如下所示:

constructor(props) {
    super(props)
    this.handleClick = this.handleClick.bind(this)
}

但是我们如何处理传递参数的绑定函数,而不将其绑定到prop中,如下所示:

<li onClick={this.handleClick.bind(this, item.id)} />{item.name}</li>

在构造函数中绑定this,然后在prop中绑定nullundefined是否会导致绑定函数只绑定一次?

请随意纠正我的任何误解。似乎这个问题的解决方案应该更加众所周知和普遍...也就是说,如果我不只是生活在岩石下!

编辑:

即使使用抽象,单击处理程序是否也会与每个单独的项目渲染绑定?

在本文中,他们给出这个示例是为了避免绑定click处理程序,但是因为React.createClass会自动绑定方法,所以我看不出这实际上是如何在每个项目呈现上绑定的?

var List = React.createClass({
  render() {
    let { handleClick } = this.props;
    // handleClick still expects an id, but we don't need to worry
    // about that here. Just pass the function itself and ListItem
    // will call it with the id.
    return (
      <ul>
        {this.props.items.map(item =>
          <ListItem key={item.id} item={item} onItemClick={handleClick} />
        )}
      </ul>
    );
  }
});

var ListItem = React.createClass({
  render() {
    // Don't need a bind here, since it's just calling
    // our own click handler
    return (
      <li onClick={this.handleClick}>
        {this.props.item.name}
      </li>
    );
  },

  handleClick() {
    // Our click handler knows the item's id, so it
    // can just pass it along.
    this.props.onItemClick(this.props.item.id);
  }
});

有人能解释一下吗?这看起来是不是避免了绑定每个ListItem渲染,但由于React.createClass中的自动绑定,它仍然可以绑定?

我用类列表扩展组件语法而不是createClass尝试了这个例子,并且这个.handleClick没有定义,因为handleClick方法没有绑定到类。

归根结底,这似乎只是清理了冗长的内容,并没有通过减少方法绑定来实际提高性能。。。


共有3个答案

仇迪
2023-03-14

这管用吗?(使用TypeScript)

<Input type="password" onChange={this.onPasswordInputChange('primary')} />;
<Input type="password" onChange={this.onPasswordInputChange('secondary')} />;


interface IOnPasswordInputChange {
  (value: string): void;
}

private onPasswordInputChange = (type: string): IOnPasswordInputChange => {
  return (value: string) => {
    this.setState({ [type]: value });
  };
}
公孙涵育
2023-03-14

如果传递一个参数,那么您必须在渲染函数中绑定,而不是在构造函数中绑定。这可以使用绑定或箭头函数来完成。

<li onClick={this.handleClick.bind(this, item.id)} />{item.name}</li>

<li onClick={() => this.handleClick(item.id)} />{item.name}</li>
方轩昂
2023-03-14

对于您的

这通常意味着您需要另一层抽象,即一个新的react组件,该组件返回相同的元素,但您可以将onClick作为prop以及item id作为prop传入。然后在该组件中调用this.props.onClick(this.props.id)或以任何方式格式化数据。

本文列出了绑定实例方法的每种方式之间的所有差异,以及每种方式对性能的影响https://medium.com/@housecor/react-binding-patterns-5-Approach-for-handling-this-92c651b5af56。

 类似资料:
  • 问题内容: 我有一个React组件,可以在其中遍历列表并创建行。每行中都有一个删除按钮。单击删除按钮后,我想将引用传递给该行中的元素。 因此,为了在点击处理程序中保留this值;我对map()和click-handler都使用bind。 这是将参数传递给React中的处理程序的正确方法还是有更好的方法? 问题答案: 我现在还很陌生,但我想我可以把它扔在这里以提供帮助。 我认为您需要更改此行, 至

  • 我有一个包含一些字段的,每个字段都绑定了一些事件(与此功能无关)。 我必须添加另一个到每个字段,以显示一个模态在第一次点击他们中的任何一个,并且只在第一次点击。 我想的是这样的: 其思想是,在第一次单击之后,方法将从所有元素中删除“click handlers”。 如果不存在其他引用的“点击处理程序”,那就太好了,因为这样我就把它们全部删除了。 我需要从所有字段中只删除这个特定的“单击处理程序”,

  • 问题内容: 解释为什么这不是重复的:我的代码已经在工作,我已作为注释包含在内。问题是为什么将上下文包含在单击处理程序函数中时上下文会发生变化。 我正在React中尝试一个计算器项目。目的是将onclick处理程序附加到数字按钮,以便数字显示在计算器显示区域上。如果将处理程序直接编写为render方法,则它可以正常工作,但是,如果我尝试从ComponentDidMount尝试,则会收到错误消息。如何

  • 问题内容: 我是新来的反应者,所以我对此并不了解。我正在尝试向li添加点击处理程序,但该函数似乎未定义? 我想知道是否是因为我的范围设定错误? 问题答案: 设置为,因为在回调函数中是指全局范围(在浏览器中是,或者使用)

  • 问题内容: 当我运行多线程代码时,系统(linux)有时会将线程从一个处理器移动到另一个处理器。由于我拥有与处理器一样多的线程,因此它没有充分的理由使缓存无效,并且使我的跟踪活动混乱。 您知道如何将线程绑定到处理器,为什么系统会这样做? 问题答案: 使用(这是特定于Linux的)。 为什么调度程序会在不同处理器之间切换线程?好吧,假设您的线程最后一次在处理器1上运行,并且当前正在等待再次安排执行时

  • 问题内容: 所以我试图使反应与ES6语法一起工作。在ES5中,我有setInitialState,而没有使用函数绑定语法的构造函数。我有一个价格列表,该价格是任意的,并且我希望状态在输入元素发生更改时发生变化。但是正确的价格必须改变。 我什至不确定这是否是正确的方法。有人可以告诉我最近应做的事情吗? 这是我的代码: 这是错误… 问题答案: 您绑定的功能不正确 在构造函数中,您无需指定参数,只需要像