用于本地编辑的Vuex克隆对象

时间:2018-01-17 02:11:51

标签: javascript vue.js vuex

我使用Vue和Vuex进行集中存储管理。 我在商店中有一个对象列表,它经常被setTimeout函数更新。我想让用户使用双向数据绑定表单选择和编辑它。我的问题是,每当商店中的任何数据得到更新时,用户正在修改的所选对象也会被重新呈现。这样用户就会失去更改。

解决方案是将对象从Vuex存储克隆到本地数据对象并将其绑定到表单以防止在编辑时进行更新。我尝试了一切可能的方法来克隆Vuex返回但没有成功的可观察对象。 特别是我尝试了以下方法:

JSON.parse(JSON.stringify(obj))

Object.assign({}, vueObj)

以及来自外部库的其他深度克隆方法,如_和jQuery。

这是我从Vuex商店获得的对象:

enter image description here

如果我对其进行字符串化,则解析它并分配给本地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>

谢谢

3 个答案:

答案 0 :(得分:3)

经过几个小时的调试,我和我的朋友发现了我的错误:

我使用v-bind速记

<div><sui-input placeholder="Url" :value="localSelectedDataSource.url"/></div>

而不是双向绑定 v-model

<div><sui-input placeholder="Url" v-model="localSelectedDataSource.url"/></div>

因此每次更新中央vuex存储时,我的组件数据绑定都会重新呈现,包括绑定到表单的本地副本。

感谢大家,

答案 1 :(得分:1)

如果要使用v-model,则应使用计算属性。您将创建一个计算属性,该属性返回商店中的值,而不是使用v模型中的计算属性。 顺便说一句,v-model是语法糖:

:value="someData" @input="someData=$event.target.value"
它可能适用于:value,因为@input不存在。

答案 2 :(得分:-1)

经过大量搜索,此链接对我有帮助:How can I clone data from Vuex state to local data?基本上使用:query方法,然后根据需要进行编辑:)