我正在使用Vue和Vuex进行中央存储管理.

解决方案是将对象从Vuex存储区克隆到本地数据对象,并将其绑定到表单,以防止在编辑时进行更新.我try 了所有可能的方法来克隆Vuex返回的可观察对象,但没有成功.

JSON.parse(JSON.stringify(obj))

Object.assign({}, vueObj)

和 also other deep cloning methods from external libraries like _ 和 jQuery.

这是我从Vuexstore 获得的对象:

enter image description here

If i stringify it, parse it 和 assign to a local vue data object it gets updated whenever the Vuex central storage is updated.

以下是我的代码(仅限组件,而非Vuexstore ):

    <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>

非常感谢.

推荐答案

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

我用v-bind速记:

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

而不是双向绑定v-model

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

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

谢谢大家,

Vue.js相关问答推荐

使用项目和字段,列跨度为 2 的 Bootstrap-vue 表

为什么 Pinia/Vuex 比使用服务类的classic 方法更受欢迎?

在 v-for 中定义变量有什么问题吗?

Nuxt 2.15.7 的构建错误 - 无法解析 CSS @font-face URL

如何使用 vue 或 javascript 向服务器发送密码?

Vuex store 在 Nuxt 的什么地方

指定一个 vue-cli vue.config.js 位置

如何使用 Vue 命名插槽呈现静态内容列表?

如何只查看数组中的一个对象?

vuex 中 { dispatch, commit } 的类型是什么?

如何从 vue.js 中的自定义组件中冒泡点击事件?

如何在生产模式下为 chrome 扩展启用 Vue devtools?

[Vue 警告]:无效的props:propsscrollThreshold的类型判断失败.期望的数字,得到字符串

交换数组项

加载时焦点文本框上的 Vue.js

构建 Vue.js 应用程序时 JavaScript 堆内存不足

如何在 NuxtJS 中设置全局 $axios 标头

Vuetify RTL 风格

Vue Router beforeRouteLeave 不会停止子组件

如何在 VeeValidate 中自定义错误信息(字段名称)?