vue+element-ui的表格组件实现简单的搜索框功能

在使用element-ui的表格组件时,遇到了搜索框功能的实现问题。它官网的表格组件展示里有一个自定义表头的实现(其图如下),但是并没有给出搜索框的实现代码。
在这里插入图片描述

搜索了一下网上的资料,发现大多都是前端来实现的。我想搜索功能也应该交由前端来实现,交由后端的话可能会增加后端服务器的负担,能给前端浏览器做的就给。

搜索功能应该是模糊匹配,目前想到的实现方法是:将el-table中的data属性绑定为到一个计算属性上,这个计算属性根据搜索框的内容,来返回匹配上搜索内容的数据。

一种实现方法是:

computed: {
  tables(){
    let search = this.search.toLowerCase();
    if(search){
      // tableData是要放在表格中展示的数据
      return this.tableData.filter(data =>{
        // 获取对象数组的所有枚举属性,通过some来判断对象中的某一属性是否匹配上,如果匹配上了那么这个对象后面的属性就不用判断了,从而返回整个对象(毕竟我们要看整个对象的值)。
        return Object.keys(data).some(key =>{
          if(data[key] !== null) // 对象的属性不为空才进行模糊匹配,否则会报错
            return data[key].toString().toLowerCase().indexOf(search) > -1;
        });
      });
    }else{
      return this.tableData; // 如果搜索框没有值,就正常展示表格的所有数据
    }
  }
},

这种实现方法是先通过filter遍历对象数组中的每个对象,然后用Object.keys来获取对象的枚举属性,也就是key: value中的key,最后用data[key]来获取对象属性的每个值。使用Object.keys获取到的是对象的枚举属性构成的数组,获取这些属性的顺序与手动遍历该对象时的属性一致,也就是和正常循环遍历该对象时返回的顺序一致 。它是先根据数字顺序对属性排序,再按照对象定义的顺序排序余下的属性。比如:

// array like object with random key ordering
var anObj = { 100: 'a', 2: 'b', 7: 'c' };
console.log(Object.keys(anObj)); // console: ['2', '7', '100']

// array like object
var obj = { 0: 'a', 1: 'b', 2: 'c' };
console.log(Object.keys(obj)); // console: ['0', '1', '2']

还有另一种实现方法是使用for…in来实现:

computed: {
  tables(){
    let search = this.search.toLowerCase();
    if(search){
      return this.compData.filter(data =>{
        for(let d in data){
          if(d.toString().toLowerCase().indexOf(search) > -1) return true;
          else false;
        }
      });
    }else{
      return this.compData;
    }
  }
},

这种实现方法无非就是不使用Object.keys遍历一遍获得key,再用key来获取value,而是直接遍历对象自身的所有属性。但好像eslint 不推荐使用for…in来遍历对象。但能用就行,这种简单的搜索功能就是遍历所有属性的值,只要能遍历到所有属性的方法就能用。

可以使用element-ui的el-table组件和el-input组件实现表格搜索框。具体实现步骤如下: 1. 在el-table中添加一个slot="header"的template,用于放置搜索框。 2. 在template中添加一个el-input组件,用于输入搜索关键字。 3. 在el-table的data属性中添加一个filterText属性,用于存储搜索关键字。 4. 在el-table的computed属性中添加一个filteredData属性,用于根据搜索关键字过滤数据。 5. 在el-input的v-model属性中绑定filterText,实现搜索框与数据的双向绑定。 示例代码如下: ``` <template> <div> <el-table :data="tableData" style="width: 100%"> <el-table-column prop="name" label="姓名"></el-table-column> <el-table-column prop="age" label="年龄"></el-table-column> <el-table-column prop="address" label="地址"></el-table-column> <template slot="header"> <el-input v-model="filterText" placeholder="请输入搜索关键字"></el-input> </template> </el-table> </div> </template> <script> export default { data() { return { tableData: [ { name: '张三', age: 18, address: '北京市' }, { name: '李四', age: 20, address: '上海市' }, { name: '王五', age: 22, address: '广州市' }, { name: '赵六', age: 24, address: '深圳市' } ], filterText: '' } }, computed: { filteredData() { return this.tableData.filter(item => { return item.name.toLowerCase().includes(this.filterText.toLowerCase()) || item.address.toLowerCase().includes(this.filterText.toLowerCase()) }) } } } </script> <style> </style> ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值