【发布时间】:2017-09-17 08:36:34
【问题描述】:
我目前正在用 VueJS(尤其是 Vuex)编写一个应用程序。但是,我的问题与这个库没有密切的联系,而是与 Flux/redux/Vuex 之类的商店所具有的架构有关。
简单地说,我有几个 API(每个团队一个 API/数据库),对于每个团队/API,我有几个用户。这些团队和用户由简单的对象表示,每个都有自己的 slug。重要提示:团队的 slug 当然是独一无二的,但 slug 用户对于他们自己的团队来说是独一无二的。用户的唯一性约束将是“teamSlug/userSlug”。并且鉴于用户数量众多,我无法简单地加载所有团队的所有用户。
我的问题是如何正确构建我的应用程序/存储以恢复给定用户 slug 的数据(与他的团队):如果我尚未加载此用户,请发出 API 请求以检索它。目前,我创建了一个返回用户对象的 getter,它从用户和团队那里获取 slug。如果它返回“null”或“.loading”为“false”,我必须运行“loadOne”操作来检索它:
import * as types from '../../mutation-types'
import users from '../../../api/users'
// initial state
const state = {
users: {}
}
// getters
const getters = {
getOne: state => (team, slug) => (state.users[team] || {})[slug] || null
}
// actions
const actions = {
loadOne ({ commit, state }, { team, slug }) {
commit(types.TEAM_USER_REQUEST, { team, slug })
users.getOne(team, slug)
.then(data => commit(types.TEAM_USER_SUCCESS, { team, slug, data }))
.catch(error => commit(types.TEAM_USER_FAILURE, { team, slug, error }))
}
}
// mutations
const mutations = {
[types.TEAM_USER_REQUEST] (state, { team, slug }) {
state.users = {
...state.users,
[team]: {
...(state.users[team] || {}),
[slug]: {
loading: true,
error: null,
slug
}
}
}
},
[types.TEAM_USER_SUCCESS] (state, { team, slug, data }) {
state.users = {
...state.users,
[team]: {
...(state.users[team] || {}),
[slug]: {
...data,
slug,
loading: false
}
}
}
},
[types.TEAM_USER_FAILURE] (state, { team, slug, error }) {
state.users = {
...state.users,
[team]: {
...(state.users[team] || {}),
[slug]: {
slug,
loading: false,
error
}
}
}
}
}
export default {
namespaced: true,
state,
getters,
actions,
mutations
}
您想象一个团队不仅有用户,我还有许多其他类型的模型,我应该将它们链接在一起。这种方法有效,但我觉得实施起来相当麻烦(特别是它是一个简单的get,我会有很多其他此类操作)。您对我的架构有什么建议吗?
谢谢!
【问题讨论】:
标签: javascript redux vuejs2 flux vuex