【发布时间】:2018-04-25 20:44:42
【问题描述】:
我有一张桌子的复杂对象。看起来像这样:
{
1510002000: {
date: "07.11.17"
hours: {
1510002000:{
activity:{
activity: "Тест",
color: "#00ff00",
end_at: 1510005600,
start_at: 1510002000,
type_id: 1
}
},
1510005600: {
...
},
...
}
},
....
}
这是使用此对象的模板代码:
<tr v-for="date in this.tds">
<td>{{ date.date }}</td>
<td is="hour-td"
v-for="hour in date.hours"
:color="hour.activity.color"
:start_at="hour.activity.start_at"
:end_at="hour.activity.end_at"
:activity="hour.activity.activity"
:type_id="hour.activity.type_id"
>
</td>
</tr>
我将它评估为一个计算属性,但是当父组件提供数据异步时我需要重新渲染表,所以我有一个 prop 的观察者(prop 称为“活动”):
watch: {
activities: function(){
var vm = this;
let dth = new DateTimeHelper;
if (this.activities.length > 0){
this.activities.forEach(function(activity){
let dateTimestamp = dth.getDateTimestampFromTimestamp(activity.start_at); // just getting the key
if (vm.tds[dateTimestamp]){
if (vm.tds[dateTimestamp].hours[activity.start_at]){
vm.tds[dateTimestamp].hours[activity.start_at].activity.activity = activity.activity;
vm.tds[dateTimestamp].hours[activity.start_at].activity.color = activity.color;
vm.tds[dateTimestamp].hours[activity.start_at].activity.type_id = activity.type_id;
}
}
});
}
console.log(vm.tds) // here I can see that the object is filled with new data
}
},
问题是表格没有重新渲染。更准确地说,组件“hour-td”不包含新数据。
我也尝试过使用 Vue.set,但没有成功
你能帮我更新表格吗?我花了大约 5 个小时进行重构和尝试。
提前致谢
解决方案
就我而言,可以有两种状态:有活动,没有活动。所以我为每种情况制作了两个计算道具并分别渲染它们并通过 v-if="activities.length"
【问题讨论】:
-
仅从您发布的代码中很难了解全局,但我之前使用过日期和计算属性,Vue 不会将
Date更改为更新。计算的属性被缓存,并且只有在它们的依赖项更新时才会更新,所以这可能是你的hour-td组件不工作的原因。我要尝试的第一件事是根据计算属性中的时间戳创建一个new Date()。 -
是的,你说得对缓存。但问题不是日期(它总是在时间戳中,所以我像处理数字一样工作,它们也来自服务器)而不是缓存(我使用观察者,重写缓存)。在这里你可以找到组件的完整代码github.com/Vasek18/my-hours.ru/blob/master/resources/assets/js/…
标签: vue.js vuejs2 javascript-objects vue-component computed-properties