vue.js - vuex中getter的正确使用
问题描述
我目前正在使用 vue v2 开发一个应用程序,有些事情让我开始思考。很难找到有关良好做法的信息,所以我决定在这里问。
我有一个用于前端的 laravel api 和 vue。到现在为止,我的模型只能容纳几个对象(< 100),所以我只是将其放入状态,并使用吸气剂获得所需的东西。现在我有一个模型可以容纳超过 10000 个对象,因此将它们全部放入状态几乎不是主题。我解决这个问题的方法是通过 id 从 api 获取单个对象的操作,并在检查它是否已经存在之后将其置于状态。当我需要这个对象时,我也在使用一个吸气剂进行检查。所以我有类似的结构:
// mutation
[mutation_types.FETCH_SOMETHING](state, {something}) {
if (!this.getters.getSomethingById(something.id)) {
state.somethings.push(something)
}
}
// action
const {data} = await axios.get('~route~')
commit(mutation_types.FETCH_SOMETHING, {something: data.something})
// getter
getSomethingById: state => id => {
return state.somethings.find(something => something.id === id)
}
所以这是可行的,但我看到了两个问题。第一个是每次我需要一些东西时,我应该调用调度以将项目从 api 获取到状态,然后 getter 获取实际对象,第二个问题是在 api 调用之后进行检查,所以即使如果我在该州有这个特定的东西,我正在请求它。
一种解决这两个问题的方法,我认为只是调用 getter,它将检查该状态,如果在那里找到搜索到的 ID,它将被返回,如果没有,调度将从 api 获取它然后返回它。
我觉得我正在向不属于那里的吸气剂添加逻辑,但我想不出另一种方法来实现这一点。有什么我遗漏/做错的地方吗?
解决方案
利用 vuex 操作和承诺的异步特性。如果需要,直接在操作中检查是否存在以及 api 调用:
state: {
items: []
}
mutations: {
addItem: (state, item) => {
state.items.push(item)
}
}
actions: {
fetchItem: async (context, id) => {
let item = context.state.items.find(i => i.id === id)
if (!item) {
item = await axios.get('/example/' + id).then(response => {
context.state.commit('addItem', response.data)
return response.data
})
}
return item
}
}
推荐阅读
- java - 当我尝试在 Android 中访问 ProfileFragment 时出现 java.lang.NullPointerException
- docassemble - 将代码从问题块抽象到模块
- html - CSS 我想将图像居中在一个可链接的按钮中
- windows - 如何禁用先前使用“连接”创建的连接?
- amazon-web-services - 将公共和私有流量路由到 AWS ALB
- python - 使用 sklearn.tree 中的 DecisionTreeRegressor 时,model.predict(x.head) 真正预测的是什么?
- ruby-on-rails - 无法将 credentials.yml.enc 文件添加到 VCS
- html - 溢出换行:断词与断词:断词
- html - 在 SVG 中 - 如何在不使用 javascript 的情况下加速动画或更改其持续时间?
- vb.net - 如何跳过 DateTime 转换?