Vue Element-UI-tabs表格第一次切换“渲染闪一下”问题解决

1,225 阅读1分钟

首发:鲸讯微信小程序
作者:鲸林向海工作室

1、有问题的代码:

<template>
    <div>
        <div class="crumbs">
            <el-breadcrumb separator="/">
                <el-breadcrumb-item><i class="el-icon-message"></i> 任务中心</el-breadcrumb-item>
            </el-breadcrumb>
        </div>
        <div class="container">
            <el-tabs v-model="message">
                <el-tab-pane :label="`待办任务(${unreadTask.length})`" name="first">
                    <el-table :data="unreadTask" :show-header="false" style="width: 100%" @row-click="openDetails">
                        <el-table-column>
                            <template slot-scope="scope">
                                <span class="message-title" >{{scope.row.title}}</span>
                            </template>
                        </el-table-column>
                        <el-table-column prop="date" width="180"></el-table-column>
                    </el-table>
                    <el-pagination
                        small
                        @current-change="handleCurrentChange"
                        layout="prev, pager, next"
                        :total= 'pageNums'>
                    </el-pagination>
                </el-tab-pane>
                <el-tab-pane :label="`当前任务(${onreadTask.length})`" name="second">
                    <template>
                        <el-table :data="onreadTask" :show-header="false" style="width: 100%">
                            <el-table-column>
                                <template slot-scope="scope">
                                    <span class="message-title">{{scope.row.title}}</span>
                                </template>
                            </el-table-column>
                            <el-table-column prop="date" width="150"></el-table-column>
                        </el-table>
                        <el-pagination
                            small
                            @current-change="handleCurrentChange"
                            layout="prev, pager, next"
                            :total= 'pageNums'>
                        </el-pagination>
                    </template>
                </el-tab-pane>
                <el-tab-pane :label="`已完成任务(${finishTask.length})`" name="third">
                    <template>
                        <el-table :data="finishTask" :show-header="false" style="width: 100%">
                            <el-table-column>
                                <template slot-scope="scope">
                                    <span class="message-title">{{scope.row.title}}</span>
                                </template>
                            </el-table-column>
                            <el-table-column prop="date" width="150"></el-table-column>
                        </el-table>
                        <el-pagination
                            small
                            @current-change="handleCurrentChange"
                            layout="prev, pager, next"
                            :total= 'pageNums'>
                        </el-pagination>
                    </template>
                </el-tab-pane>
                <el-tab-pane :label="`驳回任务(${rejectTask.length})`" name="fourth">
                    <template >
                        <el-table :data="rejectTask" :show-header="false" style="width: 100%">
                            <el-table-column>
                                <template slot-scope="scope">
                                    <span class="message-title">{{scope.row.title}}</span>
                                </template>
                            </el-table-column>
                            <el-table-column prop="date" width="150"></el-table-column>
                        </el-table>
                        <el-pagination
                            small
                            @current-change="handleCurrentChange"
                            layout="prev, pager, next"
                            :total= 'pageNums'>
                        </el-pagination>
                    </template>
                </el-tab-pane>
            </el-tabs>
        </div>
    </div>
</template>

<script>
    export default {
        name: 'TaskCore',
        data() {
            return {
                message: 'first',
                showHeader: false,
                //消息总数
                pageNums:20,
                unreadTask: [{
                    date: '2018-09-02 20:00:00',
                    title: '【系统通知】该系统将于今晚凌晨2点到5点进行升级维护',
                },{
                    date: '2018-09-02 21:00:00',
                    title: '今晚12点整发大红包,先到先得',
                },{
                    date: '2018-09-02 21:00:00',
                    title: '今晚12点整发大红包,先到先得',
                },{
                    date: '2018-09-02 21:00:00',
                    title: '今晚12点整发大红包,先到先得',
                }],
                onreadTask: [{
                    date: '2018-09-02 20:00:00',
                    title: '【系统通知】该系统将于今晚凌晨2点到5点进行升级维护'
                }],
                finishTask: [{
                    date: '2018-09-20 20:00:00',
                    title: '【系统通知】该系统将于今晚凌晨2点到5点进行升级维护'
                }],
                rejectTask: [{
                    date: '2018-09-20 20:00:00',
                    title: '【系统通知】该系统将于今晚凌晨2点到5点进行升级维护'
                }]
            }
        },
        methods: {
            handleCurrentChange(index){
                //页码
                console.log(index)
            },
            //阅读消息
            openDetails(column) {
                console.log(column);
            },
        },
        computed: {
            unreadNum(){
                return this.unreadTask.length;
            }
        }
    }

</script>

<style>
    .message-title{
        cursor: pointer;
    }
    .handle-row{
        margin-top: 30px;
    }
</style>

2、解决问题之后的代码

