Je passe 2 valeurs à un composant enfant:
- Liste des objets à afficher
- supprimer la fonction.
J'utilise une fonction .map () pour afficher ma liste d'objets (comme dans l'exemple donné dans la page du didacticiel react), mais le bouton de ce composant déclenche la onClick
fonction, lors du rendu (il ne doit pas se déclencher au moment du rendu). Mon code ressemble à ceci:
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>
);
}
});
Ma question est: pourquoi la onClick
fonction se déclenche-t-elle sur le rendu et comment la désactiver?
javascript
reactjs
button
onclick
dom-events
Stralos
la source
la source
onClick={() => this.props.removeTaskFn(todo)}
Au lieu d'appeler la fonction, liez la valeur à la fonction:
Réf MDN: https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_objects/Function/bind
la source
La valeur de votre
onClick
attribut doit être une fonction, pas un appel de fonction.la source
Pour ceux qui n'utilisent pas les fonctions fléchées mais quelque chose de plus simple ... Je l'ai rencontré lors de l'ajout de parenthèses après ma fonction signOut ...
remplacer ceci
<a onClick={props.signOut()}>Log Out</a>
avec ça
<a onClick={props.signOut}>Log Out</a>
...! 😆la source
JSX est utilisé avec ReactJS car il est très similaire au HTML et il donne aux programmeurs l'impression d'utiliser le HTML alors qu'il transpile finalement dans un fichier javascript.
Utilisation -
ce qui signifie-
la source
JSX évaluera les expressions JavaScript entre accolades
Dans ce cas,
this.props.removeTaskFunction(todo)
est invoqué et la valeur de retour est affectée àonClick
Ce que vous devez prévoir,
onClick
c'est une fonction. Pour ce faire, vous pouvez encapsuler la valeur dans une fonction anonyme.la source
J'ai eu un problème similaire, mon code était:
Où cela devrait être
dans RenderRadioInput
Cela a résolu le problème pour moi.
la source