javascript - Vue、Vuex 和远程存储
问题描述
好吧,在远程存储中有一些价值(比如说x
)b-form-checkbox
,应该控制这个值。我想通知用户存储的值是否实际发生变化以及发生的时间。
所以基本上我想要:
当用户选中/取消选中
b-form-checkbox
我想更改的状态时b-form-checkbox
,向远程存储发送异步请求并显示一些b-spinner
以指示状态实际上尚未更改。当我收到来自远程存储的答复时:
- 如果更改成功,请隐藏
b-spinner
。 - 如果更改不成功(超时、服务器错误等)我想更改
b-form-checkbox
状态(因为存储中的值实际上没有改变)并隐藏b-spinner
- 如果更改成功,请隐藏
使用 Vue + Vuex 做 int 的最愚蠢的方法是什么?目前我正在这样做:
xChanger.vue
:
<template>
<b-form-checkbox v-model="xComp" switch>
{{xComp ? 'On' : 'Off'}}
<b-spinner v-if="!xSynced"/>
</b-form-checkbox>
</template>
<script>
import { mapState, mapActions, mapGetters } from 'vuex';
export default {
name: 'XChanger',
computed: {
...mapState(['x']),
...mapGetters(['xSynced']),
xComp: {
get() { return x.local },
set(value) {
if (value != this.x.local) {
this.setX(value)
}
},
},
},
methods: {
...mapActions(['setX']),
},
}
</script>
main.js
import Vuex from 'vuex'
import Axios from 'axios'
const store = new Vuex.Store({
state: {
x: {
remote: null,
local: null
},
getters: {
xSynced(state) {
state.x.local === state.x.remote
}
},
actions: {
async setX(store, value) {
store.state.x.local = value
try {
let response = await Axios.post('http://blah.blah/setX', {x: value});
if (response.status == 200) {
store.state.x.remote = value
}
} catch (error) {
store.state.x.local = !value
}
}
},
mutations: {
setX(state, value) {
state.x.local = value
state.x.remote = value
}
}
},
})
但是对于仅控制一个值(尤其是计算属性xComp
)来说太冗长了。我相信这样一个简单的模板应该已经解决了,并且有更简单的实现方式。
解决方案
这是一个例子:
<template>
<b-form-checkbox v-model="x.local" switch>
{{x.local ? 'On' : 'Off'}}
<b-spinner v-if="saving"/>
</b-form-checkbox>
</template>
<script>
export default
{
name: 'XChanger',
data: () => ({
x:
{
local: false,
remote: false,
},
saving: false,
}),
watch:
{
'x.local'(newValue, oldValue)
{
if (newValue !== oldValue && newValue !== this.x.remote)
{
this.updateRemote(newValue);
}
}
}
methods:
{
async updateRemote(value)
{
try
{
this.saving = true;
const response = await Axios.post('http://blah.blah/setX', {x: value});
if (response.status == 200)
{
this.x.remote = value;
}
else
{
this.x.local = this.x.remote;
}
}
catch (error)
{
this.x.local = this.x.remote;
}
this.saving = false;
}
},
}
</script>
推荐阅读
- node.js - 如何删除抽搐消息?没有超时的单条消息。[tmi.js]
- r - 如何比较 R 中不同行的技术重复项?
- c# - 使用 Autofixture、Moq 和 XUnit 的类中的部分模拟方法
- sql - 子查询返回超过 1 个值。当子查询跟随...或子查询用作表达式时,这是不允许的
- bamboo - Bamboo 部署项目 - 你可以从其他项目中调用项目吗?
- apache-spark - 优化 Spark 作业 - Spark 2.1
- css - Jquery UI 无法拖动选择
- stream - 没有定义事件到达时间窗口时的事件合并
- git - 调用“git revert”后了解 Git 冲突标记
- r - 如何矢量化函数以在 data.table 分配中工作