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

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)

谢谢

Ale*_*dro 3

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

我使用了 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 存储时,我的组件数据绑定都会重新呈现,包括绑定到表单的本地副本。

谢谢大家,