Я передаю 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 запускает рендер и как сделать это не.
Поскольку вы вызываете эту функцию вместо передачи функции onClick, измените эту строку на это:
<button type="submit" onClick={() => { this.props.removeTaskFunction(todo) }}>Submit</button>
=>
называется функцией Arrow, которая была введена в ES6, и будет поддерживаться в React 0.13.3 или upper.
Вместо вызова функции привяжите значение к функции:
this.props.removeTaskFunction.bind(this, todo)
MDN ref: https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_objects/Function/bind
Значение для вашего атрибута onClick
должно быть функцией, а не вызовом функции.
<button type="submit" onClick={function(){removeTaskFunction(todo)}}>Submit</button>
Для тех, кто не использует функции стрелок, но что-то попроще... Я сталкивался с этим при добавлении скобок после моей функции signOut...
замените этот <a onClick={props.signOut()}>Log Out</a>
с этим <a onClick={props.signOut}>Log Out</a>
...!
Для предотвращения вызова функции только при нажатии кнопки
<button type="submit" onClick={() => this.props.removeTaskFunction(todo)}>Submit</button>
Нет необходимости в дополнительных фигурных скобках