Javascript 对象的深层复制在 Vue.js 中未按预期工作
Deep copy of a Javascript object is not working as expected in Vue.js
我正在使用 props
将对象的克隆从父组件传递到子组件,但是当我更改对象中 status
属性 的值时父组件 子组件得到通知并在 "cloned" 对象中更改 status
属性 的值。
我读过 Object.assign()
方法,它只进行浅层复制,但奇怪的是我的对象属性是原始类型 String 意味着它们应该按值而不是按引用复制,我什至尝试手动分配值并尝试了 JSON 方法,如下所示,但没有像我预期的那样工作。
父组件:AppServers
<template>
<div>
<AppServerStatus v-for="server in servers" :serverObj="JSON.parse(JSON.stringify(server))">
</AppServerStatus>
<hr>
<button @click="changeStatus()">Change server 2</button>
</div>
</template>
<script>
import AppServerStatus from './AppServerStatus';
export default {
name: "AppServers",
components: {
AppServerStatus
},
data() {
return {
servers: [
{
name: 'server1',
status: 'Critical'
},
{
name: 'server2',
status: 'Normal'
},
{
name: 'server3',
status: 'abnormal'
},
{
name: 'server4',
status: 'idle'
},
{
name: 'server5',
status: 'Good'
},
],
serverTmp: {}
}
},
methods: {
changeStatus(){
this.servers[1].status = 'Active';
}
}
}
</script>
子组件:AppServerStatus
<template>
<div>
<h3>Server Name: {{ serverObj.name }}</h3>
<p>Server Status: {{ serverObj.status }}</p>
<hr>
</div>
</template>
<script>
export default {
name: "AppServerStatus",
data() {
return {
status: 'Critical'
}
},
props: [
'serverObj'
]
}
</script>
我希望子组件对象中的 status
属性 的值在我执行 changeStatus()
时保持 Normal父组件,但它也发生了变化。
根据 created
或 mounted
上的 serverObj
属性创建一个新对象,以防止不必要的反应。
<template>
<div>
<h3>Server Name: {{ server.name }}</h3>
<p>Server Status: {{ server.status }}</p>
<hr>
</div>
</template>
<script>
export default {
name: 'AppServerStatus',
data() {
return {
status: 'Critical',
server: {
name: '',
status: ''
}
}
},
props: [
'serverObj'
],
mounted() {
this.server = {
name: this.serverObj.name,
status: this.serverObj.status
};
}
}
</script>
我正在使用 props
将对象的克隆从父组件传递到子组件,但是当我更改对象中 status
属性 的值时父组件 子组件得到通知并在 "cloned" 对象中更改 status
属性 的值。
我读过 Object.assign()
方法,它只进行浅层复制,但奇怪的是我的对象属性是原始类型 String 意味着它们应该按值而不是按引用复制,我什至尝试手动分配值并尝试了 JSON 方法,如下所示,但没有像我预期的那样工作。
父组件:AppServers
<template>
<div>
<AppServerStatus v-for="server in servers" :serverObj="JSON.parse(JSON.stringify(server))">
</AppServerStatus>
<hr>
<button @click="changeStatus()">Change server 2</button>
</div>
</template>
<script>
import AppServerStatus from './AppServerStatus';
export default {
name: "AppServers",
components: {
AppServerStatus
},
data() {
return {
servers: [
{
name: 'server1',
status: 'Critical'
},
{
name: 'server2',
status: 'Normal'
},
{
name: 'server3',
status: 'abnormal'
},
{
name: 'server4',
status: 'idle'
},
{
name: 'server5',
status: 'Good'
},
],
serverTmp: {}
}
},
methods: {
changeStatus(){
this.servers[1].status = 'Active';
}
}
}
</script>
子组件:AppServerStatus
<template>
<div>
<h3>Server Name: {{ serverObj.name }}</h3>
<p>Server Status: {{ serverObj.status }}</p>
<hr>
</div>
</template>
<script>
export default {
name: "AppServerStatus",
data() {
return {
status: 'Critical'
}
},
props: [
'serverObj'
]
}
</script>
我希望子组件对象中的 status
属性 的值在我执行 changeStatus()
时保持 Normal父组件,但它也发生了变化。
根据 created
或 mounted
上的 serverObj
属性创建一个新对象,以防止不必要的反应。
<template>
<div>
<h3>Server Name: {{ server.name }}</h3>
<p>Server Status: {{ server.status }}</p>
<hr>
</div>
</template>
<script>
export default {
name: 'AppServerStatus',
data() {
return {
status: 'Critical',
server: {
name: '',
status: ''
}
}
},
props: [
'serverObj'
],
mounted() {
this.server = {
name: this.serverObj.name,
status: this.serverObj.status
};
}
}
</script>