【问题标题】:What are some common Redux Toolkit's CreateAsyncThunk use cases有哪些常见的 Redux Toolkit 的 CreateAsyncThunk 用例
【发布时间】:2020-10-03 16:31:57
【问题描述】:

有人可以像我 9 岁那样向我解释什么以及如何使用 createAsyncThunk 吗?动作字符串有什么用?它是出于逻辑/路径原因临时创建并很快销毁吗?我可以用操作字符串做什么/人们通常用它做什么?我一直盯着文档看,看不懂。

这是别人使用代码的方式,如果有人能破译我会很高兴。

const action = createAsyncThunk('send/sendAction', async (form, thunkAPI) => {
  const data = await axios.post('/api', object);
  data.reduxRequestId = thunkAPI.requestId;
  return data;
}

官方文档:https://redux-toolkit.js.org/api/createAsyncThunk

【问题讨论】:

标签: javascript reactjs redux redux-toolkit


【解决方案1】:

你可以将 Async Thunk 函数和 Reducer 函数分成不同的类型。 它们并不完全相同,您应该注意到这一点。

Reducer 函数不能执行异步代码,它们可以执行代码并更新状态,但是如果你想从服务器获取或更新一些东西,然后更新 Redux 状态,你将无法单独实现这一点通过使用 reducer 函数。

所以,这就是我们需要 Action 创建者(或 AsyncThunk 函数)的原因,它让我们能够执行异步代码,然后更新 Redux 的实际状态。

const action = 

您定义一个常量,它接收(在这种情况下)另一个函数 createAsyncThunk,它接收两个参数,第一个参数是 action type,第二个参数是 payloadCreator callback

const action = createAsyncThunk('send/sendAction', async (form, thunkAPI) => {

所以在这种情况下,action 接收到一个预定义的对象 (createAsyncThunk)。

如果你还记得,要使用 reducer 函数,通常需要两个参数,一个是 actionType,第二个是 payload

使用 createAsyncThunk,它接收的第一个参数是 actionType,即'send/sendAction',这是您的 reducer 将接收的 actionType,接收两个参数的异步部分是有效负载生成器。

const action = createAsyncThunk('send/sendAction', async (form, thunkAPI) => {
  const data = await axios.post('/api', object);
  data.reduxRequestId = thunkAPI.requestId;
  return data;
}

函数createAsyncThunk返回两个参数,一个是actionType,第二个是Payload,正是你需要执行reducer函数的那些。

现在如果你想使用你的方法应该是这样的。

dispatch(action(formValuesFromLocalState, APIInstance));

在这种情况下,您传递给该函数的参数或参数(formValuesFromLocalState 和 APIInstance)将传递给异步函数,因此它们将是这样的

const action = createAsyncThunk('send/sendAction', async (form = formValuesFromLocalState, thunkAPI = APIInstance) 

使用这些参数,您的方法将执行或您可能想要执行的方式应该是这样的。

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).
}

在文档中他们举了一个更好的例子

他们以这种方式执行函数:

dispatch(fetchUserById(123))

实际作用是:

const fetchUserById = createAsyncThunk(
  'users/fetchByIdStatus',
  async (userId, thunkAPI) => {
    const response = await userAPI.fetchById(userId)
    return response.data
  }
)

所以,这种情况下函数只接收userIdthunkAPI没有被使用。

'users/fetchByIdStatus'

是要分派的actionType。

const response = await userAPI.fetchById(userId)
        return response.data

并且API调用是异步代码,返回语句return response.data 是实际的有效载荷。

所以最后,dispatch 函数可能看起来像这样:

dispatch({type:'users/fetchByIdStatus', payload:(whatever response.data has)});

希望这个解释是可以理解的,请原谅我的英语不好。

【讨论】:

    猜你喜欢
    • 2021-08-23
    • 2020-09-26
    • 2021-09-17
    • 2020-09-13
    • 2020-10-27
    • 1970-01-01
    • 2021-11-19
    • 2021-09-01
    • 2021-09-11
    相关资源
    最近更新 更多