1、父组件
HTML
<a-modal
v-model="showDetail"
:title="detailTitle"
@ok="handleDetailOk"
:width="1200"
>
<detail
ref="detail"
:detailData="detailData"
:pointTotal="pointTotal"
>
</detail>
</a-modal>
JS
// 点击详情
async handleDetail(item) {
this.pointTotal = 0
let data = {...item}
this.detailTitle = data.years + '详情'
this.showDetail = true
let res = await this.$http(this.$url.DEVICE_MANAGE_DETAIL, 'get', {
years: data.years
})
if(res.data.code === 0) {
this.detailData = res.data.data
this.detailData.forEach(item => {
this.pointTotal += (item.shouldNum - item.actualNum) * 10
})
}
},
2、子组件
<template>
<div class="monthDetail">
<a-table
:columns="columns"
:dataSource="$attrs.detailData"
rowKey="id"
:pagination="false"
>
<template slot="changeNum" slot-scope="text">
<span>0</span>
</template>
<template slot="monthPoint" slot-scope="record">
{{ (record.shouldNum - record.actualNum) * 10 }}
</template>
</a-table>
<div class="pointBox">
<span>总分: {{$attrs.pointTotal}}</span>
</div>
</div>
</template>
3、问题:点击详情,弹窗出现,数据后面才渲染上去,肉眼可见的数据变动
4、解决1:弹窗先显示,再请求(效果一般,不推荐)
父组件
JS
// 点击详情
async handleDetail(item) {
this.pointTotal = 0
let data = {...item}
this.detailTitle = data.years + '详情'
this.showDetail = await true
let res = await this.$http(this.$url.DEVICE_MANAGE_DETAIL, 'get', {
years: data.years
})
if(res.data.code === 0) {
this.detailData = res.data.data
this.detailData.forEach(item => {
this.pointTotal += (item.shouldNum - item.actualNum) * 10
})
}
},
5、解决2:在子组件里请求数据渲染,不通过$attrs传值(推荐)
6、拓展:如果不追求完美,并没啥影响,一些隐藏的数据比如下拉框数据,用$attrs传值还是很香的!(建议在没有数据频繁变化时使用)
男人最基本的原则:不动手打女性!