我将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

如果你传递了onClick={onClickHandler()},那么onClickHandler()函数也将在呈现的时候执行,()指示一旦它被呈现就立即执行函数,这不是我们想要的,而是我们使用onClick={onClickHandler},这将只在指定的事件发生时执行onClickHandler。但如果我们想传递一个参数随函数,那么我们可以使用ES6箭头函数。 针对您的案例:

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

你没有将函数作为参数传递,而是直接调用它,这就是为什么它会在渲染时启动。

如何解决

有两种方法:

第一个

<Button onClick={() => { 
this.props.removeTaskFunction(todo);
}
}>click</Button>

OR

只需要绑定

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

我也有类似的问题,我的代码是:

function RadioInput(props) {
    return (
    <div className="form-check form-check-inline">
        <input className="form-check-input" type="radio" name="inlineRadioOptions" id={props.id} onClick={props.onClick} value={props.label}></input>
        <label className="form-check-label" htmlFor={props.id}>{props.label}</label>
    </div>
    );
  }
class ScheduleType extends React.Component
{
    renderRadioInput(id,label)
    {
        id = "inlineRadio"+id;
        return(
            <RadioInput
                id = {id}
                label = {label}
                onClick = {this.props.onClick}
            />
        );

    }

它应该在哪里

onClick = {() => this.props.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>
        );
    }
});