React: почему я не могу передавать данные из одного функционального компонента в другой функциональный компонент?

#javascript #reactjs

#javascript #reactjs

Вопрос:

Я немного запутался, почему я не могу передавать извлеченные данные между двумя функциональными компонентами. Я попытался использовать перехваты, и он вернул сообщение об ошибке, предлагающее использовать массив для объекта [Promise]. Есть идеи, что я здесь пропустил? Я довольно новичок в React. Буду признателен за любую помощь!

 // Component A
function App() {
  const apiURL = "https://services9.arcgis.com/M4Su6cnNT6vqupbh/arcgis/rest/services/COVID19_Data/FeatureServer/0/query?where=1=1amp;outFields=*amp;outSR=4326amp;f=json";
  const apiData = fetch(apiURL)
                    .catch(err=>console.log(err))
                    .then(data=>console.log(data));
  return (
    <div>
      <h1>Hello</h1>
      <DataVisualize data={apiData}/>
    </div>
  );
}

// Component B
function DataVisualize(props){
    return <div>{props.data}</div>;
}
  

Ответ №1:

Ваш apiData не содержит фактических данных, которые вы хотите — это только обещание. Он catch также находится в неправильном месте (ставьте .catch после .then s), и вам нужно вызвать .json or .text в ответе (возвращаемом значением разрешения fetch ), чтобы получить обещание, которое преобразует фактические данные, которые вам нужны.

Установите некоторое состояние, когда вместо этого извлекаются конечные данные:

 // Component A
function App() {
  const apiURL = "https://services9.arcgis.com/M4Su6cnNT6vqupbh/arcgis/rest/services/COVID19_Data/FeatureServer/0/query?where=1=1amp;outFields=*amp;outSR=4326amp;f=json";
  const [data, setData] = useState();
  useEffect(
    () => {
      fetch(apiURL)
        .then(res => res.json())
        .then(setData)
        .catch(console.error); // handle errors
    },
    [] // run this only once, on mount
  );
  return (
    <div>
      <h1>Hello</h1>
      { data amp;amp; <DataVisualize data={data}/> }
    </div>
  );
}

// Component B
function DataVisualize(props){
    return <div>{props.objectIdFieldName}</div>;
}
  

Также обратите внимание, что результат, похоже, не обладает каким-либо .data свойством (хотя у него есть objectIdFieldName свойство, поэтому я привел его в качестве примера).

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

1. Привет, спасибо за ваше подробное объяснение. Я не был ясен в своем вопросе. URL возвращает данные в формате json. мне все еще нужно использовать res.json()? Это еще одна часть, которая меня смутила.

2. Да. fetch разрешается при получении заголовков ответа, а затем вам нужно дождаться другого обещания, чтобы тело ответа было полностью получено.