Невозможно отобразить данные в Reactjs

Я новичок в реагировании и отлаживал это со вчерашнего дня, и я, наконец, решил опубликовать, так как не знаю, что происходит.

Следующий код реакции извлекает данные из API, а затем отображает их в пользовательском интерфейсе. Но здесь происходит несколько странных вещей.

Сначала я получаю сообщение об ошибке TypeError: Cannot read property 'map' of undefined, но когда я комментирую {renderTableData(data)} и сохраняю, а затем снова раскомментирую и сохраняю, the data is rendering perfectly on the UI

Я думаю, что еще до того, как данные будут получены из API, они передаются функции renderTableData, поэтому в консоли undefined печатается.

Вот код

export default function TenantList(){
  const [data, setData] = useState([]);
    useEffect(() => {
      fetch('https://jsonplaceholder.typicode.com/users').then((response)=>{
        return response.json();
      }).then((data)=>{
        setData(data)
      })
    },[]);
 
function renderTableData(data) {
  console.info("hello ", data)
  return data.map((student, index) => {
      const { name, email } = student //destructuring
      return (
          <tr key = {name}>
              <td>{name}</td>
              <td>{email}</td>
          </tr>
      )
  })
}
  return (
    <>
      <div>
        {renderTableData(data)}
      </div>
    </>
  )
}

Пожалуйста, предложите обходной путь

Попробуйте добавить console.info(data) в свой useEffect прямо перед строкой setData(data) и скажите мне, что он регистрирует.

aryanm 22.12.2020 21:24

Если у вас есть useState([]);, этого не должно происходить, так как начальное значение data — это массив.

Gabriele Petrioli 22.12.2020 21:30

@aryanm Я написал console.info(data) перед setData, но ничего не распечаталось

Mahesh 22.12.2020 21:31

@aryanm @Gabriele, Как предложил @jmargolisvt в ответе, когда я написал {data && renderTableData(data)} Он отлично отображается даже при обновлении страницы.

Mahesh 22.12.2020 21:33

Без него должно работать. Что-то еще не так в вашем коде, если вы продолжаете получать эту ошибку. См. codeandbox.io/s/laughing-sun-1ukiw?file=/src/App.js это ваш код, и он отлично работает.

Gabriele Petrioli 22.12.2020 21:35

@GabrielePetrioli да, на codeandbox он работает нормально, но на моей локальной машине он дает такое поведение.

Mahesh 22.12.2020 21:37

@GabrielePetrioli, но добавление {data && renderTableData(data)} в любом случае является дополнительным преимуществом, верно?

Mahesh 22.12.2020 21:39

Конечно, вы также можете просто указать значение по умолчанию для аргумента, например function renderTableData(data = []) {.

Gabriele Petrioli 22.12.2020 23:24

@GabrielePetrioli спасибо. Когда я передам data = [], функция будет ждать, пока данные не будут пустыми?

Mahesh 23.12.2020 00:03

Он не будет ждать (и не ждет сейчас), но если передан аргумент undefined, он станет [], что означает, что map будет доступен.

Gabriele Petrioli 23.12.2020 00:07

@GabrielePetrioli хорошо, понял

Mahesh 23.12.2020 00:11
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
1
11
203
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы хотите запустить эту функцию только в том случае, если у вас есть данные, поэтому проверьте ее:

{data && renderTableData(data)}

Большое спасибо, чувак :) У меня буквально болит спина часами, чтобы понять это. Ты спаситель

Mahesh 22.12.2020 21:35

Принял. Было ограничение по времени, чтобы принять ответ, поэтому я не мог этого сделать до сих пор.

Mahesh 22.12.2020 21:36

Другие вопросы по теме