J'ai donc un composant React.js et je souhaite parcourir un objet que j'importe d'importer pour y ajouter des options HTML. Voici ce que j'ai essayé, qui est à la fois moche et qui ne marche pas:
import React from 'react';
import AccountTypes from '../data/AccountType';
const AccountTypeSelect = (props) => {
return (
<select id={props.id} className = {props.classString} style={props.styleObject}>
<option value="nothingSelected" defaultValue>--Select--</option>
{
$.each(AccountTypes, function(index) {
<option val={this.id}>this.name</option>
})
}
</select>
);
};
export default AccountTypeSelect;
J'ai reçu cette erreur dans la console du code ci-dessus:
invariant.js? 4599: 38 - Violation invariante non capturée: les objets ne sont pas valides en tant qu'enfant de React (trouvés: objet avec les clés {id, nom, activé, additionalInfo}). Si vous vouliez rendre une collection d'enfants, utilisez plutôt un tableau ou enveloppez l'objet à l'aide de createFragment (objet) à partir des add-ons de React. Vérifiez la méthode de rendu de AccountTypeSelect
.
Dois-je vraiment convertir chaque objet en tableau ou l'envelopper avec createFragment pour l'utiliser? Quelle est la meilleure pratique pour ce cas?
Au lieu de $.each
, utilisez map
:
{AccountTypes.map(function(a) {
return (
<option key={a.id} val={a.id}>{a.name}</option>
);
})}
Points à noter:
Vos données sont dans un objet et non dans un tableau: pour le parcourir en boucle, vous devrez donc utiliser Object.keys (votreObjet) .map () au lieu de votreObjet.map ().
Avec ça en tête ; voici la solution
var user = {
fname:'John',
lname : 'Doe',
email:'[email protected]'
}
class App extends Component {
render() {
return (
<p>
<ul>
{
Object.keys(user).map((oneKey,i)=>{
return (
<li key={i}>{user[oneKey]}</li>
)
})
}
</ul>
</p>
);
}
}
Vous devriez utiliser map pour faire une boucle:
{AccountTypes.map((accountType) =>
<option value={accountType.id}>{accountType.name}</option>)}
pour rendre une liste d'enfants, vous devez ajouter l'attribut key
pour chaque enfant afin que React les rende correctement.Essayez ceci:
Avec la carte JQuery (bon pour la programmation fonctionnelle)
{
$.map(AccountTypes, function(type,index) {
return <option key={type.id} val={type.id}>type.name</option>
})
}
Avec carte normale:
{AccountTypes.map((type) => {
return <option key={type.id}
val={type.id}>
{type.name}
</option>
)}