我有一些表格数据,通过props 与子元素们共享.现在我想克隆props 对象并使其无react .在我的例子中,我希望用户能够在不改变克隆值的情况下修改props值.克隆的值应该仅用于向用户显示编辑时的表单.下面的代码显示了这一点:

    <template>
        <div>
            <div v-if="computedFormData">
                original prop title: {{orgData.title}}

                new title:
                <input type="text" v-model="formData.title"/> 
                //changing data here will also change orgData.title
            </div>

        </div>
    </template>

    <script>
        export default {
            props: ['formData'],
            data() {
                return {
                    orgData: [],
                }
            },
            computed: {
                computedFormData: function () {
                    this.orgData = this.formData;
                    return this.orgData;
                },
            },
            methods: {
            },
        }
    </script>

我试过用Object.freeze(testData);,但没用,testData和orgData都是被动的.还请注意,使用mountedcreated属性不会呈现orgData,因此我不得不使用computed属性.

推荐答案

try 用Object.assign复制props 值.react 性不再有问题,因为新的赋值只是源的副本,而不是引用.

如果你的数据对象要复杂得多,我建议用deepmerge代替Object.assign.

Vue.component('FormData', {
  template: `
    <div>
      <div v-if="testData">
        <p>Original prop title: <strong>{{orgData.title}}</strong></p> 
        <p>Cloned prop title:</p>
        <input type="text" v-model="testData.title" />
      </div>
    </div>
  `,

  props: ['orgData'],

  data() {
    return {
      testData: Object.assign({}, this.orgData)
    }
  }
});

const vm = new Vue({
  el: '#app',

  data() {
    return {
      dummyForm: {
        title: 'Some title'
      }
    }
  }
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>

<div id="app">
  <form-data :org-data="dummyForm"></form-data>
</div>

Vue.js相关问答推荐

为什么v-show需要组件的包装元素?

用于循环数组的模板元素内的条件渲染

为什么 Vue 在将设置脚本中的计算(computed)属性渲染到模板时找不到变量

通过元素加中的正则表达式输入电话号码格式

Vuejs - 更新数组中对象的数组

Webpack 导入的模块不是函数

Vuetify 复选框:如何停止点击事件?

无法在 Vuex 中的其他操作中反跳操作

vuex: unknown getter: user

即使在客户端设置 Access-Control-Allow-Origin 或其他 Access-Control-Allow-* 标头后也出现 CORS 错误

Vuetify 2 个工具栏和 1 个导航抽屉,navigation drawer导航抽屉上方有 1 个工具栏

我可以使用react路由创建别名路由吗?

错误:Node Sass 尚不支持您当前的环境:Linux 64-bit with Unsupported runtime (88)

为什么 Vue.js 使用 VDOM?

中文而不是英文的Element UI分页

如何使用 Vue Test utils 测试输入是否聚焦?

VueJS 复选框更新

如何在 Vue.js 2 应用程序中模拟 onbeforeunload?

Vue.js 显示空格(换行符)

将它们分开时将 Django 的 csrf_token 放入 Vuejs