Búsqueda de sitios web

javascript - función onClick de React se ejecuta al renderizar


Paso 2 valores a un componente hijo:

  1. Lista de objetos para mostrar
  2. eliminar función.

Uso la función .map() para mostrar mi lista de objetos (como en el ejemplo dado en la página del tutorial de React), pero el botón en ese componente dispara la función onClick al renderizar (no debería dispararse al momento de renderizar). Mi código se ve así:

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>
        );
    }
});

Mi pregunta es: ¿por qué la función onClick se ejecuta al renderizar y cómo hacer para que no lo haga?

Respuesta #1

Porque estás llamando a esa función en lugar de pasar la función a onClick, cambia esa línea a esto:

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

=> llamado Función Flecha, que fue introducida en ES6, y será compatible en React 0.13.3 o superior.

Respuesta #2

En lugar de llamar a la función, vincula el valor a la función:

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

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

Respuesta #3

El problema radica en cómo pasas tu función

En este momento no estás pasando la función, sino llamándola:

<Button onClick={yourFunction()} />

Puedes solucionar esto de dos maneras:

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

O si no tienes ningún parámetro:

<Button onClick={yourFunction} />

Respuesta #4

El valor de tu atributo onClick debería ser una función, no una llamada a función.

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

Respuesta #5

necesitas usar una función flecha con onClick para evitar que se invoque inmediatamente. así que si tu botón se ve así:

<button onClick={yourfunctionname()} />

debe ser así:

<button onClick={() => yourfunctionname(params)} />

Artículos relacionados