vue.js - 如何克隆道具对象并使其无反应
问题描述
我有一些表单数据,我通过道具与子组件共享。现在我想克隆道具对象并使其无反应。在我的情况下,我希望用户能够在不实际更改克隆值的情况下修改 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 都是反应式的。另请注意,使用mounted
orcreated
属性不会呈现 orgData,因此我被迫使用该computed
属性。
解决方案
尝试使用Object.assign复制道具值。反应性不再有问题,因为新的分配值只是副本而不是对源的引用。
如果您的数据对象要复杂得多,我建议使用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>
推荐阅读
- huggingface-transformers - 如何在transformer huggingface上加入命名实体识别任务产生的子词?
- multilabel-classification - vowpal wabbit:multilable_oaa 不返回所有输入的标签
- javascript - 通过连接两个对象创建的对象类型
- dart - 飞镖:如何检查属性的通用类型?
- reactjs - Axios(React)获取请求从firebase返回403,但适用于邮递员
- matlab - matlab中的参数函数绘图
- python - python请求:查找下载的csv文件元数据
- terraform - 如何使用 Keepers 导入 random_id
- javascript - 如何从服务器发送一组 json 文件?
- android - 颤动中的android版本或像素问题?