React onClick函数在渲染时触发

Str*_*los 175 javascript reactjs

我将2个值传递给子组件:

  1. 要显示的对象列表
  2. 删除功能.

我使用.map()函数来显示我的对象列表(如反应教程页面中给出的示例),但该组件中的按钮在渲染时触发onClick函数(在渲染时不应触发).我的代码看起来像这样:

module.exports = React.createClass({
    render: function(){
        var taskNodes = this.props.todoTasks.map(function(todo){
            return (
                <div>
                    {todo.task}
                    <button type="submit" onClick={this.props.removeTaskFunction(todo)}>Submit</button>
                </div>
            );
        }, this);
        return (
            <div className="todo-task-list">
                {taskNodes}
            </div>
        );
    }
});
Run Code Online (Sandbox Code Playgroud)

我的问题是:为什么我的onClick函数会在渲染上触发,以及如何使它不成功.

Lon*_*yen 437

因为您正在调用该函数而不是将函数传递给onClick,所以将该行更改为:

<button type="submit" onClick={() => { this.props.removeTaskFunction(todo) }}>Submit</button>
Run Code Online (Sandbox Code Playgroud)

=> 名为Arrow Function,在ES6中引入,将在React 0.13.3或更高版本上得到支持.

  • 你也可以避免这些箭头功能花括号.我认为这与最佳实践相符:`onClick = {()=> this.props.removeTaskFn(todo)}` (9认同)
  • 您能再解释一下吗?我知道人们一直说这不是最佳实践,但我想了解 () =&gt; 这里到底发生了什么,我了解箭头函数是什么,但不知道这是什么 () 以及为什么这不好? (2认同)

Seb*_*ian 32

问题在于你如何传递你的函数

目前您没有传递该函数而是调用它:

<Button onClick={yourFunction()} />
Run Code Online (Sandbox Code Playgroud)

您可以通过两种方式修复此问题:

<Button onClick={() => yourFunction(params)} />
Run Code Online (Sandbox Code Playgroud)

或者如果你没有任何参数:

<Button onClick={yourFunction} />
Run Code Online (Sandbox Code Playgroud)


Pet*_*TNT 29

而不是调用函数,将值绑定到函数:

this.props.removeTaskFunction.bind(this, todo)
Run Code Online (Sandbox Code Playgroud)

MDN ref:https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_objects/Function/bind

  • 恕我直言和许多其他。您应该优先使用无状态功能,而不要使用固定或绑定功能,因为这些功能可能会导致您出现不良后果。因此,即使两个答案都正确,我相信一个比另一个更合适。 (2认同)

小智 15

您需要将箭头函数与 onClick 一起使用,以防止立即调用。所以如果你的按钮看起来像这样:

<button onClick={yourfunctionname()} />
Run Code Online (Sandbox Code Playgroud)

它一定是这样的:

<button onClick={() => yourfunctionname(params)} />
Run Code Online (Sandbox Code Playgroud)


Bri*_*her 14

onClick属性的值应该是函数,而不是函数调用.

<button type="submit" onClick={function(){removeTaskFunction(todo)}}>Submit</button>
Run Code Online (Sandbox Code Playgroud)

  • 不要在渲染内的事件调用上使用匿名函数 - 它将触发另一个渲染 (6认同)

小智 7

JSX 与 ReactJS 一起使用,因为它与 HTML 非常相似,它让程序员有使用 HTML 的感觉,但它最终会转换为 javascript 文件。

编写一个 for 循环并将函数指定为 {this.props.removeTaskFunction(todo)} 将在触发循环时执行这些函数。

为了阻止这种行为,我们需要将该函数返回给 onClick。

胖箭头函数有一个隐藏的return语句和bind 属性。因此它将函数返回给 OnClick,因为 Javascript 也可以返回函数!!!!!!

用 -

onClick={() => { this.props.removeTaskFunction(todo) }}
Run Code Online (Sandbox Code Playgroud)

意思是-

var onClick = function() {
  return this.props.removeTaskFunction(todo);
}.bind(this);
Run Code Online (Sandbox Code Playgroud)


oli*_*man 5

对于那些不使用箭头函数但更简单的东西......我在我的 signOut 函数后添加括号时遇到了这个......

替换这个 <a onClick={props.signOut()}>Log Out</a>

有了这个<a onClick={props.signOut}>Log Out</a>……!