简单地说,我只想更改Vue对象的整个数据,如下所示:
vueobj.$data = newdata;
但是官方文件说它不被允许:
VM156 vue.js:597 [Vue警告]:避免替换实例根$ data。使用 而是嵌套数据属性。
(找到)
所以我尝试了另一种方法:首先通过$destroy()
销毁vueobj,然后创建一个新的vueobj以将新数据对象绑定到相同的UI元素,但之后,UI元素仍然使用旧数据。那么我怎么能解决这个问题呢?谢谢!
答案 0 :(得分:3)
这很棘手,但你可以遍历数据属性并且:
data
属性; newdata
对象的每个属性添加到data
对象。演示如下:
new Vue({
el: '#app',
data: {
name: 'Alice',
age: 30
},
methods: {
changeWholeData() {
let newdata = {name: 'Bob', age: 40};
// erase all current keys from data
Object.keys(this.$data).forEach(key => this.$data[key] = null);
// set all properties from newdata into data
Object.entries(newdata).forEach(entry => Vue.set(this.$data, entry[0], entry[1]));
}
}
})
<script src="https://unpkg.com/vue"></script>
<div id="app">
<p>Name: {{ name }}</p>
<p>Age: {{ age }}</p>
<button @click="changeWholeData">Change Whole Data</button>
</div>
答案 1 :(得分:1)
我认为你不能改变整个数据对象。再次摧毁和创造似乎也不对。但是您可以将数据1中的值更改为1。
e.g。 https://codepen.io/jacobgoh101/pen/geXgVX?editors=1010
const vueApp = new Vue({
el: '#app',
data: {
number: 1
}
});
您可以在Vue实例外执行number
来更改vueApp.number = //...
。
希望这实际上就是你所要求的。
答案 2 :(得分:1)
如前所述,您需要使用一个嵌套属性来包装要替换的数据,因此只需进行一些预先计划即可。
如果您这样创建Vue实例,
var vueobj = new Vue({
el: '#app',
data: {
dataSource: {
name: 'Alice',
age: 30
}
}
})
然后您可以像这样替换数据
vueobj.dataSource = newdata;
dataSource
包装器属性可以是任何有效的属性名称。缺点是您无法再直接在Vue
实例上访问内部属性。例如。您必须使用vueobj.dataSource.name
而不是vueobj.name
,但是我想这是Vue提供的所有其他易用性的折衷方案。您可以创建一个name
计算出来的情况来解决此问题,但是如果有很多根属性,这样做将很繁琐。
答案 3 :(得分:0)
这对我有用:
<div id="app">
{{name}}: {{age}}
</div>
const app = new Vue({
el: "#app",
data: {
name: "Alice",
age: 30
},
methods: {
refresh(data) {
Object.assign(this.$data, data); // <--
}
}
});
const newData = {
name: "Bob",
age: 22
};
app.refresh(newData);