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

要显示的对象列表 删除功能。

我使用.map()函数来显示我的对象列表(就像在react教程页面中给出的例子一样),但该组件中的按钮在呈现时触发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>
        );
    }
});

我的问题是:为什么onClick函数在渲染和如何使它不火?


当前回答

JSX将计算花括号中的JavaScript表达式

在这种情况下,this.props. removetaskfunction (todo)被调用,返回值被分配给onClick

你必须为onClick提供一个函数。为此,可以将值包装在匿名函数中。

export const samepleComponent = ({todoTasks, removeTaskFunction}) => {
    const taskNodes = todoTasks.map(todo => (
                <div>
                    {todo.task}
                    <button type="submit" onClick={() => removeTaskFunction(todo)}>Submit</button>
                </div>
            );
    return (
        <div className="todo-task-list">
            {taskNodes}
        </div>
        );
    }
});

其他回答

与其调用函数,不如将值绑定到函数:

this.props.removeTaskFunction.bind(this, todo)

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

onClick属性的值应该是一个函数,而不是函数调用。

<button type="submit" onClick={function(){removeTaskFunction(todo)}}>Submit</button>

有可能实现这一点,甚至比以下方式更具可读性:

<button onClick={() => somethingHere(param)}/>

const Comp = () => {
  const [triggered, setTriggered] = useState(false);

  const handleClick = (valueToSet) => () => {
    setTriggered(valueToSet);
  };

  return (
    <div>
      <button onClick={handleClick(true)}>Trigger</button>
      <div>{String(triggered)}</div>
    </div>
  );
};

与<button onClick={settrigger (true)}/>相比,它不会触发状态setter,也不会导致太多的重渲染 如果你没有任何参数要传递给函数,这是可以的。

问题在于如何传递函数

此时你不是传递函数,而是调用它:

<Button onClick={yourFunction()} />

你可以用两种方法解决这个问题:

<Button onClick={() => yourFunction(params)} />

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

<Button onClick={yourFunction} />

有点晚了,但这是一个简单的答案。

由于JS DOM渲染,直接接近会自行触发

onClick={this.props.removeTaskFunction(todo)}

匿名箭头函数方法。它将在点击时触发

onClick={()=>this.props.removeTaskFunction(todo)}