vue.js - 在哪里使用 API 数据更新 Vuex 状态
问题描述
这个问题更像是一个代码组织问题。我是整个前端的新手。我启动了一个由 VueJS + Vuex + VuerRouter + Vuetify + TypeScript 驱动的简单应用程序。这是src
文件夹的视图:
├── App.vue
├── assets
│ └── ...
├── components
│ └── ...
├── plugins
│ └── ...
├── router
│ └── ...
├── services
│ └── StuffAPI.ts
├── store
│ ├── index.ts
│ └── modules
│ └── stuff.ts
└── views
└── Stuff.vue
App.vue
我预取了on所需的大部分数据mounted()
:
export default class extends Vue {
listStuffs() {
StuffAPI.list()
.then((stuffs: Stuff[]) => {
this.$store.dispatch("stuff/changeStuffs", stuffs);
})
.catch(e => {
// ...
});
}
mounted() {
this.listStuffs();
}
}
</script>
但是,在某些情况下,组件会更改服务器端的数据(例如,通过创建资源)。现在我需要再次从服务器获取数据。但是,我不想在listStuffs
整个代码库中复制该方法。我该如何解决?我不能从子组件调用父方法。我应该使用自定义事件吗?或者拥有一个获取数据的 Vuex 操作是否完全没问题?
解决方案
首先,您可以在 VueJS 中使用“混合”。Mixins 是一项允许您在整个应用程序组件中使用相同功能的功能。
其次,你可以使用 Vuex。
- 创建商店。(例如:CustomAPI.js)
- 在文件中写入 Getter、Mutations 和 Actions
- 调用组件中的操作(例如:this.$store.dispatch('StuffAPI').then()
- 不断改变存储中的 StuffAPI 结果
- 使用 Getters 获取变异数据
作为参考,请检查以下代码:
import * as types from '../types'
// Import axios or any http client
export const state = {
isLoggedIn: false
}
export const getters = {
isLoggedIn: state => state.isLoggedIn
}
export const mutations = {
[types.MUTATE_LOGIN_FLAG]: (state, isLoggedIn) => {
state.isLoggedIn = isLoggedIn
}
}
export const actions = {
AUTH_LOGIN: ({ commit }, payload) => {
return new Promise((resolve, reject) => {
// MY HTTP LOGIN REQUEST CODE HERE
// On result..
commit(types.MUTATE_LOGIN_FLAG, true)
})
},
AUTH_LOGOUT: ({ commit }, payload) => {
return new Promise((resolve, reject) => {
// MY HTTP LOGOUT REQUEST CODE HERE
// ... On result,
commit(types.MUTATE_LOGIN_FLAG, false)
})
}
}
现在,每当我需要某个组件的登录状态时,我都会使用:
this.$store.getters.isLoggedIn
这将返回 True 或 False。
每当我需要登录或注销时,我都会使用:
this.$store.dispatch('AUTH_LOGIN')
我可以在我的应用程序的任何地方调用这些操作。
注意:这只是一个示例实现。您并没有真正在商店中写登录注销:D
推荐阅读
- apache-spark - Pyspark:如何控制作业在哪些节点上运行?
- angular - 使动态加载的值在 Angular 库中可用
- c - mmap-ed 区域是“单个对象”吗?我可以比较其中的指针吗?
- javascript - 首次调用服务 url 时,Promise 总是返回空白响应
- android - 如何分离电视和手机/平板电脑的 Android 布局?
- python - 当只有一个文件可用时循环使用 concat 函数
- php - 当我向服务器发送 DELETE 请求时,我从服务器收到“Forbidden 403 error”
- c# - C# 解析为 yyyy-MM-ddTHH:mm:ss 格式字符串未被识别为有效的 DateTime
- performance - 如何在 Haskell 中高效地写入大文件
- python - 使用 Python 3.x 添加特定大小的列