众所周知啊,element ui是我们做后台系统经常用的组件库。最近遇到了一个bug记录一下。
在tab标签下,如果第一个表格table有expands属性,再点击tab切换到第二个tab时,第二个tab下面的表格也会自带expands属性。如图可以发现第二个tab下的表格日期属性下出现渲染错误。
实例代码如下:
<template>
<div class="test-index">
<el-tabs v-model="activeName" @tab-click="handleClick">
<el-tab-pane label="用户管理" name="first" />
<el-tab-pane label="配置管理" name="second" />
</el-tabs>
<el-table
v-if="activeName==='first'"
:data="tableData"
style="width: 100%"
>
<el-table-column type="expand">
<template slot-scope="props">
<el-form label-position="left" inline class="demo-table-expand">
<el-form-item label="商品名称">
<span>{{ props.row.name }}</span>
</el-form-item>
<el-form-item label="所属店铺">
<span>{{ props.row.shop }}</span>
</el-form-item>
<el-form-item label="商品 ID">
<span>{{ props.row.id }}</span>
</el-form-item>
<el-form-item label="店铺 ID">
<span>{{ props.row.shopId }}</span>
</el-form-item>
<el-form-item label="商品分类">
<span>{{ props.row.category }}</span>
</el-form-item>
<el-form-item label="店铺地址">
<span>{{ props.row.address }}</span>
</el-form-item>
<el-form-item label="商品描述">
<span>{{ props.row.desc }}</span>
</el-form-item>
</el-form>
</template>
</el-table-column>
<el-table-column
label="商品 ID"
prop="id"
/>
<el-table-column
label="商品名称"
prop="name"
/>
<el-table-column
label="描述"
prop="desc"
/>
</el-table>
<el-table
v-if="activeName === 'second'"
:data="tableData2"
style="width: 100%"
>
<el-table-column
prop="date"
label="日期"
width="180"
/>
<el-table-column
prop="name"
label="姓名"
width="180"
/>
<el-table-column
prop="address"
label="地址"
/>
</el-table>
</div>
</template>
<script>
export default {
name: 'Index',
components: {},
data() {
return {
activeName: 'first',
tableData: [{
id: '12987122',
name: '好滋好味鸡蛋仔',
category: '江浙小吃、小吃零食',
desc: '荷兰优质淡奶,奶香浓而不腻',
address: '上海市普陀区真北路',
shop: '王小虎夫妻店',
shopId: '10333'
}, {
id: '12987123',
name: '好滋好味鸡蛋仔',
category: '江浙小吃、小吃零食',
desc: '荷兰优质淡奶,奶香浓而不腻',
address: '上海市普陀区真北路',
shop: '王小虎夫妻店',
shopId: '10333'
}, {
id: '12987125',
name: '好滋好味鸡蛋仔',
category: '江浙小吃、小吃零食',
desc: '荷兰优质淡奶,奶香浓而不腻',
address: '上海市普陀区真北路',
shop: '王小虎夫妻店',
shopId: '10333'
}, {
id: '12987126',
name: '好滋好味鸡蛋仔',
category: '江浙小吃、小吃零食',
desc: '荷兰优质淡奶,奶香浓而不腻',
address: '上海市普陀区真北路',
shop: '王小虎夫妻店',
shopId: '10333'
}],
tableData2: [{
date: '2016-05-02',
name: '王小虎',
address: '上海市普陀区金沙江路 1518 弄'
}, {
date: '2016-05-04',
name: '王小虎',
address: '上海市普陀区金沙江路 1517 弄'
}, {
date: '2016-05-01',
name: '王小虎',
address: '上海市普陀区金沙江路 1519 弄'
}, {
date: '2016-05-03',
name: '王小虎',
address: '上海市普陀区金沙江路 1516 弄'
}]
}
},
methods: {
handleClick(tab, event) {
console.log(tab, event)
}
}
}
</script>
<style scoped lang='less'>
.test-index {
padding:20px;
}
</style>
代码可以看到我用的是v-if判断,按理说应该会销毁重建。可是从结果来说并没有销毁重建。于是我看了看官网对v-if介绍。发现了这一条。
如果两个模板使用了相同的元素那么就会复用。正是这个原因导致了expands属性被复用。那么解决办法也出来了。
1.使用v-show。元素会被分别渲染只是使用v-show来进行显示和隐藏
2.使用key来作为唯一标识,这样元素就不会被复用
我使用了v-show后,果然bug被解决了。 以上