React-это рендеринг [object object], а не JSX
Я пытаюсь отобразить записи журнала на моем сайте с помощью объекта (не массива), и у меня возникает проблема, вот мой текущий код
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>);
}
когда я вызываю эту функцию, она отображает "<div>[object object]</div>"
и текст между divs является простым текстом.
когда я меняю цикл, чтобы сказать"journalEntries = <div....
" он отображает последнюю запись журнала, как ожидалось, но проблема в том, что на самом деле он не добавляет записи журнала с циклом.
идеи?
4 ответов
Inspead определения journalEntries
в качестве строки определите его как массив и нажмите элементы JSX в массив, чтобы отобразить как
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>);
}
когда вы добавляете к строке, вы на самом деле не добавляете строку, а объект, который является неправильным, и, следовательно, вы получаете [Object Object]
вы также можете использовать map для отображения контекста. См. этот ответ о том, как использовать map:
почему вы не используете from .map()
, попробуйте это:
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>
);
}
вам не нужен popluateJournal, просто используйте это в 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>
);
}
у вас уже есть данные журнала о состоянии, зачем создавать элемент вне рендеринга? правильный способ сделать это-отобразить его непосредственно на рендере.
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>);
}
Не забудьте поместить "ключ" на каждый сопоставленный элемент.