Данные определены, но возвращают неопределенные

#javascript #reactjs

Вопрос:

 import { useState , useEffect} from "react";
import 'semantic-ui-css/semantic.min.css'
import { Header, Button , Container, Image} from 'semantic-ui-react'
import dotalLogo from './dota2.png'

import React from "react";
import Loading from './loading'
const dataUrl = 'https://api.opendota.com/api/heroStats'

function App() {
 const [loading, setLoading] = useState(false)
 const [data, setData] = useState([])
 const [index, setIndex] = useState(0)

 const fecthApi = async () => {
   setLoading(true)
   try {
     const fetched = await fetch(dataUrl)
     const parsed = await fetched.json()
     setData(parsed)
     setLoading(false)
  
   } catch (error) {
     console.log('error')
     setLoading(false)
   }
 }

 useEffect(()=>fecthApi(),[])
 if (loading){
    return <Loading />
  }

  function nextBtn(e) {
    e.preventDefault()
    setIndex((prev)=>prev 1)
  }

  function backBtn(e) {
    e.preventDefault()
    setIndex((prev)=>prev-1)
  }

  return (
    <>
      <main id="main-content">
        <Container>
          <Header className='headings' as='h1' size='medium' style={{fontSize: 40}}>
            <img className="dota-logo" src={dotalLogo} alt="" />
            <Header.Content className="dota-header">Dota 2</Header.Content>
          </Header>
          <br />
          <Container className='middle-layer'>

            <Button 
              onClick={(e)=> nextBtn(e)} 
              className='change-btn-one' 
              content='Back' 
              icon='arrow left' 
              labelPosition='left' />

            <Image 
              className='dota-img' 
              src={"https://api.opendota.com"   data[index].img} 
              rounded
              alt='err' 
              bordered 
              centered/>

            <Button 
              onClick={(e)=> backBtn(e)} 
              className='change-btn-two' 
              content=' Next ' 
              icon='arrow right' 
              labelPosition='right' />

          </Container>
            </Container>
            <Container>
              <p>{data[index].localized_name}</p>
                </Container>
            <div className="contain"></div>
          </main>
        </>
      );
    }

export default App;
 

Я получаю ошибку после ее компиляции, imgно я определил ее и извлекаю данные с помощью асинхронного ожидания, но получаю

Ошибка типа: данные[индекс] не определены

Я застрял на несколько часов и до сих пор не нашел решения. Кроме того, я попытался уничтожить его, но все равно получаю ту же ошибку. Использование data.map() работает, но я хочу отображать только данные об одном герое за раз, а использование карты загрузит 120 данных о героях.

Я понимаю, что это довольно глупый вопрос, но я просто не могу его понять 🙂

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

1. Каково значение/длина данных, когда вы получаете эту ошибку?

2. Вам нужно обработать , когда data это [] произойдет, так как в вашем первом рендере больше ничего не будет.

3. @KirillSavik setIndex -это функция, которая обновляет переменную состояния index .

4. if (data.length < 1) return null

5. значение по умолчанию для загрузки-false

Ответ №1:

данные[индекс] не определены до завершения выборки. Итак, данные[индекс].localized_name выдаст вам ошибку. вы можете написать это так.

 data[index] amp;amp; data[index].localized_name
 

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

1. Или визуализируйте что-то еще во время ожидания. if (data.length < 1) return 'still loading...'

2. Да, спасибо вам! я не думал об этом раньше.