#javascript #reactjs #redux #redux-toolkit
#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)
},
)
но когда я называю это так
dispatch(
submitPaymentToServer({
name,
data,
}),
)
typescript жалуется, что у меня нет нужного количества аргументов. итак, как я предполагаю передать аргументы этой функции? или как это сделать с помощью toolkit?
Ответ №1:
Это то, что говорит 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)
},
)
У вас может быть только один аргумент:
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)
},
)
Разрушьте свой объект внутри thunk
вызова.
Ссылка: здесь
Комментарии:
1. Это неверно. Деструктурированный объект в параметрах по-прежнему является всего лишь одним объектом / параметром. Не имеет значения, делаете ли вы это в () или в теле одно и то же логически. createAsyncThunk принимает только один параметр, но его не волнует ваша деструктуризация.
2. вау, для этого нужно просмотреть документы … спасибо
3. Это то же самое, деструктурирование объектов чтения…
Ответ №2:
На самом деле вам нужно присвоить этим аргументам тип:
export const submitPaymentToServer = createAsyncThunk(
'data/fetchAll',
async ({ name, data }: { name: string, data: MyDataType }) => {
return fetch('/payments', {
Если вы используете JavaScript с TypeScript только в IDE, вы можете добавить для этого docblock:
const thunk2 = createAsyncThunk(
'data/fetchAll',
/** @param arg {{ name: string, data: MyDataType }} */
(arg) => {
return fetch('/payments', {
Комментарии:
1. но эта функция была файлом js ha. Я все еще не понимаю, почему он жаловался? он не жаловался на типы аргументов, он жаловался на количество аргументов, что было странно
2. Ну, обычно количество аргументов зависит от типов, резервным типом является TypeScript
void
, что означает «без аргументов». Но это не должно происходить с чистым JavaScript. Какую среду IDE вы используете?
Ответ №3:
Я нашел это в документации TypeScript Redux
const fetchUserById = createAsyncThunk<
// Return type of the payload creator
MyData,
// First argument to the payload creator
number
>('users/fetchById', async (userId, thunkApi) => {
const response = await fetch(`https://reqres.in/api/users/${userId}`, {
headers: {
Authorization: `Bearer ${thunkApi.extra.jwt}`,
},
})
return (await response.json()) as MyData
})
Аргумент, переданный в createAsyncThunk userId
, — это тот, который я определил с помощью type number
.
Ответ №4:
Если вы используете typescript, подумайте о добавлении createAsyncThunk()
типов в соответствии с документами. чтобы увидеть, работает ли это для вас, добавьте:
createAsyncThunk
<any, any, any>(...)
и не забывайте использовать правильную типизацию на основе:
https://redux-toolkit.js.org/api/createAsyncThunk