从服务器加载数据后,如何在 VueJS 中观察数据变化?
How to watch for data changes in VueJS after data is loaded from server?
加载我的 Vue 组件时,它从服务器获取一些数据并将其放入组件数据中:
data: function(){
return {
data: null,
dataChanged: false,
}
},
created: function(){
// fetch data from server
this.data = server_data
}
现在我想观察它的变化,当它发生变化时设置一个布尔值dataChanged
:
watch: {
data: function(oldVal, newVal) {
this.dataChanged = true
}
}
问题是,当数据最初在 created
中加载时,它也会触发观察程序。
如何在 初始化之后观察变化?
我试过在初始化后立即将 dataChanged
重置为 false
,但它不起作用:
created: function(){
// fetch data from server
this.data = server_data
this.dataChanged = false
}
你可以试试如果data
的值为null
则为false;
watch: {
data: function(oldVal, newVal) {
if (this.data == null) this.dataChanged = false
else this.dataChanged = true
}
}
您可以像这样在观察器中更改dataChanged
watch: {
data(newValue, oldValue) {
if(oldValue !== newValue)
this.dataChanged = true;
else
this.dataChanged = false;
}
}
据我了解你的问题:
- 问题:最初加载数据时会调用观察器函数。
- Objective:忽略初始更改(最初加载数据时),但 运行 所有后续更改。
- 解决方案:在异步操作中使用标志。
示例:
data: {
items:[],
isDoneLoading: false
},
watch: {
items(){
if(!this.isDoneLoading) return
// runs only after data is done loading.
}
},
methods: {
async loadItems(){
const { data } = await this.$http.get('/examples')
this.items = data
const setFlag = () => this.isDoneLoading = true
await setFlag()
}
},
mounted(){
this.loadItems()
}
加载我的 Vue 组件时,它从服务器获取一些数据并将其放入组件数据中:
data: function(){
return {
data: null,
dataChanged: false,
}
},
created: function(){
// fetch data from server
this.data = server_data
}
现在我想观察它的变化,当它发生变化时设置一个布尔值dataChanged
:
watch: {
data: function(oldVal, newVal) {
this.dataChanged = true
}
}
问题是,当数据最初在 created
中加载时,它也会触发观察程序。
如何在 初始化之后观察变化?
我试过在初始化后立即将 dataChanged
重置为 false
,但它不起作用:
created: function(){
// fetch data from server
this.data = server_data
this.dataChanged = false
}
你可以试试如果data
的值为null
则为false;
watch: {
data: function(oldVal, newVal) {
if (this.data == null) this.dataChanged = false
else this.dataChanged = true
}
}
您可以像这样在观察器中更改dataChanged
watch: {
data(newValue, oldValue) {
if(oldValue !== newValue)
this.dataChanged = true;
else
this.dataChanged = false;
}
}
据我了解你的问题:
- 问题:最初加载数据时会调用观察器函数。
- Objective:忽略初始更改(最初加载数据时),但 运行 所有后续更改。
- 解决方案:在异步操作中使用标志。
示例:
data: {
items:[],
isDoneLoading: false
},
watch: {
items(){
if(!this.isDoneLoading) return
// runs only after data is done loading.
}
},
methods: {
async loadItems(){
const { data } = await this.$http.get('/examples')
this.items = data
const setFlag = () => this.isDoneLoading = true
await setFlag()
}
},
mounted(){
this.loadItems()
}