Почему React v16.8.5 не отображает некоторые объекты

#reactjs

#reactjs

Вопрос:

Я получаю некоторую информацию и помещаю в свое состояние react. Я могу регистрировать данные в состоянии react, но на моем дисплее не отображается вывод для {singleEmployee} … Может ли это быть ошибкой в react версии 16.8.5

 import React from 'react';
var Airtable = require('airtable');
var base = new Airtable({apiKey: ''}).base('');

class Firm extends React.Component {
constructor(props) {
super(props);
this.state = {
  name:props.location.firm.firmName,
  year:props.location.firm.yearFounded,
  address:props.location.firm.officeAddress,
  website:props.location.firm.website,
  aum:props.location.firm.aum,
  check:props.location.firm.checkSize,       
  employees:props.location.firm.employees,
  focus:props.location.firm.detailedFirmSpecialisations, 
  loaded:false,
  employeesInfo:null,   
};
}

componentDidMount(){    
const ids = this.state.employees
const employeesInfo = [];
ids.forEach((id)=>{
  base('EmploymentHistory').find(id, (err, record)=>{
    if (err) { 
      console.error(err); 
      return; 
    } 
    employeesInfo.push({
      name:record.get('Employment ID'),
      job:record.get('Job Title'),
      investment:record.get('Investment lookup'),
      dateStarted: `${record.get('Start Month (1-12)')} ${record.get('Start Year')}`    
    })
  })
})
console.log(employeesInfo)
this.setState({
  employeesInfo:employeesInfo,
  loaded:false
},()=>
  this.setState({
    loaded:true
  })
)  
}

render() {  
const {name,year,address,website,aum,check,focus,employeesInfo,loaded} = this.state;
{loaded amp;amp; console.log(employeesInfo)}
const singleEmployee = employeesInfo amp;amp; employeesInfo.map(employee=>{
  return <h4 key={employee.name}> Name is {employee.name}</h4>
})

if(!loaded){
  return(
    <div>loading...</div>
  )
}
return (
  <div>
    <h2>{name ? name : 'N/A'} Audit Report</h2>
    <h4>Year Founded {year ? year : 'N/A'}</h4>
    <h4>Address {address ? address : 'N/A'}</h4>
    <h4>Website {website ? website : 'N/A'}</h4>
    <h4>AUM {aum ? aum : 'N/A'}</h4>
    <h4>Cheque Size {check ? check : 'N/A'}</h4>
    <h4>Investment Focus {focus ? focus : 'N/A'}</h4>
    <h2>Employees</h2>
    {singleEmployee}
  </div>
); 
} 
}
  

Комментарии:

1. Пожалуйста, покажите значение employeesInfo

2. Похоже, что employeesInfo это объект, но вы выполняете итерацию по нему с map , как если бы это был массив

3. это массив … проверьте весь код

4. Вы пытаетесь выписать список всех сотрудников, потому что неясно, где вы находите интересующего вас сотрудника.

5. Вам следует добавить некоторые выходные данные и дополнительные пояснения к тому, что вы хотите сделать и как.

Ответ №1:

Поскольку employeesInfo это массив, вам нужно будет взять элемент по индексу, например

 const singleEmployee = employeesInfo amp;amp; (<h4 key={employeesInfo[0].name}> Name is {employeesInfo[0].name}</h4>)
  

приведенный здесь код:

 const singleEmployee = employeesInfo amp;amp; employeesInfo.map(employee=>{
  return <h4 key={employee.name}> Name is {employee.name}</h4>
})
  

В singleEmployee будет сохранен массив элементов react, а не один элемент

Похоже, что сначала вам следует найти элемент в employeesInfo , но у вас нет для него идентификатора.

Я сделал для вас скрипку с более простой версией того, чего вы пытаетесь достичь:https://jsfiddle.net/9L8u7fex /

Комментарии:

1. Теперь он просто печатается Name is без имени сотрудников … а employeesInfo — это массив объектов employee

2. что возвращает console.log(employeesInfo)?

3. он регистрирует массив всех сотрудников в массиве ie. 0: {name: "Else Thomson (1969)", job: Array(1), investment: Array(1), dateStarted: "6 2005"} length: 1 __proto__: Array(0)

4. Да, конечно, проблема в том, что вы пытаетесь записать одну запись employee, когда у вас на самом деле есть их массив.

5. Здесь я сопоставляю массив employeesInfo.map(employee=>{ return <h4 key={employee.name}> Name is {employee.name}</h4> })

Ответ №2:

Я думаю, что код для отображения employInfo не имеет никаких проблем. Проблема, с которой вы сталкиваетесь здесь, заключается в том, как вы добавляете больше значений в массив, который выполняется асинхронно. Я бы посоветовал вам сохранить список в состоянии.

вы можете обратиться к моему образцу в sandboxhttps://codesandbox.io/s/0v3xo8p4yp. если вы закомментируете параметр setTemp, который на самом деле запускает новый рендеринг только после того, как я обновлю список. Если вы закомментируете этот код, новый список никогда не появится в dom. Я думаю, что это очень похоже на вашу проблему

Комментарии:

1. У вас есть объяснение, в котором не используются перехватчики react

2. вы имеете в виду мой образец? как я объяснил в своем ответе, я использовал hook только для запуска повторного запуска, и я прокомментировал это в своем коде, показывающем, что новый список не отображается. Если вы раскомментируете его, то увидите, что новый список отображается