Jpa*_*061 3 javascript reactjs redux redux-toolkit
有人可以像我 9 岁那样向我解释什么以及如何使用 createAsyncThunk 吗?动作字符串有什么用?它是出于逻辑/路径原因临时创建并很快销毁吗?我可以用动作字符串做什么/人们通常用它做什么?我一直盯着文档看,但我无法理解。
这是其他人使用代码的方式,如果有人能破译这个,我会很高兴。
const action = createAsyncThunk('send/sendAction', async (form, thunkAPI) => {
const data = await axios.post('/api', object);
data.reduxRequestId = thunkAPI.requestId;
return data;
}
Run Code Online (Sandbox Code Playgroud)
好吧,您可以将 Async Thunk 函数和 Reducer 函数划分为单独的类型。它们并不完全相同,您应该注意到这一点。
Reducer 函数不能执行异步代码,它们可以执行代码并更新状态,但是如果您想从服务器获取或更新某些内容,然后更新 Redux 状态,那么仅使用 reducer 将无法实现这一点职能。
所以,这就是为什么我们需要 Action creators(或 AsyncThunk 函数),它让我们执行异步代码,然后更新 Redux 的实际状态。
const action =
Run Code Online (Sandbox Code Playgroud)
您定义了一个常量,它接收(在这种情况下)另一个函数,createAsyncThunk该函数接收两个参数,第一个参数action type和第二个参数payloadCreator callback
const action = createAsyncThunk('send/sendAction', async (form, thunkAPI) => {
Run Code Online (Sandbox Code Playgroud)
所以在这种情况下action接收一个预定义的对象(createAsyncThunk)。
如果您还记得,要使用 reducer 函数,您通常需要两个参数,一个是actionType,第二个是payload.
使用 createAsyncThunk,它接收的第一个参数是 actionType,'send/sendAction'这是您的减速器将接收的 actionType,接收两个参数的异步部分是有效载荷生成器。
const action = createAsyncThunk('send/sendAction', async (form, thunkAPI) => {
const data = await axios.post('/api', object);
data.reduxRequestId = thunkAPI.requestId;
return data;
}
Run Code Online (Sandbox Code Playgroud)
函数 createAsyncThunk 返回两个参数,一个是actionType,第二个是Payload执行减速器函数所需的参数。
现在如果你想使用你的方法应该是这样的。
dispatch(action(formValuesFromLocalState, APIInstance));
Run Code Online (Sandbox Code Playgroud)
在这种情况下传递给该函数的参数或参数(formValuesFromLocalState 和 APIInstance)将传递给异步函数,因此它们将是这样的
const action = createAsyncThunk('send/sendAction', async (form = formValuesFromLocalState, thunkAPI = APIInstance)
Run Code Online (Sandbox Code Playgroud)
使用这些参数,您的方法将执行的方式或者您可能想要这样做应该是这样的。
const action = createAsyncThunk('send/sendAction', async (form, thunkAPI) => {
const object = /some specific way you want to morph the form values/
const data = await axios.post('/api', object);
data.reduxRequestId = thunkAPI.requestId;
return data; (this is the actual data which will be returned as a payload).
}
Run Code Online (Sandbox Code Playgroud)
在文档中,他们给出了一个更好的例子
他们以这种方式执行函数:
dispatch(fetchUserById(123))
Run Code Online (Sandbox Code Playgroud)
实际功能是:
const fetchUserById = createAsyncThunk(
'users/fetchByIdStatus',
async (userId, thunkAPI) => {
const response = await userAPI.fetchById(userId)
return response.data
}
)
Run Code Online (Sandbox Code Playgroud)
所以,这个函数只在这种情况下接收userId,thunkAPI不使用。
'users/fetchByIdStatus'
Run Code Online (Sandbox Code Playgroud)
是将被调度的 actionType。
const response = await userAPI.fetchById(userId)
return response.data
Run Code Online (Sandbox Code Playgroud)
API调用是异步代码,return语句return response.data
是实际的payload。
所以最后,调度函数可能看起来像这样:
dispatch({type:'users/fetchByIdStatus', payload:(whatever response.data has)});
Run Code Online (Sandbox Code Playgroud)
希望这个解释是可以理解的,请原谅我的英语不好。
| 归档时间: |
|
| 查看次数: |
3673 次 |
| 最近记录: |