需求:
一个table中嵌套另一个table,在点击外层table的‘>’时,获取嵌套table的数据,最终效果图:
遇到的问题:
table里面嵌套另一个table的方法,就是在行属性设置了type=‘expand’,也在table里面添加了@expand-change="showManageDetail"事件监听展开行事件,在监听事件里面动态获取数据赋值给里面展开的table,这里出现了,数据已经获取到,但是无法精准的同步到页面渲染,(第一次点击没有数据,第二次点击才会有数据)。
产生问题的根本原因:
vue数据的变化监听本质,是数据初始化的时候,为要监听的数据属性添加了相应的set和get方法,监听数据的变化,在上面这个问题中,你将新请求到的数据添加到原有数组时,新的属性在初始化时并没有被监听到,这就产生了数据和页面渲染不同步的问题。
解决方法:
1.获取外层table的数据时,给该table数组数据添加一个children的属性,值类型为数组,初始化为空。
responesData.map(item => {
item.managerDetail = []
})
that.tableData=responesData
2.通过expand-change来触发showManageDetail方法,获取当前id对应的子table的数据,把获取到的数据,添加到外层table数据中,这样就拿到了整个table的最终数据。
that.tableData.forEach((temp, index) => {
// 找到当前点击的行,把动态获取到的数据赋值进去
if (temp.user_id == row.user_id) {
that.tableData[index].managerDetail = respones.data;
}}
)
3.渲染页面
<el-table-column type="expand" v-if="activeIndex==3">
<template slot-scope="scope">
<div v-if="scope.row.managerDetail.length>0">
<el-table :data="scope.row.managerDetail" stripe style='width:100%' :cell-style="typeDiscoutStyle">
<el-table-column v-for="item in manageUserCol" :key="item.prop" :prop="item.prop" :label="item.label" :width="item.width" :formatter="item.formatter"></el-table-column>
</el-table>
</div>
<div class="expand-noItems" v-else>该客户经理名下暂无注册用户</div>
</template>
</el-table-column>
至此 ,问题解决了