vue组件更新数据时导致死循环
Vue component results in infinite loop when updating data
每当我尝试更新 medMins 时,该函数都会产生两次正确的结果。但是,Vue returns 和
[Vue warn]: You may have an infinite update loop in a component render function.
我尝试将 medMins 切换为计算 属性 但得到了相同的结果。我读到问题是组件呈现然后我正在更改一些组件数据,在此期间一些反应数据被更改导致它重新呈现......等等。有没有办法可以避免这种情况?我可以更新这个组件中的 medMins 还是我必须做一些其他的事情?任何帮助将不胜感激。
Vue.component('day', {
//props: ['items'] or
props: {
dayofweek: {
type: Array,
required: true
},
name:{
type: String,
default: 'Blarg'
},
},
data: function() {
return {
medMins: 0
}
},
methods: {
updateMed: function(day) {
this.medMins += Number(day.endTimeMillis/60000).toFixed()-Number(day.startTimeMillis/60000).toFixed()
}
},
template: ''+
' <div>'+
' <h1>{{name}}</h1>\n' +
' <div class = "row">\n' +
' <div class ="col" v-for="day in dayofweek">{{day.activityType}}' +
' <div v-if="`${day.activityType}` == 45" v-on="updateMed(day)"></div>' +
' </div>' +
' </div>' +
' <h1>{{medMins}}</h1>'+
' </div>',
computed: {
}
});
在Vue世界里,v-on
是一个事件监听器,但是你需要说明你需要监听什么类型的事件。
假设它是 click
事件那么
v-on:click="updateMed(day)"
希望对您有所帮助!
听起来您只想要 medMins
的计算 属性。像这样
// no need for "data" as far as I can see
computed: {
medMins () {
return this.dayofweek.reduce((medMins, { activityType, endTimeMillis, startTimeMillis }) => {
if (activityType == 45) {
medMins += Number(endTimeMillis/60000).toFixed()-Number(startTimeMillis/60000).toFixed()
}
return medMins
}, 0)
}
},
template: `
<div>
<h1>{{name}}</h1>
<div class = "row">
<div class="col" v-for="day in dayofweek">
{{day.activityType}}
</div>
</div>
<h1>{{medMins}}</h1>
</div>
`
这将为 medMins
生成一个数字,用于计算所有 45
activity 类型的总数。
每当我尝试更新 medMins 时,该函数都会产生两次正确的结果。但是,Vue returns 和
[Vue warn]: You may have an infinite update loop in a component render function.
我尝试将 medMins 切换为计算 属性 但得到了相同的结果。我读到问题是组件呈现然后我正在更改一些组件数据,在此期间一些反应数据被更改导致它重新呈现......等等。有没有办法可以避免这种情况?我可以更新这个组件中的 medMins 还是我必须做一些其他的事情?任何帮助将不胜感激。
Vue.component('day', {
//props: ['items'] or
props: {
dayofweek: {
type: Array,
required: true
},
name:{
type: String,
default: 'Blarg'
},
},
data: function() {
return {
medMins: 0
}
},
methods: {
updateMed: function(day) {
this.medMins += Number(day.endTimeMillis/60000).toFixed()-Number(day.startTimeMillis/60000).toFixed()
}
},
template: ''+
' <div>'+
' <h1>{{name}}</h1>\n' +
' <div class = "row">\n' +
' <div class ="col" v-for="day in dayofweek">{{day.activityType}}' +
' <div v-if="`${day.activityType}` == 45" v-on="updateMed(day)"></div>' +
' </div>' +
' </div>' +
' <h1>{{medMins}}</h1>'+
' </div>',
computed: {
}
});
在Vue世界里,v-on
是一个事件监听器,但是你需要说明你需要监听什么类型的事件。
假设它是 click
事件那么
v-on:click="updateMed(day)"
希望对您有所帮助!
听起来您只想要 medMins
的计算 属性。像这样
// no need for "data" as far as I can see
computed: {
medMins () {
return this.dayofweek.reduce((medMins, { activityType, endTimeMillis, startTimeMillis }) => {
if (activityType == 45) {
medMins += Number(endTimeMillis/60000).toFixed()-Number(startTimeMillis/60000).toFixed()
}
return medMins
}, 0)
}
},
template: `
<div>
<h1>{{name}}</h1>
<div class = "row">
<div class="col" v-for="day in dayofweek">
{{day.activityType}}
</div>
</div>
<h1>{{medMins}}</h1>
</div>
`
这将为 medMins
生成一个数字,用于计算所有 45
activity 类型的总数。