Реакция функции onClick срабатывает при рендере

114

Я передаю 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>
        );
    }
});

Мой вопрос: почему моя функция onClick запускает рендер и как сделать это не.

Теги:

5 ответов

312
Лучший ответ

Поскольку вы вызываете эту функцию вместо передачи функции onClick, измените эту строку на это:

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

=> называется функцией Arrow, которая была введена в ES6, и будет поддерживаться в React 0.13.3 или upper.

  • 0
    @Стралос, можешь показать мне свой код?
  • 1
    как это сделать в coffescript?
Показать ещё 5 комментариев
25

Вместо вызова функции привяжите значение к функции:

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

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

  • 1
    ИМХО и многие другие. Вы должны отдавать предпочтение функциям без сохранения состояния, а не обязательным или обязательным, поскольку они могут привести к нежелательным побочным эффектам. Поэтому, даже при том, что оба ответа верны, я считаю, что один является более подходящим, чем другой.
  • 1
    Прямое связывание в render или в другом месте компонента не рекомендуется. Привязка должна происходить всегда в конструкторе
11

Значение для вашего атрибута onClick должно быть функцией, а не вызовом функции.

<button type="submit" onClick={function(){removeTaskFunction(todo)}}>Submit</button>
  • 5
    Не используйте анонимные функции при вызовах событий внутри рендера - это вызовет другой рендер
0

Для тех, кто не использует функции стрелок, но что-то попроще... Я сталкивался с этим при добавлении скобок после моей функции signOut...

замените этот <a onClick={props.signOut()}>Log Out</a>

с этим <a onClick={props.signOut}>Log Out</a>

...!

0

Для предотвращения вызова функции только при нажатии кнопки

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

Нет необходимости в дополнительных фигурных скобках

Ещё вопросы

Сообщество Overcoder
Наверх
Меню