#reactjs #api
#reactjs #API
Вопрос:
Я хочу получить названия коктейлей через api. Я привел данные. Но я не могу прочитать свойства внутри.
Это JSON
{
"drinks": [
{
"idDrink": "12784",
"strDrink": "Thai Iced Coffee",
"strCategory": "Coffee / Tea",
"strIBA": null,
"strAlcoholic": "Non alcoholic",
"strGlass": "Highball glass",
"strDrinkThumb": "https://www.thecocktaildb.com/images/media/drink/rqpypv1441245650.jpg",
"strIngredient1": "Coffee",
"strIngredient2": "Sugar",
"strIngredient3": "Cream",
"strIngredient4": "Cardamom",
"strMeasure1": "black",
"strMeasure3": " podsn",
"strImageAttribution": null,
"strCreativeCommonsConfirmed": "No",
"dateModified": "2015-09-03 03:00:50"
}
]
}
Это useFetch.jsx Этот файл служит для импорта данных.
import { useState, useEffect } from "react";
function useFetch(url) {
const [data, setData] = useState([]);
const [loading, setLoading] = useState(true);
async function fetchUrl() {
const response = await fetch(url);
const json = await response.json();
setData(json);
setLoading(false);
}
useEffect(() => {
fetchUrl();
});
return [data, loading];
}
export default useFetch;
Это Main.jsx Этот файл отображает данные на экране.
import React from "react";
import styled from "styled-components";
import useFetch from "./useFetch";
const url = "https://www.thecocktaildb.com/api/json/v1/1/random.php";
const Main = () => {
const [data, loading] = useFetch(url);
return (
<>
{loading ? (
"Loading..."
) : (
<ul>
{[data].map(
({ idDrink, strDrink, strAlcoholic, strGlass, strDrinkThumb }) => (
<Container>
<img src={`${strDrinkThumb}`} alt="" />
<li key={`${data.idDrink}`}>{`Drink ${data.strDrink}`}</li>
</Container>
)
)}
</ul>
)}
</>
);
};
export default Main;
const Container = styled.div``;
Запустите console.log([data]);
, и я вижу, что данные поступают хорошо. Но данные в не определены.
Комментарии:
1. Должно ли это быть
data.drinks.map
?2. Кроме того, если вы разрушаете свою
map
функцию, вам нужно использовать их таким образом. Например, это было бы<li key={`${idDrink}`}>{`Drink ${strDrink}`}</li>
3. @Nick Результаты все те же.
4. Я подозреваю, что проблема в том, что
data
это не то, что вы думаете. Я не уверен, зачем вам вводитьdata
новый массив, если информация, которую вы пытаетесь перебрать (появляется), находится вdata.drinks
.5. @Nick О, в этом-то и проблема. Спасибо.
Ответ №1:
Основываясь на структуре данных, ваш массив фактически находится в data.drinks
. Итак, ваш компонент должен выглядеть следующим образом:
<ul>
{data.drinks.map(
({ idDrink, strDrink, strAlcoholic, strGlass, strDrinkThumb }) => (
<Container>
<img src={`${strDrinkThumb}`} alt="" />
<li key={`${idDrink}`}>{`Drink ${strDrink}`}</li>
</Container>
)
)}
</ul>;
Также обратите внимание, что, поскольку вы деструктурировали каждый элемент данных, вам нужно будет использовать фактически деструктурированное имя переменной внутри каждого цикла.