我可以使用 redux 工具包访问 createAsyncThunk w/axios 中的状态吗?
Can I access state inside a createAsyncThunk w/axios with redux toolkit?
我对 redux 工具包还很陌生,所以我仍然遇到一些问题!
根据下面的代码,我正在尝试访问我的 createAsyncThunk
中的状态(loginDetails.username
和 loginDetails.password
)。我显然在这里做错了什么——我尝试在另一个文件中编写 createAsyncThunk
函数,尝试访问该文件中的状态,然后导入该函数,但无论哪种方式都失败了。
// Import: Packages
import { createSlice, createAsyncThunk } from "@reduxjs/toolkit";
import axios from "axios";
// AsyncThunk: getUserDetails
export const getUserDetails = createAsyncThunk(
"userDetails/getUserDetails",
async () => {
try {
const apiUrl = process.env.REACT_APP_URL;
var config = {
method: "get",
url: `${apiUrl}/claimSet?UserName=${state.loginDetails.username}&Password=${state.loginDetails.password}`,
headers: {
accept: "application/json",
},
};
const response = await axios(config);
const data = await response.data;
return data;
} catch (error) {
console.log(error);
}
}
);
// Slice: userDetailsSlice
export const userDetailsSlice = createSlice({
name: "userDetails",
initialState: {
loginDetails: {
username: "",
password: "",
},
details: [],
status: null,
},
reducers: {
addUsername: (state, { payload }) => {
state.loginDetails.username = payload;
},
addPassword: (state, { payload }) => {
state.loginDetails.password = payload;
},
},
extraReducers: {
[getUserDetails.pending]: (state, action) => {
state.status = "loading";
},
[getUserDetails.fulfilled]: (state, { payload }) => {
state.details = payload;
state.status = "success";
},
[getUserDetails.rejected]: (state, action) => {
state.status = "failed";
},
},
});
// Actions: addUsername, addPassword
export const { addUsername, addPassword } = userDetailsSlice.actions;
// Reducer: userDetailsSlice.reducer
export default userDetailsSlice.reducer;
配置中的代码 url ${state.loginDetails.username}
等只是获取状态的许多失败尝试之一。我知道问题的一部分是 createAsyncThunk
在下面的 state/slide 之前声明,但我似乎仍然找不到解决它的方法。
任何帮助将不胜感激!
提前致谢<3
异步函数使用“payload”参数,其次使用包含 getState
方法的 thunkAPI
对象。
thunkAPI
: an object containing all of the parameters that are normally
passed to a Redux thunk function, as well as additional options:
dispatch
: the Redux store dispatch
method
getState
: the Redux store getState
method
extra
: the "extra argument" given to the thunk middleware on setup, if available
requestId
: a unique string ID value that was automatically generated to identify this request sequence
signal
: an AbortController.signal
object that may be used to see if another part of the app logic has marked this request as needing
cancelation.
rejectWithValue
: rejectWithValue is a utility function that you can return in your action creator to return a rejected response with a
defined payload. It will pass whatever value you give it and return it
in the payload of the rejected action.
// AsyncThunk: getUserDetails
export const getUserDetails = createAsyncThunk(
"userDetails/getUserDetails",
async (arg, { getState }) => { // <-- destructure getState method
const state = getState(); // <-- invoke and access state object
try {
const apiUrl = process.env.REACT_APP_URL;
var config = {
method: "get",
url: `${apiUrl}/claimSet?UserName=${state.loginDetails.username}&Password=${state.loginDetails.password}`,
headers: {
accept: "application/json",
},
};
const response = await axios(config);
const data = await response.data;
return data;
} catch (error) {
console.log(error);
}
}
);
我对 redux 工具包还很陌生,所以我仍然遇到一些问题!
根据下面的代码,我正在尝试访问我的 createAsyncThunk
中的状态(loginDetails.username
和 loginDetails.password
)。我显然在这里做错了什么——我尝试在另一个文件中编写 createAsyncThunk
函数,尝试访问该文件中的状态,然后导入该函数,但无论哪种方式都失败了。
// Import: Packages
import { createSlice, createAsyncThunk } from "@reduxjs/toolkit";
import axios from "axios";
// AsyncThunk: getUserDetails
export const getUserDetails = createAsyncThunk(
"userDetails/getUserDetails",
async () => {
try {
const apiUrl = process.env.REACT_APP_URL;
var config = {
method: "get",
url: `${apiUrl}/claimSet?UserName=${state.loginDetails.username}&Password=${state.loginDetails.password}`,
headers: {
accept: "application/json",
},
};
const response = await axios(config);
const data = await response.data;
return data;
} catch (error) {
console.log(error);
}
}
);
// Slice: userDetailsSlice
export const userDetailsSlice = createSlice({
name: "userDetails",
initialState: {
loginDetails: {
username: "",
password: "",
},
details: [],
status: null,
},
reducers: {
addUsername: (state, { payload }) => {
state.loginDetails.username = payload;
},
addPassword: (state, { payload }) => {
state.loginDetails.password = payload;
},
},
extraReducers: {
[getUserDetails.pending]: (state, action) => {
state.status = "loading";
},
[getUserDetails.fulfilled]: (state, { payload }) => {
state.details = payload;
state.status = "success";
},
[getUserDetails.rejected]: (state, action) => {
state.status = "failed";
},
},
});
// Actions: addUsername, addPassword
export const { addUsername, addPassword } = userDetailsSlice.actions;
// Reducer: userDetailsSlice.reducer
export default userDetailsSlice.reducer;
配置中的代码 url ${state.loginDetails.username}
等只是获取状态的许多失败尝试之一。我知道问题的一部分是 createAsyncThunk
在下面的 state/slide 之前声明,但我似乎仍然找不到解决它的方法。
任何帮助将不胜感激!
提前致谢<3
异步函数使用“payload”参数,其次使用包含 getState
方法的 thunkAPI
对象。
thunkAPI
: an object containing all of the parameters that are normally passed to a Redux thunk function, as well as additional options:
dispatch
: the Redux storedispatch
methodgetState
: the Redux storegetState
methodextra
: the "extra argument" given to the thunk middleware on setup, if availablerequestId
: a unique string ID value that was automatically generated to identify this request sequencesignal
: anAbortController.signal
object that may be used to see if another part of the app logic has marked this request as needing cancelation.rejectWithValue
: rejectWithValue is a utility function that you can return in your action creator to return a rejected response with a defined payload. It will pass whatever value you give it and return it in the payload of the rejected action.
// AsyncThunk: getUserDetails
export const getUserDetails = createAsyncThunk(
"userDetails/getUserDetails",
async (arg, { getState }) => { // <-- destructure getState method
const state = getState(); // <-- invoke and access state object
try {
const apiUrl = process.env.REACT_APP_URL;
var config = {
method: "get",
url: `${apiUrl}/claimSet?UserName=${state.loginDetails.username}&Password=${state.loginDetails.password}`,
headers: {
accept: "application/json",
},
};
const response = await axios(config);
const data = await response.data;
return data;
} catch (error) {
console.log(error);
}
}
);