React useContext()は未定義を返します

ミハイバディラ

コンテキストプロバイダー用にこのコードがあり、コンポーネントがラップされていますが、useProductStateまたはuseProductDispatchのいずれかを使用して子で使用しようとすると、undefinedが返されます(エラーがスローされます)。

import React from "react";

import productsReducer from "./productsReducer";

const ProductsStateContext = React.createContext();
const ProductsDispatchContext = React.createContext();

const initialState = {
  restaurantTitle: "",
  restaurantId: "VljSa5Eakepw9QkTAUOW",
  productsCollection: "",
  categories: [],
  defaultCategory: "",
  isLoading: true,
};

function ProductsProvider({ children }) {
  const [state, dispatch] = React.useReducer(productsReducer, initialState);

  return (
    <ProductsStateContext.Provider value={state}>
      <ProductsDispatchContext.Provider value={dispatch}>
        {children}
      </ProductsDispatchContext.Provider>
    </ProductsStateContext.Provider>
  );
}

function useProductsState() {
  const context = React.useContext(ProductsStateContext);
  if (context === undefined) {
    throw new Error("useProductsState must be used within a ProductsProvider");
  }
  return context;
}
function useProductsDispatch() {
  const context = React.useContext(ProductsDispatchContext);
  if (context === undefined) {
    throw new Error(
      "useProductsDispatch must be used within a ProductsProvider"
    );
  }
  return context;
}

export { ProductsProvider, useProductsState, useProductsDispatch };

誰かがこれがどのように機能するかを説明できますか?私は状態にアクセスして、の子である機能コンポーネントにディスパッチしようとしています。

更新:

レデューサーのアクションとしてこれを持っています

case "FETCH_RESTAURANT_DATA": {
      return fetchRestaurantData(state, action.payload);
    }

関数本体は次のようになります。

const fetchRestaurantData = (state, value) => {
  let newState = state;
  return axios
    .post(api.routes.restaurant, { restaurantId: state.restaurantId })
    .then((res) => {
      newState.restaurantTitle = res.data.restaurantTitle;

      res.data.categories.forEach(
        (category) =>
          (newState.categories[category] = {
            loaded: false,
            props: [],
          })
      );
      newState.defaultCategory = res.data.categories[0];
      newState.productsCollection = res.data.productsCollection;
      newState.isLoading = false;

      return axios.post(api.routes.category, {
        productsCollection: res.data.productsCollection,
        categoryId: newState.defaultCategory,
      });
    })
    .then((res) => {
      newState.categories[newState.defaultCategory].props =
        res.data[newState.defaultCategory];
      newState.categories[newState.defaultCategory].loaded = true;
      console.log(newState);
      return newState;
    });
};

私が考えていることは、レデューサーでは応答を待たず、コンテキスト状態を未定義の値で更新してエラーをトリガーすると思います。

fetchRestaurantData()応答を待機する中間非同期関数を作成しようとしましたが、応答を取得する前にまだ更新中です

メルキア

次の応答を待つ必要がありますfetchRestaurantData

const fetchRestaurantData = async (state, value) => {  // add async keyword to the function 
  let newState = state;
  return await axios  // here add await 
    .post(api.routes.restaurant, { restaurantId: state.restaurantId })
    .then((res) => {
      newState.restaurantTitle = res.data.restaurantTitle;

      res.data.categories.forEach(
        (category) =>
          (newState.categories[category] = {
            loaded: false,
            props: [],
          })
      );
      newState.defaultCategory = res.data.categories[0];
      newState.productsCollection = res.data.productsCollection;
      newState.isLoading = false;

      return axios.post(api.routes.category, {
        productsCollection: res.data.productsCollection,
        categoryId: newState.defaultCategory,
      });
    })
    .then((res) => {
      newState.categories[newState.defaultCategory].props =
        res.data[newState.defaultCategory];
      newState.categories[newState.defaultCategory].loaded = true;
      console.log(newState);
      return newState;
    });
};

非同期関数の詳細

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

React関数は未定義を返します

分類Dev

React / redux:this.propsは未定義の値+配列を返します

分類Dev

Reactコンテキストは未定義を返します

分類Dev

react-navigationwithNavigationは未定義を返します