<template>
    <div>
        <div class="crumbs">
            <el-breadcrumb separator="/">
                <el-breadcrumb-item><i class="el-icon-message"></i> 任务中心</el-breadcrumb-item>
            </el-breadcrumb>
        </div>
        <div class="container">
            <el-tabs v-model="message">
                <el-tab-pane :label="`待办任务(${unreadTask.length})`" name="first">
                    <el-table :data="unreadTask" :show-header="false" style="width: 100%" @row-click="openDetails">
                        <el-table-column>
                            <template slot-scope="scope">
                                <span class="message-title" >{{scope.row.title}}</span>
                            </template>
                        </el-table-column>
                        <el-table-column prop="date" width="180"></el-table-column>
                    </el-table>
                    <el-pagination
                        small
                        @current-change="handleCurrentChange"
                        layout="prev, pager, next"
                        :total= 'pageNums'>
                    </el-pagination>
                </el-tab-pane>
                <el-tab-pane :label="`当前任务(${onreadTask.length})`" name="second">
                    <template>
                        <el-table v-if="activeName === 'second'" :data="onreadTask" :show-header="false" style="width: 100%">
                            <el-table-column>
                                <template slot-scope="scope">
                                    <span class="message-title">{{scope.row.title}}</span>
                                </template>
                            </el-table-column>
                            <el-table-column prop="date" width="150"></el-table-column>
                        </el-table>
                        <el-pagination
                            small
                            @current-change="handleCurrentChange"
                            layout="prev, pager, next"
                            :total= 'pageNums'>
                        </el-pagination>
                    </template>
                </el-tab-pane>
                <el-tab-pane :label="`已完成任务(${finishTask.length})`" name="third">
                    <template>
                        <el-table v-if="activeName === 'third'" :data="finishTask" :show-header="false" style="width: 100%">
                            <el-table-column>
                                <template slot-scope="scope">
                                    <span class="message-title">{{scope.row.title}}</span>
                                </template>
                            </el-table-column>
                            <el-table-column prop="date" width="150"></el-table-column>
                        </el-table>
                        <el-pagination
                            small
                            @current-change="handleCurrentChange"
                            layout="prev, pager, next"
                            :total= 'pageNums'>
                        </el-pagination>
                    </template>
                </el-tab-pane>
                <el-tab-pane :label="`驳回任务(${rejectTask.length})`" name="fourth">
                    <template >
                        <el-table v-if="activeName === 'fourth'" :data="rejectTask" :show-header="false" style="width: 100%">
                            <el-table-column>
                                <template slot-scope="scope">
                                    <span class="message-title">{{scope.row.title}}</span>
                                </template>
                            </el-table-column>
                            <el-table-column prop="date" width="150"></el-table-column>
                        </el-table>
                        <el-pagination
                            small
                            @current-change="handleCurrentChange"
                            layout="prev, pager, next"
                            :total= 'pageNums'>
                        </el-pagination>
                    </template>
                </el-tab-pane>
            </el-tabs>
        </div>
    </div>
</template>

<script>
    export default {
        name: 'TaskCore',
        data() {
            return {
                message: 'first',
                showHeader: false,
                //消息总数
                pageNums:20,
                unreadTask: [{
                    date: '2018-09-02 20:00:00',
                    title: '【系统通知】该系统将于今晚凌晨2点到5点进行升级维护',
                },{
                    date: '2018-09-02 21:00:00',
                    title: '今晚12点整发大红包,先到先得',
                },{
                    date: '2018-09-02 21:00:00',
                    title: '今晚12点整发大红包,先到先得',
                },{
                    date: '2018-09-02 21:00:00',
                    title: '今晚12点整发大红包,先到先得',
                }],
                onreadTask: [{
                    date: '2018-09-02 20:00:00',
                    title: '【系统通知】该系统将于今晚凌晨2点到5点进行升级维护'
                }],
                finishTask: [{
                    date: '2018-09-20 20:00:00',
                    title: '【系统通知】该系统将于今晚凌晨2点到5点进行升级维护'
                }],
                rejectTask: [{
                    date: '2018-09-20 20:00:00',
                    title: '【系统通知】该系统将于今晚凌晨2点到5点进行升级维护'
                }]
            }
        },
        methods: {
            handleCurrentChange(index){
                //页码
                console.log(index)
            },
            //阅读消息
            openDetails(column) {
                console.log(column);
            },
        },
        computed: {
            unreadNum(){
                return this.unreadTask.length;
            }
        }
    }

</script>

<style>
    .message-title{
        cursor: pointer;
    }
    .handle-row{
        margin-top: 30px;
    }
</style>	

3、解决方法

使用v-if控制el-tab-pane里的内容是可以有效的 例如v-if="activeName === 'second'"

5、联系方式