[Vue]如何实现一个简单的表格数据筛选查找 (根据ElementUI表格展示)(数组筛选)

[Vue]如何实现一个简单的表格数据筛选查找 (根据ElementUI表格展示)(数组筛选)

能够解决的问题

  • 在一个完整的数据数据渲染的 elementui 表格组件中,筛选输出数据

目录

  • 布局代码 样式代码 vue代码
  • 布局展示
  • 功能实现
  • 逻辑解析

布局代码

<template>
  <div id="app">
    <el-container>
      <el-header class="header">
        <comtitle :titlemsg="'查询组件'"></comtitle>
        <!--这里是我自定义的组件!不要复制-->
      </el-header>
      <el-main class="content">
        <el-row class="row1">
          <el-col :span="2">搜索ID</el-col>
          <el-col :span="6">
            <el-input v-model="inputId" placeholder="请输入内容"></el-input>
          </el-col>
          <el-col :span="1">&nbsp;</el-col>
          <el-col :span="2">搜索关键字</el-col>
          <el-col :span="6">
            <el-input v-model="inputName" placeholder="请输入内容"></el-input>
          </el-col>
          <el-col :span="1">&nbsp;</el-col>
          <el-col :span="2">性别筛选</el-col>
          <el-col :span="3">
            <el-select v-model="value" placeholder="请选择性别">
              <el-option
                v-for="item in options"
                :key="item.value"
                :label="item.label"
                :value="item.value">
              </el-option>
            </el-select>
          </el-col>
        </el-row>
        <el-table
          :data="studentsNewList"
          style="width:95%"
          class="eltable1">
          <el-table-column
            prop="id"
            label="ID"
            width="180">
          </el-table-column>
          <el-table-column
            prop="name"
            label="姓名"
            width="180">
          </el-table-column>
          <el-table-column
            prop="sex"
            label="性别"
            width="180">
          </el-table-column>
          <el-table-column
            prop="ctime"
            label="创建时间">
          </el-table-column>
        </el-table>
      </el-main>
    </el-container>
  </div>
</template>
  • 样式代码
*{margin:0;padding:0;}
  #app{
    background:#ccc;
  }
  .header{
    width:100%;
    margin-bottom:30px;
  }
  .content{
    padding-left:30px;
  }
  .row1{
    height:60px;line-height:60px;margin:10px 0;
  }
  .eltable1{
    overflow: scroll;
  }
  • js[Vue]代码
    import comtitle from "./children/comtitle";	
    // 这里是我自定义的组件!不要复制

    export default {
      name: "demo2",
      data(){
        return{
          studentsList:[],
          studentsNewList:[],
          inputName:'',
          inputId:null,
          options:[
            {value:0,label:'全部'},
            {value:1,label:'男'},
            {value:2,label:'女'}
          ],
          value:0
        }
      },
      methods:{
        getStudentsNum() {
          this.$axios.get('http://127.0.0.1:9091/getall').then(result => {
            this.studentsNewList = this.studentsList = result.data
          }).catch(err => {
            console.log(err)
          })
        },
        searchId(keywords) {
          return this.studentsList.filter(item =>{
            if(item.id == keywords) {
              return item
            }
          })
        },
        searchName(keywords) {
          return this.studentsList.filter(item =>{
            if(item.name.includes(keywords)){
              return item
            }
          })
        },
        searchsex(keywords) {
          return this.studentsList.filter(item =>{
            if(item.sex.includes(keywords)){
              return item
            }
          })
        },
        numberToSex(num){
          return num==1?'男':'女'
        }
      },
      created() {
        this.getStudentsNum()
      },
      watch:{
        inputId: function(val) {
          if(val == ''){
            this.studentsNewList = this.studentsList
          }else{
            this.studentsNewList = this.searchId(val)
          }
        },
        inputName: function(val) {
          if(val == ''){
            this.studentsNewList = this.studentsList
          }else{
            this.studentsNewList = this.searchName(val)
          }
        },
        value: function(val) {
          if(val == 0){
            this.studentsNewList = this.studentsList
          }else{
            this.studentsNewList = this.searchsex(this.numberToSex(val))
          }
        }
      },
      components:{
        comtitle	// 自定义的组件,与本文无关
      }
    }
    

布局效果

功能实现

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

逻辑解析

0. 数组数据类型

{id:1,name:‘余强’,sex:‘男’,ctime:new Date()},
{id:2,name:‘萧芳’,sex:‘女’,ctime:new Date()},

1. 使用 watch 监听三个输入框的变量变化

  • 我在事先将数据数据拷贝了两份,studentsNewList用来渲染数组,而studentsList作为原始数据方便恢复
  • 监听输入框的变化,如第一个:如果inputid绑定的数据发生变化,那么调用searchId事件,并将值作为参数传递;如果值变为空,那么将渲染数据恢复到原数据
  • 性别筛选与其他的不同是多了一个方法,这个方法负责将数字转为性别的文字
