如何在 redux 工具包中将参数传递给 createAsyncThunk?

Red*_*ron 35 javascript reactjs redux redux-toolkit

所以我是 redux-toolkit 的新手,我想做一些非常简单的事情。我想通过这个辅助函数在 POST 请求上发送一些数据。所以我尝试了这个

export const submitPaymentToServer = createAsyncThunk(
    'data/fetchAll',
    async ({ name, data }) => {
        return fetch('/payments', {
            method: 'POST',
            headers: { 'Content-Type': 'application/json' },
            body: JSON.stringify({
                name,
                data,
            }),
        })
            .then((res) => res.json())
            .then((res) => res)
    },
)
Run Code Online (Sandbox Code Playgroud)

但当我这样称呼它时

    dispatch(
        submitPaymentToServer({
            name,
            data,
        }),
    )
Run Code Online (Sandbox Code Playgroud)

typescript 抱怨说我没有正确数量的参数。那么我该如何将参数传递给这个函数呢?或者使用工具包执行此操作的方法是什么?

Shi*_*iqi 45

这就是 React-Redux 在使用时所说的createAsyncThunk

当您调度 thunk 时,您只能将一个参数传递给它。如果需要传递多个值,请将它们传递到单个对象中

所以而不是

export const submitPaymentToServer = createAsyncThunk(
    'data/fetchAll',
    async ({ name, data }) => { // here you have two arguments
        return fetch('/payments', {
            method: 'POST',
            headers: { 'Content-Type': 'application/json' },
            body: JSON.stringify({
                name,
                data,
            }),
        })
            .then((res) => res.json())
            .then((res) => res)
    },
)
Run Code Online (Sandbox Code Playgroud)

你只能有一个论点:

export const submitPaymentToServer = createAsyncThunk(
    'data/fetchAll',
    async (yourData) => {
        const {name, data} = yourData;
        return fetch('/payments', {
            method: 'POST',
            headers: { 'Content-Type': 'application/json' },
            body: JSON.stringify({
                name,
                data,
            }),
        })
            .then((res) => res.json())
            .then((res) => res)
    },
)
Run Code Online (Sandbox Code Playgroud)

在调用中解构您的对象thunk

参考:这里

  • 这是不正确的。参数中的解构对象仍然只是一个对象/参数。如果您在 () 中或在正文中执行相同的操作,逻辑上并不重要。createAsyncThunk 只接受一个参数,但它不关心你的解构。 (15认同)

phr*_*hry 19

您实际上需要为这些参数指定一个类型:

export const submitPaymentToServer = createAsyncThunk(
    'data/fetchAll',
     async ({ name, data }: { name: string, data: MyDataType }) => {
        return fetch('/payments', {
Run Code Online (Sandbox Code Playgroud)

如果您仅在 IDE 中使用 JavaScript 和 TypeScript,则可以为此添加一个文档块:

export const submitPaymentToServer = createAsyncThunk(
    'data/fetchAll',
     async ({ name, data }: { name: string, data: MyDataType }) => {
        return fetch('/payments', {
Run Code Online (Sandbox Code Playgroud)