如何使用 vuex 和 typescript 将 axios 调用移动到自己的方法中
Posted
技术标签:
【中文标题】如何使用 vuex 和 typescript 将 axios 调用移动到自己的方法中【英文标题】:How to move an axios call into its own method using vuex and typescript 【发布时间】:2022-01-06 17:50:29 【问题描述】:我在 vuex 操作中有一个方法,它调用 api 并更新用户信息。我正在尝试做的是将 axios 调用移动到它自己的方法中并且没有任何运气。
这是我的代码
async updateProfile( commit, dispatch : any, user: User):Promise<User>
console.log(user)
console.log("currentUser")
const response = await axios.request(
method: "PUT",
url: `/users/me/profile`,
data: user
);
// dispatch('updateUserProfile', user);
console.log(response)
console.log("response")
return user;
// return response;
,
async updateUserProfile(user: any): Promise<User>
return await axios.request(
method: "PUT",
url: `/users/me/profile`,
data: user
);
,
注释掉的行dispatch正在尝试调用axios方法并将用户作为参数传递。当我尝试该行而不是 axios.request 时,我收到 400 错误。当我将用户:任何更改为用户:用户时,我得到一个属性“操作”的类型不兼容。错误
【问题讨论】:
你检查过你的 API 看看有什么问题吗? 400 Bad Request 通常来自验证错误(例如最小/最大长度、非空等)和类似的格式错误的请求。 为什么这些 Vuex 操作中的任何一个都是?他们不提交任何突变甚至读取状态???? 【参考方案1】:您是否将 updateProfile
和 updateUserProfile
都定义为 vuex 操作?如果是这样,后者看起来根本不像一个动作。所有动作的第一个参数是 context。
只需让它成为一个独立的功能,与您的商店完全分开
// could even be in another file / module entirely
const updateUserProfile = (user: User) =>
axios.put<User>("/users/me/profile", user)
从一个动作中,你可以直接调用它
// S = state type, R = root state type
async yourAction( commit : ActionContext<S, R>, user: User): Promise<User>
const response = await updateUserProfile(user)
// here's where you would commit something
return user // or whatever
【讨论】:
虽然我认为你说 API 调用不应该是存储操作是完全正确的,但我认为你也没有说明简单的错误是什么,即错误的签名行动。 @v-moe 我特别提到了“所有动作的第一个参数是上下文” 很公平。 “上下文”毕竟应该是 JS 开发者熟知的概念。请忘记我的评论【参考方案2】:您的网址不同。一个有前导斜线,另一个没有。你的第二个动作应该有 作为第一个参数。应该是
async updateUserProfile(, user: any)
。这可能解释了为什么您会收到 400。您的请求负载可能是空的,不是吗?
【讨论】:
谢谢,但没有解决问题 请看我的编辑以上是关于如何使用 vuex 和 typescript 将 axios 调用移动到自己的方法中的主要内容,如果未能解决你的问题,请参考以下文章
Typescript Vuex - 如何使用 setter 和 getter 定义状态?
在 Vue 3 中使用 Vuex 4 模块和 TypeScript,以及如何修复循环依赖 linting 错误?
使用 Vuex mapGetters 时如何修复 TypeScript 错误?
使用 vuex 时如何在 typescript 语法中使用 mapState 函数?