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:

REACT JS: отображение данных и манипуляция массивом


почему вы не используете 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>);
}

Не забудьте поместить "ключ" на каждый сопоставленный элемент.