为什么在 vue 2 中挂载后数据发生变化?
Why data changed after mounted in vue 2?
<template>
<div>
{{testData.first}}
<!-- The screen shows the value set by mounted. -->
</div>
</template>
<javascript>
export default {
data(){
return {
testData: {}
}
},
mounted(){
this.testData.first = 'hello';
}
}
</javascript>
我了解到在'vue'的生命周期调用mounted时,data已经定义好了。
我没有定义 testData 的属性。
我最初没有在调用mounted时设置testData的属性,所以我认为必须是空值时可见屏幕。当然,我已经知道 testData 不是反应性数据。
请解释为什么会出现这种现象。
可能是我没看懂Vue
Of course, I've already known testData isn't reactivity data.
testData
是反应式的,因为它是你声明的。但是 testData.first
不是,因为它 NOT 你声明的。所以你告诉 Vue testData
是一个反应式 object,但是你改变了一个 non-existent 属性,它是一个完全不同的故事。
因此,如果您将其声明为反应式 object,则必须给它一个 object,这是完全合理的。否则,如果你想给它一个 属性,你必须告诉 Vue。这可以在 Vue $set.
的帮助下完成
const app = new Vue({
el: "#app",
data() {
return {
testData: {}
}
},
template: `<div>{{testData.first}}</div>`,
mounted() {
this.testData = {
'first': 'hello'
};
//this.$set(this.testData, 'first', 'hello'); //either will work
}
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>
<div id="app">
</div>
这是使用古老的 VueJS 2 带来的不便。VueJS 3 已经删除了 $set
(doc) 并解决了这个问题。所以我对你的代码在 Vue 3 上运行良好抱有很高的期望
<template>
<div>
{{testData.first}}
<!-- The screen shows the value set by mounted. -->
</div>
</template>
<javascript>
export default {
data(){
return {
testData: {}
}
},
mounted(){
this.testData.first = 'hello';
}
}
</javascript>
我了解到在'vue'的生命周期调用mounted时,data已经定义好了。 我没有定义 testData 的属性。 我最初没有在调用mounted时设置testData的属性,所以我认为必须是空值时可见屏幕。当然,我已经知道 testData 不是反应性数据。 请解释为什么会出现这种现象。 可能是我没看懂Vue
Of course, I've already known testData isn't reactivity data.
testData
是反应式的,因为它是你声明的。但是 testData.first
不是,因为它 NOT 你声明的。所以你告诉 Vue testData
是一个反应式 object,但是你改变了一个 non-existent 属性,它是一个完全不同的故事。
因此,如果您将其声明为反应式 object,则必须给它一个 object,这是完全合理的。否则,如果你想给它一个 属性,你必须告诉 Vue。这可以在 Vue $set.
的帮助下完成const app = new Vue({
el: "#app",
data() {
return {
testData: {}
}
},
template: `<div>{{testData.first}}</div>`,
mounted() {
this.testData = {
'first': 'hello'
};
//this.$set(this.testData, 'first', 'hello'); //either will work
}
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>
<div id="app">
</div>
这是使用古老的 VueJS 2 带来的不便。VueJS 3 已经删除了 $set
(doc) 并解决了这个问题。所以我对你的代码在 Vue 3 上运行良好抱有很高的期望