Vuex:通过对 REST 的承诺调用处理异步操作 API
Vuex: handle async action with promise call to REST API
我将 TypeScript 与 Vue/Vuex 结合使用来创建一个玩具应用程序,其中我需要在呈现组件时从远程 API 加载项目列表。在下面的操作中,我使用库 axios
来发出 http 请求,并且我 return 它作为一个承诺:
const actions = {
getCurrentSession(context: Context) {
return axios.get("http://localhost:3000/sessions/current")
.then((res) => {
commitSharedFiles(context, res.data.shared_files);
})
.catch((e: string) => {
console.error(e);
});
}
};
// export action
export const dispatchGetSharedFiles = dispatch(actions.getCurrentSession);
// commit
export const commitSharedFiles = commit(mutations.setSharedFileList);
// mutations to the state tree
const mutations = {
setSharedFileList(state: State, sharedFiles: StoreState.DirFile[]) {
state.sharedFileList = sharedFiles;
}
};
由于操作的异步性质,我必须在从 store/state 树中检索获取的文件列表之前解决承诺:
// this is called in the mounted() life cycle method:
Store.dispatchGetSharedFiles(this.$store).then(res => {
this.sharedFiles = Store.readSharedFilesList(this.$store);
});
这个可以,但是我觉得resolve promise然后获取数据很费脑筋。有没有更好的方式在 Vuex 中使用异步操作?谢谢
使用 async/await
进行操作,使用映射的 getter
从商店检索商品(也可以映射操作)。
// store.ts
const actions = {
async FetchSharedFiles(context: Context) {
// omitted error handling for brevity
let {res} = await axios.get("http://localhost:3000/sessions/current")
commitSharedFiles(context, res.data.shared_files);
}
};
// component.ts
import { mapGetters } from 'vuex'
...
mounted () {
// again, do any necessary error handling
this.$store.dispatch('FetchSharedFiles')
},
computed: {
...mapGetters({
sharedFiles: 'namespace/getSharedFiles'
})
}
使用此模式受益于 vuex 的反应性,因此组件中的 sharedFiles
会在操作完成并提交响应数据时触发更新。您的模板可能如下所示:
<template>
<div v-for="(file, i) in sharedFiles" :key="i">
// layout for each item...
</div>
</template>
我将 TypeScript 与 Vue/Vuex 结合使用来创建一个玩具应用程序,其中我需要在呈现组件时从远程 API 加载项目列表。在下面的操作中,我使用库 axios
来发出 http 请求,并且我 return 它作为一个承诺:
const actions = {
getCurrentSession(context: Context) {
return axios.get("http://localhost:3000/sessions/current")
.then((res) => {
commitSharedFiles(context, res.data.shared_files);
})
.catch((e: string) => {
console.error(e);
});
}
};
// export action
export const dispatchGetSharedFiles = dispatch(actions.getCurrentSession);
// commit
export const commitSharedFiles = commit(mutations.setSharedFileList);
// mutations to the state tree
const mutations = {
setSharedFileList(state: State, sharedFiles: StoreState.DirFile[]) {
state.sharedFileList = sharedFiles;
}
};
由于操作的异步性质,我必须在从 store/state 树中检索获取的文件列表之前解决承诺:
// this is called in the mounted() life cycle method:
Store.dispatchGetSharedFiles(this.$store).then(res => {
this.sharedFiles = Store.readSharedFilesList(this.$store);
});
这个可以,但是我觉得resolve promise然后获取数据很费脑筋。有没有更好的方式在 Vuex 中使用异步操作?谢谢
使用 async/await
进行操作,使用映射的 getter
从商店检索商品(也可以映射操作)。
// store.ts
const actions = {
async FetchSharedFiles(context: Context) {
// omitted error handling for brevity
let {res} = await axios.get("http://localhost:3000/sessions/current")
commitSharedFiles(context, res.data.shared_files);
}
};
// component.ts
import { mapGetters } from 'vuex'
...
mounted () {
// again, do any necessary error handling
this.$store.dispatch('FetchSharedFiles')
},
computed: {
...mapGetters({
sharedFiles: 'namespace/getSharedFiles'
})
}
使用此模式受益于 vuex 的反应性,因此组件中的 sharedFiles
会在操作完成并提交响应数据时触发更新。您的模板可能如下所示:
<template>
<div v-for="(file, i) in sharedFiles" :key="i">
// layout for each item...
</div>
</template>