В машинописном тексте useContext с useReducer всегда возвращает пустое состояние, пока не будет отправлено действие заполнения состояния - PullRequest
0 голосов
/ 06 августа 2020

В компоненте, если я выполняю

const [state, dispatch] = useStateValue();

, тогда состояние - это просто начальное состояние.

до, во время и после useEffect все состояние пусто. Это всегда исходное состояние. Только после того, как установка новых данных в состояние отправляется в обработчике useEffect (с [dispatch] в качестве второго параметра), что-то находится в состоянии

Затем я обновляю страницу или перехожу на другую страницу и обратно, и состояние снова становится исходным.

Код:

import React, { createContext, useContext, useReducer } from "react";
import { PatientEntry } from "../types";

import { Action } from "./reducer";

export type State = {
  patients: { [id: string]: PatientEntry };
};

const initialState: State = {
  patients: {}
};

export const StateContext = createContext<[State, React.Dispatch<Action>]>([
  initialState,
  () => initialState
]);

type StateProviderProps = {
  reducer: React.Reducer<State, Action>;
  children: React.ReactElement;
};

export const StateProvider: React.FC<StateProviderProps> = ({
  reducer,
  children
}: StateProviderProps) => {
  const [state, dispatch] = useReducer(reducer, initialState);
  return (
    <StateContext.Provider value={[state, dispatch]}>
      {children}
    </StateContext.Provider>
  );
};
export const useStateValue = () => useContext(StateContext);

, и если я использую в качестве второго параметра useEffect пациента, то страница перезагружается бесконечное количество раз, даже если пациент меняется только один раз - когда его меняет отправка

Мне просто нужно получить доступ к состоянию со всем, что там есть. Не сохранять в него новые данные каждый раз, когда они мне нужны

даже Provider.Consumer дает начальное состояние и даже если контекст прошел через опору.

Заключение: измененное состояние никогда не сохраняется

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...