watch:{
        inputId: function(val) {
          if(val == ''){
            this.studentsNewList = this.studentsList
          }else{
            this.studentsNewList = this.searchId(val)
          }
        },
        inputName: function(val) {
          if(val == ''){
            this.studentsNewList = this.studentsList
          }else{
            this.studentsNewList = this.searchName(val)
          }
        },
        value: function(val) {
          if(val == 0){
            this.studentsNewList = this.studentsList
          }else{
            // console.log(this.numberToSex(val))
            this.studentsNewList = this.searchsex(this.numberToSex(val))
          }
        }
      }

2. 事件处理 返回数据

  • getStudentsNum:这是我从后端获取数据的方法,请忽略
  • searchId : 直接从数组中筛选出 id=参数 的元素,返回这个元素
  • searchName : 使用includes()方法,将数组的元素与参数进行逐一匹配,检查是否包含该参数
  • searchSex : 返回数组中,性别与参数匹配的元素
  • numberToSex : 因为性别选择框的value是0或1或2,如果是0的话那么直接恢复原始数据,不会执行这个事件(详细请看上面);如果为1那么返回给调用者,如果不为1返回给调用者。(调用者接到返回值后会将此返回值作为参数,调用searchSex方法,具体请看上方代码)
getStudentsNum() {
          this.$axios.get('http://127.0.0.1:9091/getall').then(result => {
            // console.log(result)
            this.studentsNewList = this.studentsList = result.data
          }).catch(err => {
            console.log(err)
          })
        },
        searchId(keywords) {
          return this.studentsList.filter(item =>{
            if(item.id == keywords) {
              return item
            }
          })
        },
        searchName(keywords) {
          return this.studentsList.filter(item =>{
            if(item.name.includes(keywords)){
              return item
            }
          })
        },
        searchsex(keywords) {
          return this.studentsList.filter(item =>{
            if(item.sex.includes(keywords)){
              return item
            }
          })
        },
        numberToSex(num){
          return num==1?'男':'女'
        }

3. data中的数据解析

  • studentsListstudentsNewList最初都是原始数组数据,但不同的是studentsNewList直接渲染表格,也会被直接筛选用返回值渲染表格,而studentsList起到一个保存原始数据的作用
  • inputNameinputId都是输入框绑定变量
  • options数组是elementui选择框的数据需要,而value变量则用于接收它的选择结果
data(){
        return{
          studentsList:[],
          studentsNewList:[],
          inputName:'',
          inputId:null,
          options:[
            {value:0,label:'全部'},
            {value:1,label:'男'},
            {value:2,label:'女'}
          ],
          value:0
        }
      }

创作不易 感谢支持

  • 37
    点赞
  • 99
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
可以使用 Ant Design Vue 的 Table 和 Input 组件来实现输入框模糊筛选表格数据,并将筛选结果展示。具体实现步骤如下: 1. 在 Table 组件中设置 dataSource 属性为表格数据源,columns 属性为表格列的配置。 2. 在 Input 组件中设置 v-model 双向绑定输入框的值。 3. 在 Input 组件的 @input 事件中,通过筛选算法过滤出符合要求的表格数据。 4. 将筛选后的数据赋值给 dataSource,表格会重新渲染,展示筛选结果。 下面是示例代码: ```vue <template> <div> <a-input v-model="searchText" placeholder="请输入关键词"></a-input> <a-table :columns="columns" :dataSource="filteredData"></a-table> </div> </template> <script> export default { data() { return { data: [ { name: '张三', age: 18, address: '北京市' }, { name: '李四', age: 20, address: '上海市' }, { name: '王五', age: 22, address: '广州市' } ], searchText: '' } }, computed: { filteredData() { return this.data.filter(item => { const regExp = new RegExp(this.searchText, 'i') return regExp.test(item.name) || regExp.test(item.address) }) }, columns() { return [ { title: '姓名', dataIndex: 'name' }, { title: '年龄', dataIndex: 'age' }, { title: '地址', dataIndex: 'address' } ] } } } </script> ``` 在上面的示例代码中,我们定义了一个 data 数组作为表格数据源,每个数组元素表示一行数据,包含 name、age、address 三个属性。 在 Input 组件中,我们使用 v-model 双向绑定 searchText 变量,表示输入框中的值。 在 computed 中,我们定义了一个 filteredData 计算属性,表示筛选后的数据。在 filteredData 中,我们使用 filter 方法对 data 数组进行筛选筛选出 name 或 address 属性中包含 searchText 的数据。 在 columns 中,我们定义了表格列的配置。 最后,在 Table 组件中,我们使用 filteredData 作为 dataSource 属性值,表示展示筛选结果。当 searchText 变量发生变化时,filteredData 会重新计算,表格会重新渲染,展示筛选结果。
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值