中北软院创新实验室

一步步实现一个简单的适用于iview的vue表格搜索组件,支持下

2017-12-13  本文已影响3072人  811c622a1598

最近在使用vue+iview做一个后台管理系统,在做表格部分时发现iview的表格并不支持搜索,不过iview易于拓展,可以很方便的拓展出表格搜索功能,比如在iview-admin就存在可搜索表格,但是功能比较基础,而且没有封装为单独组件,接下来我们就一步步的实现一个支持下拉选择指定列进行搜索的表格搜索组件。完整代码:https://github.com/shawpo/vue-iview-tableSearch


首先我们可以来看下iview-admin表格搜索的实现,以示例中按姓名搜索为例,其实现实现了按姓名搜索。

// 关键代码
<template>
......
  <Input 
      v-model="searchConName1" 
      icon="search" 
      @on-change="handleSearch1" 
      placeholder="请输入姓名搜索..." 
      style="width: 200px" 
  />
......
</template>
<script>
......
export default {
......
    methods: {
        ......
        search (data, argumentObj) {
            let res = data;
            let dataClone = data;
            for (let argu in argumentObj) {
                if (argumentObj[argu].length > 0) {
                    res = dataClone.filter(d => {
                        return d[argu].indexOf(argumentObj[argu]) > -1;
                    });
                    dataClone = res;
                }
            }
            return res;
        },
        handleSearch1 () {
            this.data1 = this.initTable1;
            this.data1 = this.search(this.data1, {name: this.searchConName1});
        },
        ......
    },
    ......
};
</script>

接下来我们就对这个简单的搜索进行拓展以支持下拉选择指定列进行搜索并封装为单独组件,想要支持这一功能,我们首先需要列名以及表格数据中对应列内容的字段名等信息,而创建iview表格的所需的列配置参数(columns)中就包含这些信息,因此可以很方便的开发出适用于iview表格的搜索组件。

<Input
    placeholder="请选择列名并输入内容..."
    v-model="searchContent"
    @on-change="handleSearch">
    <Select slot="prepend" style="width: 80px" v-model="searchColumn">
        <Option
          v-for="column in searchColumns"
          :value="column.key"
          :key="column.key">
          {{column.title}}
        </Option>
    </Select>
</Input>
// 关键代码
......
<table-search
   ......
   :searchColumns="searchColumns"
   >
</table-search>

......
computed: {
  searchColumns: function () {
    // 过滤不需要支持搜索的列,这里过滤掉了“状态”列
    return this.menusColumns.filter( (d) => {
      return d['key'] && d['key'] != 'status'
    })
  }
},
......
// 父组件
<table-search
  :tableData.sync="menusData"
  :searchColumns="searchColumns"
  >
</table-search>
watch: {
     // 因父组件表格数据通常存在异步操作
     // 需监听props以得到正确的数据
     tableData: function (newTableData) {
       if (newTableData.length > 0 && this.tableDataClone.length == 0) {
         this.tableDataClone = newTableData
       }
     }
}
 methods: {
      // 表格搜索函数,可支持多列搜索
      search: function (data, argumentObj) {
        let res = data;
        let dataClone = data;
        for (let argu in argumentObj) {
          if (argumentObj[argu].length > 0) {
            res = dataClone.filter(d => {
              return d[argu].indexOf(argumentObj[argu]) > -1;
            });
            dataClone = res;
          }
        }
        return res;
      },
      handleSearch: function () {
        var argumentObjStr = '{"' + this.searchColumn + '": "' + this.searchContent + '"}' // 拼接json
        var argumentObj = JSON.parse(argumentObjStr) // 转为对象
        var res = this.search(this.tableDataClone, argumentObj) // 执行搜索,获取搜索结果
        this.$emit('update:tableData', res) // 更新表格数据为搜索结果
      }
},

结束

上一篇下一篇

猜你喜欢

热点阅读