Ale*_*dro 7 javascript vue.js vuex
我正在使用Vue和Vuex进行集中存储管理.我在商店中有一个对象列表,它经常被setTimeout函数更新.我想让用户使用双向数据绑定表单选择和编辑它.我的问题是,只要存储中的任何数据得到更新,用户修改的选定对象也会被重新渲染.以这种方式,用户丢失了更改.
解决方案是将对象从Vuex存储克隆到本地数据对象,并将其绑定到表单以防止在编辑时进行更新.我尝试了一切可能的方法来克隆Vuex返回但没有成功的可观察对象.特别是我尝试了以下方法:
JSON.parse(JSON.stringify(obj))
Run Code Online (Sandbox Code Playgroud)
和
Object.assign({}, vueObj)
Run Code Online (Sandbox Code Playgroud)
以及来自外部库(如_和jQuery)的其他深度克隆方法.
这是我从Vuex商店获得的对象:
如果我对其进行字符串化,则解析它并分配给本地vue数据对象,只要更新Vuex中央存储,它就会更新.
这是我的代码(仅限组件,而不是Vuex商店):
<template>
<div class="">
<div v-if="localSelectedDataSource.id">
{{localSelectedDataSource.name}}
</div>
<div v-if="localSelectedDataSource.id">
<div><sui-input placeholder="Url" :value="localSelectedDataSource.url"/></div>
<div>{{localSelectedDataSource.method}}</div>
<div>{{localSelectedDataSource.pollingInterval}}</div>
</div>
<div class="datasource-list">
<div
v-bind:class="{ highlightdatasource: dataSource.view.highlighted }"
v-for="dataSource in dataSources"
v-on:mouseover="highlightDataSource(dataSource.id)"
v-on:mouseout="highlightDataSource(-1)"
v-on:click="editSelectedDataSourceLocal(dataSource.id)"
>
{{dataSource.name}} - {{dataSource.url}}
</div>
</div>
</div>
</template>
<script>
import {mapGetters} from 'vuex';
import {mapActions} from 'vuex';
export default {
name: 'DataSourceList',
data(){
return{
localSelectedDataSource: {}
}
},
computed: {
...mapGetters([
'dataSources',
'selectedDataSource'
])
},
methods: {
...mapActions([
'highlightDataSource',
'editSelectedDataSource'
]),
editSelectedDataSourceLocal: function(id){
this.editSelectedDataSource(id)
var t = JSON.parse(JSON.stringify(this.selectedDataSource))
if(this.localSelectedDataSource.id != this.selectedDataSource.id){
this.localSelectedDataSource = t
}
}
}
}
</script>
Run Code Online (Sandbox Code Playgroud)
谢谢
经过几个小时的调试,我和我的朋友发现了我的错误:
我使用了 v-bind 简写:
<div><sui-input placeholder="Url" :value="localSelectedDataSource.url"/></div>
Run Code Online (Sandbox Code Playgroud)
而不是双向绑定v-model
<div><sui-input placeholder="Url" v-model="localSelectedDataSource.url"/></div>
Run Code Online (Sandbox Code Playgroud)
因此,每次更新中央 vuex 存储时,我的组件数据绑定都会重新呈现,包括绑定到表单的本地副本。
谢谢大家,
| 归档时间: |
|
| 查看次数: |
5514 次 |
| 最近记录: |