如何用下拉选择器过滤表格?

想直接用下拉选择器实现表格的筛选,不是使用elementUI的表头筛选,请问该怎么实现??

clipboard.png

<template>
    <div class="child-page-toolbar">
        <div class="line"></div>

        <span slot="title">状态</span>
        <el-select v-model="selectState" placeholder="请选择工单状态" @change="StateChange">
            <el-option
                    v-for="item in state"
                    :key="item.value"
                    :label="item.label"
                    :value="item.value">
            </el-option>
        </el-select>

        <span slot="title">分类</span>
        <el-select v-model="selectSort" placeholder="请选择工单类别" @change="SortChange">
            <el-option
                    v-for="item in sort"
                    :key="item.value"
                    :label="item.label"
                    :value="item.value">
            </el-option>
        </el-select>

        <el-date-picker
                v-model="selectDate"
                type="daterange"
                align="right"
                unlink-panels
                range-separator="至"
                start-placeholder="开始日期"
                end-placeholder="结束日期"
                :picker-options="pickerOptions" @change="dateChange">
        </el-date-picker>



        <el-table :data="tableData"
                  style="width: 100%"
                  :default-sort = "{prop: 'submitTime', order: 'ascending'}">
            <el-table-column
                    prop="orderNum"
                    label="工单号"
                    sortable
                    width="180">
            </el-table-column>
            <el-table-column
                    prop="orderSort"
                    label="分类"
                    width="180">
            </el-table-column>
            <el-table-column
                    prop="orderTitle"
                    label="标题">
            </el-table-column>
            <el-table-column
                    prop="orderDescribe"
                    label="描述"
                    width="180">
            </el-table-column>
            <el-table-column
                    prop="orderState"
                    label="状态"
                    width="180">
            </el-table-column>
            <el-table-column
                    prop="submitTime"
                    label="提交时间"
                    sortable>
            </el-table-column>
            <el-table-column
                    prop="endTime"
                    label="截止时间"
                    sortable
                    width="180">
            </el-table-column>
            <el-table-column
                    fixed="right"
                    label="操作">
                <template slot-scope="scope">
                    <el-button @click="handleDetail(scope.$index, scope.row)" type="text" size="small">详情</el-button>
                    <el-button @click="handleEdit(scope.$index, scope.row)" type="text" size="small">编辑</el-button>
                    <el-button @click="handleDelete(scope.$index, scope.row)" type="text" size="small">删除</el-button>
                </template>
            </el-table-column>
        </el-table>
    </div>
