一度に複数のURLからデータを取得するには?

DGB:

私が反応して、URLからフェッチ機能を持っています

const DataContextProvider = (props) => {
  const [isLoading, setLoading] = useState(false);
  const [cocktails, setCocktails] = useState([]);

  useEffect(() => {
    const fetchCocktailList = async () => {
      const baseUrl = 'https://www.thecocktaildb.com/api/json/v1/1/';
      setLoading(true);
      try {
        const res = await fetch(`${baseUrl}search.php?s=margarita`);
        const data = await res.json();
        console.log(data);
        setCocktails(data.drinks);
        setLoading(false);
      } catch (err) {
        console.log('Error fetching data');

        setLoading(false);
      }
    };

    fetchCocktailList();
  }, []);


どのように私はこれまでのデータをマッピングしています。

const DrinkList = () => {
  const { cocktails } = useContext(DataContext);
  return (
    <div className='drink-list-wrapper'>
      {cocktails.length > 0 &&
        cocktails.map((drink) => {
          return <DrinkItem drink={drink} key={drink.idDrink} />;
        })}
    </div>
  );
};

しかし、私はまた、このURLから取得したいです ${baseUrl}search.php?s=martini

私はこれを行うと、返されたデータの両方に自分の状態を設定するための良いきれいな方法をしたいと思います。

jsejcksn:

ここでは、への依存関係などのカクテルの名前を指定できます方法ですuseEffectあなたの状態に保存し、新しいレシピをしたい場合は、新しいドリンクのリストを取得できるようにします。そうでない場合、それだけで静的な状態変数になるでしょう。

  • 私はまた、別の状態変数を追加しましたerrorMessageあなたが失敗した場合にエラーメッセージを渡すために使用します。
  • また、あなたはあなたに適切な依存関係を含める必要がありますuseEffectフックsetState呼び出しによって返された機能はするuseState安定しており、効果の再実行をトリガーしません、とcocktailNamesあなたがフェッチするために、新しいものとそれを更新しない限り、変数は、再実行をトリガーしません。
const DataContextProvider = (props) => {
  const [isLoading, setLoading] = useState(false);
  const [cocktails, setCocktails] = useState([]);
  const [errorMessage, setErrorMessage] = useState(''); // holds an error message in case the network request dosn't succeed
  const [cocktailNames, setCocktailNames] = useState(['margarita', 'martini']); // the search queries for the `s` parameter at your API endpoint

  useEffect(() => {
    const fetchCocktailLists = async (...cocktailNames) => {
      const fetchCocktailList = async (cocktailName) => {
        const baseUrl = 'https://www.thecocktaildb.com/api/json/v1/1/search.php';
        const url = new URL(baseUrl);
        const params = new URLSearchParams({s: cocktailName});
        url.search = params.toString(); // -> '?s=cocktailName'
        const res = await fetch(url.href); // -> 'https://www.thecocktaildb.com/api/json/v1/1/search.php?s=cocktailName'
        const data = await res.json();
        const {drinks: drinkList} = data; // destructured form of: const drinkList = data.drinks;
        return drinkList;
      };

      setLoading(true);
      try {
        const promises = [];
        for (const cocktailName of cocktailNames) {
          promises.push(fetchCocktailList(cocktailName));
        }
        const drinkLists = await Promise.all(promises); // -> [[drink1, drink2], [drink3, drink4]]
        const allDrinks = drinkLists.flat(1); // -> [drink1, drink2, drink3, drink4]
        setCocktails(allDrinks);
      }
      catch (err) {
        setErrorMessage(err.message /* or whatever custom message you want */);
      }
      setLoading(false);
    };

    fetchCocktailList(...cocktailNames);
  }, [cocktailNames, setCocktails, setErrorMessage, setLoading]);
};

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=13503&siteId=1