Je suis nouveau sur ReactJS, désolé si cela sonne. J'ai un composant qui crée plusieurs lignes de table en fonction des données reçues.
Chaque cellule de la colonne possède une case à cocher radio. Par conséquent, l'utilisateur peut sélectionner un site_name
et un address
parmi les lignes existantes. La sélection doit être indiquée dans le pied de page. Et c'est là que je suis coincé.
var SearchResult = React.createClass({
render: function(){
var resultRows = this.props.data.map(function(result){
return (
<tbody>
<tr>
<td><input type="radio" name="site_name" value={result.SITE_NAME}>{result.SITE_NAME}</input></td>
<td><input type="radio" name="address" value={result.ADDRESS}>{result.ADDRESS}</input></td>
</tr>
</tbody>
);
});
return (
<table className="table">
<thead>
<tr>
<th>Name</th>
<th>Address</th>
</tr>
</thead>
{resultRows}
<tfoot>
<tr>
<td>chosen site name ???? </td>
<td>chosen address ????? </td>
</tr>
</tfoot>
</table>
);
}
});
Dans jQuery, je pouvais faire quelque chose comme $("input[name=site_name]:checked").val()
obtenir la sélection d'un type de case à cocher radio et l'insérer dans la première cellule de pied de page.
Mais il doit sûrement y avoir une manière Reactjs, ce qui me manque totalement? Merci beaucoup
input
les éléments n'ont pas de contenu. Cela<input>content</input>
n'a donc aucun sens et n'est pas valide. Vous voudrez peut-être<label><input />content</label>
.Réponses:
Toute modification du rendu doit être modifiée via le
state
ouprops
( doc de réaction ).Donc, ici, j'enregistre l'événement de l'entrée, puis je change le
state
, ce qui déclenchera ensuite le rendu pour l'afficher dans le pied de page.jsbin
la source
}, this);
juste en dessous du</tbody>
. Qu'est-ce que c'est et que fait-il? J'ai remarqué sans que le code plante.this
est le contexte passé à lamap
fonction . C'était le montage de @FakeRainBrigand, bonne prise! Sans cela, votre fonctionthis
dans la carte fera référence à lawindow
, qui n'a aucune idée de quoi ilstate
s'agitthis
astuce n'est pas nécessaire si vous utilisez une flèche ES6 au lieu d'une fonction régulière. Par exemple:var resultRows = this.props.data.map((result) => { ... });
je ne le mentionne que parce que les React-ers utilisent généralement déjà une forme de transpilation (pour JSX), donc ES6 est généralement à portée de main.onInputChange (e) {this.setState({ [e.target.name]: e.target.value }); }
Voici une façon simple d'implémenter des boutons radio dans react js.
Édité
Vous pouvez utiliser la fonction flèche au lieu de la liaison. Remplacez le code ci-dessus par
<div onChange={event => this.setGender(event)}>
Pour une valeur par défaut, utilisez
defaultChecked
comme cecila source
.bind(this)
cela créera une nouvelle fonction à chaque fois. Cela signifie que lorsque react vérifie pour voir si quelque chose a changé dans le DOM virtuel, ce composant sera toujours différent et devra toujours être rendu.name
accessoire. Ils sont tous les deux enveloppés dans un div qui a leonChange
gestionnaire comme décrit dans cette réponse. Je clique sur la première radio, un événement est déclenché. Je clique sur la deuxième radio, un événement est déclenché. Cependant, la troisième fois et après, aucun événement n'est déclenché. Pourquoi?D'après ce que React Docs dit :
Par exemple:
Lien vers l'exemple: https://codesandbox.io/s/6l6v9p0qkr
Au début, aucun des boutons radio n'est sélectionné, tout
this.state
comme un objet vide, mais chaque fois que le bouton radio est sélectionnéthis.state
obtient une nouvelle propriété avec le nom de l'entrée et sa valeur. Il est ensuite plus facile de vérifier si l'utilisateur a sélectionné un bouton radio comme:ÉDITER:
Avec la version 16.7-alpha de React, il y a une proposition pour quelque chose appelé
hooks
qui vous permettra de faire ce genre de choses plus facilement:Dans l'exemple ci-dessous, il y a deux groupes de boutons radio dans un composant fonctionnel. Pourtant, ils ont des entrées contrôlées:
Exemple de travail: https://codesandbox.io/s/6l6v9p0qkr
la source
Transformez le composant radio en composant stupide et passez les accessoires au parent.
la source
Juste une idée ici: en ce qui concerne les entrées radio dans React, je les rend généralement toutes d'une manière différente, comme cela a été mentionné dans les réponses précédentes.
Si cela peut aider quiconque a besoin de rendre de nombreux boutons radio:
la source
checked={ this.state.gender === value }
. Les composants fonctionnels n'en ont pasthis
.la source
Un clic sur un bouton radio doit déclencher un événement qui:
self.props.selectionChanged(...)
Dans le premier cas, le changement d'état déclenchera un nouveau rendu et vous pouvez faire
<td>chosen site name {this.state.chosenSiteName} </td>
dans le second cas, la source du rappel mettra à jour les choses pour s'assurer qu'en bas de la ligne, votre instance SearchResult aura choisiSiteName et choseAddress définie dans ses accessoires.
la source
Pour s'appuyer sur ChinKang dit pour sa réponse, j'ai une approche plus sèche et en es6 pour ceux qui sont intéressés:
sauf que celui-ci aurait une valeur vérifiée par défaut.
la source
J'ai également été confus dans la radio, la mise en œuvre de la case à cocher. Ce dont nous avons besoin est d'écouter l'événement de changement de la radio, puis de définir l'état. J'ai fait un petit exemple de sélection de genre.
la source
Les gars de Bootstrap, nous le faisons comme ceci:
la source