分類Dev

Reactコンテキストは未定義を返します

分類Dev

React typescript useParams()は、useEffectで常に未定義を返します

分類Dev

React-Redux-this.propsは常に未定義を返します

分類Dev

React:静的メソッドは常に未定義を返します

分類Dev

useContext()は未定義を返します

分類Dev

JS / React-関数は終了する前に未定義を返します

分類Dev

Reactフェッチは未定義を返しますが、コンソールでは応答を返します

分類Dev

Reactフェッチは未定義を返しますが、コンソールでは配列を返します

分類Dev

Jest:react-routerテストは未定義の「params」を返します

分類Dev

Reactのインポートされた関数は未定義を返します

分類Dev

Reactの小道具は未定義として返されます

分類Dev

React Native HealthKitgetDailyStepCountSamplesが未定義または空の配列を返す

分類Dev

React js createRef()が未定義を返します

分類Dev

useRefオブジェクトがReact / React-Nativeで未定義を返します

分類Dev

コンポーネントに小道具を渡すReactは未定義を返します

分類Dev

Map関数は、Reactコンポーネントに未定義の要素を含む配列を返します

分類Dev

useContextは未定義のnextjsを返します

分類Dev

useContextは、_app.js(Next.js)で未定義を返します

分類Dev

REACT-.mapは小道具を未定義として作成します

分類Dev

create-react-appインポートされた関数は未定義を返します

分類Dev

ReactルーターのuseHistoryフックが未定義を返します

分類Dev

Reactコンポーネントはデータ行を繰り返します:TypeError:未定義のプロパティ 'map'を読み取れません

分類Dev

Reactコンポーネントエラーは未定義ですが、nullを返す必要があります

分類Dev

React Native:Apolloを使用したGraphQLクエリが未定義を返すのはなぜですか?

分類Dev

GatsbyとParentからFunctionalComponentにPagePropsを渡すと、ReactとTSを使用して未定義が返されます

Related 関連記事

  1. 1

    React関数は未定義を返します

  2. 2

    React / redux:this.propsは未定義の値+配列を返します

  3. 3

    Reactコンテキストは未定義を返します

  4. 4

    react-navigationwithNavigationは未定義を返します

  5. 5

    Reactコンテキストは未定義を返します

  6. 6

    React typescript useParams()は、useEffectで常に未定義を返します

  7. 7

    React-Redux-this.propsは常に未定義を返します

  8. 8

    React:静的メソッドは常に未定義を返します

  9. 9

    useContext()は未定義を返します

  10. 10

    JS / React-関数は終了する前に未定義を返します

  11. 11

    Reactフェッチは未定義を返しますが、コンソールでは応答を返します

  12. 12

    Reactフェッチは未定義を返しますが、コンソールでは配列を返します

  13. 13

    Jest:react-routerテストは未定義の「params」を返します

  14. 14

    Reactのインポートされた関数は未定義を返します

  15. 15

    Reactの小道具は未定義として返されます

  16. 16

    React Native HealthKitgetDailyStepCountSamplesが未定義または空の配列を返す

  17. 17

    React js createRef()が未定義を返します

  18. 18

    useRefオブジェクトがReact / React-Nativeで未定義を返します

  19. 19

    コンポーネントに小道具を渡すReactは未定義を返します

  20. 20

    Map関数は、Reactコンポーネントに未定義の要素を含む配列を返します

  21. 21

    useContextは未定義のnextjsを返します

  22. 22

    useContextは、_app.js(Next.js)で未定義を返します

  23. 23

    REACT-.mapは小道具を未定義として作成します

  24. 24

    create-react-appインポートされた関数は未定義を返します

  25. 25

    ReactルーターのuseHistoryフックが未定義を返します

  26. 26

    Reactコンポーネントはデータ行を繰り返します:TypeError:未定義のプロパティ 'map'を読み取れません

  27. 27

    Reactコンポーネントエラーは未定義ですが、nullを返す必要があります

  28. 28

    React Native:Apolloを使用したGraphQLクエリが未定義を返すのはなぜですか?

  29. 29

    GatsbyとParentからFunctionalComponentにPagePropsを渡すと、ReactとTSを使用して未定義が返されます

ホットタグ

アーカイブ