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

如何向onClick事件处理程序传递一个带参数的函数,并且仍然将该函数绑定到组件的“this”上下文?

尉迟彬
2023-03-14

我有一个基于类的React组件,称为“AllProducts.jsx”,我这样定义了“class AllProducts扩展组件”,所以当我将函数传递给onClick事件处理程序时,我需要绑定“this”的上下文,但是当我尝试将这些函数之一传递给一个参数时,我在控制台中得到一个错误,说“无法读取未定义的属性绑定”。

这是代码抛出错误时的样子,请查看i标记的onClick处理程序:

renderProductInfo() {

    return this.props.allProducts.map((product) => {
        return [
            <li id="shownName">{product.name}</li>,
            <li id="shownSKU">{product._id}</li>,
            <li id="shownCategory">{product.category}</li>,
            <li id="shownPrice">${product.price}</li>,
            <li id="shownQuantity">{product.quantity}</li>,
            <i onClick={this.handleEditProduct(product._id).bind(this)} 
               id="shownEdit" className="fi-pencil"></i>,
            <br />
        ];
    });

}

我通过在onClick处理程序中定义函数来解决这个问题,如下所示:

<i onClick={() => {
                    this.props.fetchSingleProduct(product._id).then(() => {
                        var opposite = !this.state.editProduct;

                        this.setState({
                            editProduct: opposite
                        });
                    });
                }} 
                   id="shownEdit" className="fi-pencil"></i>

有没有办法让我直接传入参数并避免错误?

共有2个答案

郑承恩
2023-03-14

这是在调用函数,这会导致错误:

onClick={this.handleEditProduct(product._id).bind(this)}

这是将函数与参数绑定,这就是您想要的:

onClick={this.handleEditProduct.bind(this, product._id)}

请注意,handleEditProducts的函数签名应该是(productId, event)

薛华奥
2023-03-14

以下是通常使用箭头函数传递参数的方式:

<i onClick={() => this.handleEditProduct(product._id)} id="shownEdit" className="fi-pencil"></i>

此外,这也是使用< code >的方式。绑定:

<i onClick={this.handleEditProduct.bind(this, product._id)} id="shownEdit" className="fi-pencil"></i>

你需要打电话给<代码>。bind在函数上,而不是函数调用的返回值上。所以任何参数都会跟在上下文后面(第一个参数)。

 类似资料:
  • 我在ListItem中设置了一个事件。然后在调用的方法上调用来传递单击的列表项的id和name值。 下面的问题建议使用bind,但似乎将onCLick事件添加到ListItem会破坏列表绑定。 在添加单击事件之前,与的列表范围绑定按预期工作,并填充列表。 此外,如果我尝试没有参数,则单击事件不起作用。 问题: 如何在JSX中的onClick事件绑定中传递参数? 列表定义: 从单击事件调用的方法:

  • 我有一个HTML标记,其中当前是 但是,我希望遵循es lint规则(我希望避免内联函数),并且我在处理这个onChange函数的参数时遇到了问题。 在我的构造函数中,我有: 我看过这篇文章,但目前还没有运气。我需要做什么才能将值和事件都传递给绑定函数?

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

  • 所以我试图用ES6语法使反应工作。在ES5中,我没有使用函数绑定语法的构造函数。我有一个任意的价格列表,当输入元素改变时,我希望状态改变。但是正确的价格必须改变。 我甚至不确定这是正确的方法。有人能告诉我最近应该怎么做吗? 这是我的代码: 这就是错误...

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

  • 将函数传递给另一个函数的Scala示例缺少传递的函数(时间段)接受参数(x)的情况。 我怎样才能使上述代码工作? 编辑:我在oncepersecond中添加了一个x,以明确目标是传递整数。