</template>
<script>
    export default {
        data() {
            return {
                state: [{
                    value: '0',
                    label: '全部工单'
                }, {
                    value: '1',
                    label: '未处理'
                }, {
                    value: '2',
                    label: '处理中'
                }, {
                    value: '3',
                    label: '已处理'
                }, {
                    value: '4',
                    label: '已结单'
                }],
                sort: [{
                    value: '0',
                    label: '全部工单'
                }, {
                    value: '1',
                    label: '文案类'
                }, {
                    value: '2',
                    label: '设计类'
                }, {
                    value: '3',
                    label: '开发类'
                }, {
                    value: '4',
                    label: '采购类'
                }, {
                    value: '5',
                    label: '其他类'
                }],
                selectState: '',
                selectSort:'',


                //日期选择器
                pickerOptions: {
                    shortcuts: [{
                        text: '最近一周',
                        onClick(picker) {
                            const end = new Date();
                            const start = new Date();
                            start.setTime(start.getTime() - 3600 * 1000 * 24 * 7);
                            picker.$emit('pick', [start, end]);
                        }
                    }, {
                        text: '最近一个月',
                        onClick(picker) {
                            const end = new Date();
                            const start = new Date();
                            start.setTime(start.getTime() - 3600 * 1000 * 24 * 30);
                            picker.$emit('pick', [start, end]);
                        }
                    }, {
                        text: '最近三个月',
                        onClick(picker) {
                            const end = new Date();
                            const start = new Date();
                            start.setTime(start.getTime() - 3600 * 1000 * 24 * 90);
                            picker.$emit('pick', [start, end]);
                        }
                    }]
                },
                selectDate: '',

                //表格数据
                tableData: [{
                    orderNum: '1',
                    orderSort: '开发',
                    orderTitle: 'BUG测试',
                    orderDescribe:'BUG测试描述',
                    orderState:'处理中',
                    submitTime:'2017.01.10 02:33',
                    endTime:'2017.02.10 02:33'
                }, {
                    orderNum: '2',
                    orderSort: '开发',
                    orderTitle: 'BUG测试',
                    orderDescribe:'BUG测试描述',
                    orderState:'处理中',
                    submitTime:'2017.01.11 02:33',
                    endTime:'2017.02.09 02:33'
                }, {
                    orderNum: '3',
                    orderSort: '开发',
                    orderTitle: 'BUG测试',
                    orderDescribe:'BUG测试描述',
                    orderState:'处理中',
                    submitTime:'2017.01.12 02:33',
                    endTime:'2017.02.08 02:33'
                }, {
                    orderNum: '4',
                    orderSort: '开发',
                    orderTitle: 'BUG测试',
                    orderDescribe:'BUG测试描述',
                    orderState:'处理中',
                    submitTime:'2017.01.09 02:33',
                    endTime:'2017.02.07 02:33'
                }, {
                    orderNum: '5',
                    orderSort: '开发',
                    orderTitle: 'BUG测试',
                    orderDescribe:'BUG测试描述',
                    orderState:'处理中',
                    submitTime:'2017.01.08 02:33',
                    endTime:'2017.02.06 02:33'
                }, {
                    orderNum: '6',
                    orderSort: '开发',
                    orderTitle: 'BUG测试',
                    orderDescribe:'BUG测试描述',
                    orderState:'处理中',
                    submitTime:'2017.01.15 02:33',
                    endTime:'2017.02.05 02:33'
                }]
            }
        },
        filter:{

        },
        methods: {
            StateChange(value) {
                console.log(value);
                if(value === 2){

                }
            },
            SortChange(value){
                console.log(value);
            },

            dateChange(value){
                console.log(value);
            },
            handleSelect(key, keyPath) {
                console.log(key, keyPath);
            },
            handleClick(row) {
                console.log(row);
            },
            handleDetail(index,row){
                location.href = "/personal/detail"
            },
            handleEdit(index,row){
                location.href = "/createOrder/new"
            },
            handleDelete(index,row){
                this.$confirm('此操作将永久删除该文件, 是否继续?', '提示', {
                    confirmButtonText: '确定',
                    cancelButtonText: '取消',
                    type: 'warning'
                }).then(() => {
                    this.$message({
                        type: 'success',
                        message: '删除成功!'
                    });
                }).catch(() => {
                    this.$message({
                        type: 'info',
                        message: '已取消删除'
                    });
                });
            }
        }
    }
</script>
阅读 7.9k
3 个回答

vue的数据都是绑定的,数据变了展示的内容就跟着变了,下拉菜单有一个change事件,可以根据选中的值去改变下面表格中绑定的数据内容,数据一旦变化,内容会自动更新,就是这思路,若不懂,可评论告诉我,我给你代码实现一下,现在不写是因为那么多内容,难写呀^_^ ^_^

1.筛选条件的change事件对应的事件只要写一个方法就可以了,如changeSelect,因为过滤不止要兼顾当前选择的过滤条件,还要兼顾其他选择的选项,如现在选了分类,但之前选过的状态也得保留。
2.一般如果数据量比较大的话,筛选条件是要作为参数传给后台,后台过滤之后返回给前台渲染即可,毕竟服务器的处理速度比浏览器的处理速度快的不止一丢丢
3.假如需要前台渲染,拿到所有数据以后,在changeSelect方法中,首先获取所有过滤项的值,也就是v-model所绑定的值,举个例子,过滤了state为处理中且分类是开发的话,那就在表格数据渲染的时候(假如从后台拿到的数据数组为res),判断res[i].state==this.selectState&&res[i].sort==this.selectSort的话将数据放到表格数据中进行渲染,否则不渲染。
建议过滤项让后台提供筛参数,使用第二种方式。

@loje 你数据是来自后端api吧,问后端传什么参数就可以了,change后用axios发ajax请求啊

推荐问题