#reactjs #react-redux #react-hooks
#реагирует на #реагировать-переделывать #реагируют-крючки
Вопрос:
У меня есть пользовательский хук, который дает мне экземпляр класса для запроса различных методов службы, эта служба зависит от контекста (AxiosContext), который, в свою очередь, зависит от другого контекста (AuthContext), чтобы иметь возможность передавать токен перехватчику.
//Custom hook export class ClientService extends Apilt;Clientgt; { constructor(instance, options = {}) { super(instance, "clients"); } } function useClientService(options = {}) { const [clientInstance, setClientInstance] = useState(null); const instance = useContext(AxiosContext); useEffect(() =gt; { if (instance) { setClientInstance(new ClientService(instance, options)); } }, [instance]); return clientInstance; } export { useClientService }; export const AxiosContext = createContext(null); export const AxiosContextProvider = (props) =gt; { const ref = useRef(0); const [instance, setInstance] = useState(null); const authContext = useContext(AuthContext); useEffect(() =gt; { ref.current ; }) useEffect(() =gt; { if (authContext.token) { const nInstance = axios.create(); const request = new RequestInterceptor(authContext); const response = new ResponseInterceptor(authContext); nInstance.interceptors.request.use(request.Success(authContext.token, ref.current), request.Err()); nInstance.interceptors.response.use(response.Success(), response.Err()); console.groupEnd() setInstance(() =gt; nInstance) } }, [authContext.token]); return ( lt;gt; lt;AxiosContext.Provider value={instance}gt; {props.children} lt;/AxiosContext.Providergt; lt;/gt; ); };
и я потребляю его вот так.
useEffect(() =gt; { if (clientService) { ...... } }, [clientService]);
это прекрасно работает с redux и операциями, но я хочу отделить логику контроллеров от моих компонентов и передать все это саге, я нахожу, что у нее есть способ передавать им контексты, но они являются чистыми синглетами, если бы кто-нибудь мог мне помочь, как это сделать
Короче говоря, мне нужно что-то вроде этого.
function* mySaga() { const clientService=useClientService() //with context Axios and Context Auth yield takeLatest("GET_SUCCESS", clientService.getAll); } export default mySaga;
Комментарии:
1. Я попытался передать экземпляр в магазин, чтобы вызвать его из redux saga, но, по-видимому, он не позволяет вводить несериализованные данные.