zoukankan      html  css  js  c++  java
  • elementui 表格应用1:多选+搜索框+保持选中状态

    场景:

    一个带多选、关键字搜索功能的表格。要求在以下情形下, 保持数据项选中状态的一致:

    1、有、无关键字;

    2、数据项选中状态进行切换;

    具体如下图:

    案例代码:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <script src="//unpkg.com/vue/dist/vue.js"></script>
        <script src="//unpkg.com/element-ui@2.13.0/lib/index.js"></script>
        <link href="//unpkg.com/element-ui@2.13.0/lib/theme-chalk/index.css" rel="stylesheet">
    </head>
    <body>
    <div id="app">
        <template>
            <el-table
                    ref="multipleTable"
                    :data="tableData"
                    tooltip-effect="dark"
                    style=" 100%"
                    @selection-change="handleSelectionChange1">
    
                <el-table-column
                        type="selection"
                        width="55">
                </el-table-column>
                <el-table-column
                        label="日期"
                        width="120">
                    <template slot-scope="scope">{{ scope.row.date }}</template>
                </el-table-column>
                <el-table-column
                        prop="name"
                        label="姓名"
                        width="120">
                </el-table-column>
                <el-table-column
                        align="right">
                    <template slot="header" slot-scope="scope">
                        <el-input
                                @input="searchChange1"
                                v-model="search"
                                size="mini"
                                placeholder="输入关键字搜索"/>
                    </template>
                    <template slot-scope="scope">
                        <el-button
                                size="mini"
                                @click="handleEdit(scope.$index, scope.row)">Edit
                        </el-button>
                        <el-button
                                size="mini"
                                type="danger"
                                @click="handleDelete(scope.$index, scope.row)">Delete
                        </el-button>
                    </template>
                </el-table-column>
            </el-table>
        </template>
    </div>
    <script>
        var Main = {
            data() {
                return {
                    search: '',
                    searchFlag: false,
                    tableData: [],
                    originArr: [{
                        date: '2016-05-03',
                        name: '1',
    
                    }, {
                        date: '2016-05-02',
                        name: '2',
    
                    }, {
                        date: '2016-05-04',
                        name: '3',
    
                    }, {
                        date: '2016-05-01',
                        name: '4',
    
                    }, {
                        date: '2016-05-08',
                        name: '5',
    
                    }, {
                        date: '2016-05-06',
                        name: '6',
    
                    }, {
                        date: '2016-05-07',
                        name: '王小虎',
    
                    }],
                    multipleSelection: []
                }
            },
            created() {
                this.tableData = [...this.originArr]; // 保持源数组的独立性,
            },
    
            methods: {
                handleSelectionChange1(val) {
                    console.log('改变:', this.searchFlag)
                    console.log(this.tableData)
                    console.log(this.originArr)
                    if (this.searchFlag) { // 手动选中过程中不予响应
                        return;
                    }
                    this.tableData.forEach(item => {
                        item.checked = false;
                    })
                    val.forEach(row => {
                        row.checked = true;
                    })
                },
                searchChange1() {
                    var arr = this.originArr.filter(data => !this.search || data.name.toLowerCase().includes(this.search.toLowerCase()));
                    this.tableData.splice(0,this.tableData.length);
                    Array.prototype.push.apply(this.tableData, arr); // 不改变tableData 数组的引用地址。保持其响应式。
    
                    this.$nextTick(() => {
                        this.searchFlag = true // 手动选中前 禁止多选事件响应
                        this.tableData.forEach(item => {
                            if (item.checked)
                                this.$refs.multipleTable.toggleRowSelection(item, true);
                        })
                        this.searchFlag = false; // 放开多选事件响应
                    })
                }
            }
        }
        var Ctor = Vue.extend(Main)
        new Ctor().$mount('#app')
    </script>
    </body>
    </html>

    关键解读:

    1、对数组项 使用 check属性 来标识是否被选中;

    2、多选事件里,保证选中项 被正确标识;

    3、输入框改变事件里,进行表格数据的正确填充(保证其引用不变,否则 手动选中不起作用);在nextTick事件里,进行手动选中

  • 相关阅读:
    Python round() 函数
    Python pow() 函数
    图像角点检测
    计算机视觉解析力
    空间点像素索引(三)
    空间点像素索引(二)
    空间点像素索引(一)
    相机标定实用方案
    摄像头的主要参数
    多篇开源CVPR 2020 语义分割论文
  • 原文地址:https://www.cnblogs.com/fan-zha/p/11958774.html
Copyright © 2011-2022 走看看