当前位置:  开发笔记 > 编程语言 > 正文

使用ES6语法通过onclick事件反应传递参数

如何解决《使用ES6语法通过onclick事件反应传递参数》经验,为你挑选了5个好方法。

如何使用ES6语法将额外参数传递给onClick事件?

例如:

handleRemove = (e) => {

}

render() {
     
}

我想将id传递给handleRemove函数,如下所示:


Michelle Til.. 160

请记住onClick={ ... },这...是一个JavaScript表达式.所以

... onClick={this.handleRemove(id)}

是相同的

var val = this.handleRemove(id);
... onClick={val}

换句话说,您this.handleRemove(id)立即调用,并将该值传递给onClick,这不是您想要的.

相反,您希望使用已预先填充的参数之一创建函数; 基本上,你想要以下内容:

var newFn = function() {
  var args = Array.prototype.slice.call(arguments);

  // args[0] contains the event object
  this.handleRemove.apply(this, [id].concat(args));
}
... onClick={newFn}

有一种方法可以在ES5 JavaScript中表达这一点:Function.prototype.bind.

... onClick={this.handleRemove.bind(this, id)}

如果您使用React.createClass,React会自动this为您绑定实例方法,除非您将其更改为,否则它可能会抱怨this.handleRemove.bind(null, id).

您也可以简单地定义内联函数; 如果您的环境或转换器支持它,则使箭头功能缩短:

... onClick={() => this.handleRemove(id)}

如果您需要访问该活动,您可以直接传递:

... onClick={(evt) => this.handleRemove(id, evt)}

值得一提的是,箭头函数每次都会导致重新渲染,因为每个渲染都会创建新函数 (38认同)

需要注意的是,在render方法中添加箭头函数将在每个新渲染上创建一个新函数.但它会起作用.最好在构造函数中创建新的绑定函数,并将新函数添加到render方法中. (2认同)


Praym.. 40

使用button元素的value属性传递id,如


然后在handleRemove中,从事件中读取值:

handleRemove(event) {
...
 remove(event.target.value);
...
}

这样,每次重新渲染此组件时,都可以避免创建新函数(与使用箭头函数相比).



1> Michelle Til..:

请记住onClick={ ... },这...是一个JavaScript表达式.所以

... onClick={this.handleRemove(id)}

是相同的

var val = this.handleRemove(id);
... onClick={val}

换句话说,您this.handleRemove(id)立即调用,并将该值传递给onClick,这不是您想要的.

相反,您希望使用已预先填充的参数之一创建函数; 基本上,你想要以下内容:

var newFn = function() {
  var args = Array.prototype.slice.call(arguments);

  // args[0] contains the event object
  this.handleRemove.apply(this, [id].concat(args));
}
... onClick={newFn}

有一种方法可以在ES5 JavaScript中表达这一点:Function.prototype.bind.

... onClick={this.handleRemove.bind(this, id)}

如果您使用React.createClass,React会自动this为您绑定实例方法,除非您将其更改为,否则它可能会抱怨this.handleRemove.bind(null, id).

您也可以简单地定义内联函数; 如果您的环境或转换器支持它,则使箭头功能缩短:

... onClick={() => this.handleRemove(id)}

如果您需要访问该活动,您可以直接传递:

... onClick={(evt) => this.handleRemove(id, evt)}


值得一提的是,箭头函数每次都会导致重新渲染,因为每个渲染都会创建新函数
需要注意的是,在render方法中添加箭头函数将在每个新渲染上创建一个新函数.但它会起作用.最好在构造函数中创建新的绑定函数,并将新函数添加到render方法中.

2> Praym..:

使用button元素的value属性传递id,如


然后在handleRemove中,从事件中读取值:

handleRemove(event) {
...
 remove(event.target.value);
...
}

这样,每次重新渲染此组件时,都可以避免创建新函数(与使用箭头函数相比).


好,易于.有一个问题,当按钮有一个图标/字形,但值未定义.只需使用`event.currentTarget.value`而不是`event.target.value`,一切都很好.

3> 小智..:

使用箭头功能如下:



这会在每个渲染上创建一个新功能,这对于性能不是很好.ESLint默认标记它:https://github.com/yannickcr/eslint-plugin-react/blob/master/docs/rules/jsx-no-bind.md
Linting错误:`JSX函数不应该使用箭头函数react/jsx-no-bind`

4> NK Chaudhary..:
onClick={this.handleRemove.bind(this, id)}


这被认为效率低下请阅读https://github.com/yannickcr/eslint-plugin-react/blob/master/docs/rules/jsx-no-bind.md
这与接受的答案基本相同.由于它在每个渲染上创建一个新函数,因此效率不高.您应该在构造函数中绑定函数,而不是在render方法中.因此,工作但性能可能会很高.

5> Angel Joseph..:

到目前为止,没有人提到的是使handleRemove返回一个函数.

你可以这样做:

handleRemove = id => event => {
  // Do stuff with id and event
}

// render...
  return 

但是,所有这些解决方案都有在每个渲染上创建新功能的缺点.最好为Button创建一个新组件,它将分别传递给idhandleRemove.

推荐阅读
地之南_816
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有