Я создаю простое реагирующее приложение с использованием Context-Provider и редукторов. В моем коде, когда я нажимаю кнопку входа на экране, он вызывает метод callApi
, который вызывает бэкэнд, а также должен установить token
в TOKEN NOT LOADED
, а затем, если вызовы API возвращают ошибку, он вызывает действие add_error
в редукторе. -> который устанавливает значение от token
до TOKEN LOADING ERROR
, но когда у меня есть точка останова в add_error
, значение token
в действии callApi
никогда не устанавливается. Я не уверен, что происходит. Правильный ли этот способ программирования?
const testReducer = (state, action) => {
switch (action.type) {
case "callApi":
api(action.payload.dispatch);
console.log("callApi action");
return { ...state, errorMessage: "", token: "TOKEN NOT LOADED" };
case "add_error":
console.log("add_error action");
return { ...state, errorMessage: action.payload, token: "TOKEN LOADING ERROR" };
default:
return state;
}
};
const callApi = dispatch => async () => {
dispatch({
type: "callApi",
payload: {dispatch}
})
};
const api = async (dispatch) => {
try {
const response = await apiServer.post("/vendor/signin", {
username : "asdasd",
password : "asdsd dad",
"g-recaptcha-response": "asdsd"
});
if (response.data.status === "success") {
console.log("Sign in Success");
} else {
console.log("Sign in Error");
dispatch({
type: "add_error",
payload: "Something went wrong with signin"
});
}
} catch (err) {
dispatch({
type: "add_error",
payload: "Something went wrong with signin"
});
}
};
export const { Provider, Context } = createDataContext(
testReducer,
{ callApi },
{ errorMessage: "", token: null }
);
================================= ============================================
createDataContext.js
import React, { useReducer } from 'react';
export default (reducer, actions, defaultValue) => {
const Context = React.createContext();
const Provider = ({ children }) => {
const [state, dispatch] = useReducer(reducer, defaultValue);
const boundActions = {};
for (let key in actions) {
boundActions[key] = actions[key](dispatch);
}
return (
<Context.Provider value={{ state, ...boundActions }}>
{children}
</Context.Provider>
);
};
return { Context, Provider}
};