J'essaie de rendre les entrées de journal sur mon site avec un objet (pas un tableau) et je rencontre un problème, voici mon code actuel
populateJournal(){
const j = Object.values(this.state.journal);
var journalEntries = '';
for (var i = 0; i < j.length; i++){
journalEntries+=
<div>
<h3>{j[i].title} - {j[i].date}</h3>
<p>{j[i].entry}</p>
</div>;
}
return(<div>{journalEntries}</div>);
}
Lorsque j'appelle cette fonction, elle rend "<div>[object object]</div>"
et le texte entre les divs est du texte brut.
Quand je change la boucle pour dire "journalEntries = <div....
"il affiche la dernière entrée de journal comme prévu, mais le problème est qu'il n'ajoute pas réellement les entrées de journal avec la boucle.
des idées?
Inspiré d'un journalEntries
définissant comme une chaîne, définissez-le comme un tableau et poussez les éléments JSX dans le tableau afin de rendre comme
populateJournal(){
const j = Object.values(this.state.journal);
var journalEntries = [];
for (var i = 0; i < j.length; i++){
journalEntries.Push(
<div>
<h3>{j[i].title} - {j[i].date}</h3>
<p>{j[i].entry}</p>
</div>);
}
return(<div>{journalEntries}</div>);
}
Lorsque vous ajoutez à la chaîne, vous n'ajoutez pas réellement une chaîne mais un objet qui est incorrect et donc vous obtenez [Object Object]
Vous pouvez également utiliser la carte pour rendre votre contexte. Voir cette réponse sur la façon d'utiliser la carte:
REACT JS: affichage des données et manipulation des tableaux
Pourquoi vous n'utilisez pas de .map()
, essayez ceci:
render(){
const j = Object.values(this.state.journal);
return(
<div>
{j.map((item,index) =>
<div key={index}>
<h3>{item.title} - {item.date}</h3>
<p>{item.entry}</p>
</div>
)}
</div>
);
}
Vous n'avez pas besoin de popluateJournal, utilisez simplement ceci dans render ():
render() {
//const j = Object.values(this.state.journal);
const j = [{'title':'one','date':'12/03/17','entry':'This is an entry'},
{'title':'two','date':'14/03/17','entry':'This is another entry'}
];
//inject j as property into Test
const Test = ({journals}) => (
<div>
{journals.map(journal => (
<div>
<h3>{journal.title} - {journal.date}</h3>
<p>{journal.entry}</p>
</div>
))}
</div>
);
return (
<div><Test journals={j}></Test></div>
);
}
vous avez déjà les données du journal sur l'état, pourquoi voudriez-vous construire l'élément en dehors du rendu? la bonne façon de le faire est de le mapper directement sur le rendu.
populateJournal(){
const j = Object.values(this.state.journal);
return(<div>{
j && j.map((journal,i)=>{
return ( <div key={"journal"+i}>
<h3>{journal.title} - {journal.date}</h3>
<p>{journal.entry}</p>
</div>
})
}</div>);
}
n'oubliez pas de mettre la "clé" sur chaque élément mappé.