Контекст, возвращающийся как неопределенный при отображении его через пользовательский хук с помощью Typescript

#reactjs #typescript #react-hooks #react-context

#reactjs #typescript #реагирующие хуки #реагировать-контекст

Вопрос:

Я работаю над машинописной версией шаблона Кента Додда для использования контекста реакции с помощью useReducer. Вы можете увидеть мою версию приложения в codesandbox.

Короче говоря, существуют пользовательские перехваты, которые предоставляют контексты для состояния и отправки. Но когда я пытаюсь их использовать, контексты возвращаются как undefined .

Вероятно, я упускаю что-то действительно очевидное в разнице между тем, что он делает, и я делаю, но я этого не вижу. Свежая пара глаз была бы отличной. Спасибо.

Поставщик и хук выглядят следующим образом

 const AuthProvider = ({ children }: ProviderProps) => {
  const [state, dispatch] = useReducer(authReducer, initialState);

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

function useAuthState() {
  const context = React.useContext(AuthStateContext);
  if (context === undefined) {
    throw new Error("useAuthState needs a context");
  }
  return context;
}

function useAuthDispatch() {
  const context = React.useContext(AuthDispatchContext);
  if (context === undefined) {
    throw new Error("useAuthDispatch needs a context");
  }
  return context;
}
  

Использование хуков выглядит следующим образом.

 export default function App() {
  const dispatch = useAuthDispatch();
  const { isAuthenticated, user } = useAuthState();

  useEffect(() => {
    console.log("dispatch", dispatch);
  }, [dispatch]);

  return (
    <AuthProvider>
      <div>Authenticated: {isAuthenticated ? "true" : "false"}</div>
      <div>user: {user ? user : "not logged in yet"}</div>

      {isAuthenticated ? (
        <button onClick={() => dispatch({ type: "logout" })}>Logout</button>
      ) : (
        <button onClick={() => dispatch({ type: "login" })}>Login</button>
      )}
    </AuthProvider>
  );
}
  

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

1. Не могли бы вы попробовать обернуть <AuthProvider><App /></AuthProvider> так, а не внутри App.js ?

2. Это сделало это. Спасибо @AntonioErdeljac. Я знал, что это увидит другая пара глаз.

3. Могу ли я написать это как ответ, чтобы другие тоже могли его увидеть?

4. Абсолютно. Пожалуйста, сделайте.