Element-ui(筛选功能)


前言

记录一些element-ui遇到的bug


一、如何在element-ui表格中实现筛选功能?

element-ui自带的筛选功能简直就是

1.我们通过select实现筛选

在某一列的表头中嵌套一个下拉框即可,注意这里的【slot-scope=“scope”】必须写,否则不生效。
实现代码如下:

<template>
  <div class="app-container">
    <el-table
      :data="tableData2"
      style="width: 100%;"
      border
      height="300"
    >
      <el-table-column align="center">
        <template slot="header" slot-scope="scope">
          <span> 日期 </span>
          <el-select
            v-model="headerSelected"
            @change="headerChanged"
          >
            <el-option
              v-for="item in headerSelect"
              :key="item.value"
              :label="item.text"
              :value="item.value"
            />
          </el-select>
        </template>
        <template slot-scope="scope">
          <span>{{ scope.row.date }}</span>
        </template>
      </el-table-column>
      <el-table-column
        prop="name"
        label="姓名"
        align="center"
      />
      <el-table-column
        prop="address"
        label="地址"
        align="center"
      />
    </el-table>
  </div>
</template>
<script>
export default {
  data() {
    return {
      tableData: [{
        date: '2016-05-02',
        name: '王小虎',
        address: '上海市普陀区金沙江路 1518 弄'
      }, {
        date: '2016-05-04',
        name: '王小虎',
        address: '上海市普陀区金沙江路 1517 弄'
      }, {
        date: '2016-05-01',
        name: '王小虎',
        address: '上海市普陀区金沙江路 1519 弄'
      }, {
        date: '2016-05-03',
        name: '王小虎',
        address: '上海市普陀区金沙江路 1516 弄'
      }],

      headerSelect: [{
        text: '全部',
        value: 'all'
      }, {
        text: '2016-05-01',
        value: '2016-05-01'
      }, {
        text: '2016-05-02',
        value: '2016-05-02'
      }, {
        text: '2016-05-03',
        value: '2016-05-03'
      }, {
        text: '2016-05-04',
        value: '2016-05-04'
      }],

      tableData2: [],
      headerSelected: 'all'
    }
  },
  created() {
    this.tableData2 = this.tableData
  },
  methods: {
    headerChanged(val) {
      if (val === 'all') {
        this.tableData2 = this.tableData
      } else {
        this.tableData2 = this.tableData.filter(item => {
          return item.date.indexOf(val) > -1
        })
      }
    }
  }
}
</script>

如果你有后端配合的话就不需要tableData2了 通过改变选择框绑定的数据调用接口即可

注意这里可能会出现bug
element 表格表头插槽 dom不响应数据更新
这个select可能会出现bug
通过在表头加key进行刷新成功解决
<el-table-column width="300" :key="this.overview">

2.使用 element-ui 的 Dropdown 下拉菜单组件来实现

通过组件 slot 来设置下拉触发的元素以及需要通过具名 slot 为 dropdown 来设置下拉菜单。默认情况下,下拉按钮只要 hover 即可,无需点击也会显示下拉菜单,这里我们设置成点击触发(trigger=“click”)。
实现方式如下:

<template>
  <div class="app-container">
    <el-table
      :data="tableData2"
      style="width: 100%;"
      border
      height="300"
    >
      <el-table-column align="center">
        <template slot="header" slot-scope="scope">
          <el-dropdown trigger="click" @command="handleCommand">
            <span>日期({{ command }}<i class="el-icon-arrow-down el-icon--right" /></span>
            <el-dropdown-menu slot="dropdown">
              <el-dropdown-item
                v-for="item in headerSelect"
                :key="item.value"
                :command="item.text"
              >
                {{ item.text }}
              </el-dropdown-item>
            </el-dropdown-menu>
          </el-dropdown>
        </template>
        <template slot-scope="scope">
          <span>{{ scope.row.date }}</span>
        </template>
      </el-table-column>
      <el-table-column
        prop="name"
        label="姓名"
        align="center"
      />
      <el-table-column
        prop="address"
        label="地址"
        align="center"
      />
    </el-table>
  </div>
</template>
<script>
export default {
  data() {
    return {
      tableData: [{
        date: '2016-05-02',
        name: '王小虎',
        address: '上海市普陀区金沙江路 1518 弄'
      }, {
        date: '2016-05-04',
        name: '王小虎',
        address: '上海市普陀区金沙江路 1517 弄'
      }, {
        date: '2016-05-01',
        name: '王小虎',
        address: '上海市普陀区金沙江路 1519 弄'
      }, {
        date: '2016-05-03',
        name: '王小虎',
        address: '上海市普陀区金沙江路 1516 弄'
      }],

      headerSelect: [{
        text: '全部',
        value: 'all'
      }, {
        text: '2016-05-01',
        value: '2016-05-01'
      }, {
        text: '2016-05-02',
        value: '2016-05-02'
      }, {
        text: '2016-05-03',
        value: '2016-05-03'
      }, {
        text: '2016-05-04',
        value: '2016-05-04'
      }],

      tableData2: [],
      command: '全部'
    }
  },
  created() {
    this.tableData2 = this.tableData
  },
  methods: {
    handleCommand(command) {
      this.command = command
      if (command === '全部') {
        this.tableData2 = this.tableData
      } else {
        this.tableData2 = this.tableData.filter(item => {
          return item.date.indexOf(command) > -1
        })
      }
    }
  }
}
</script>


总结

至于第一种出现bug没有更新dom的原因,还未确定,需要探索。但是加上key后不影响使用

### 如何在 Element-UI 中设置筛选框为必填项 Element-UI 提供了一套完整的表单验证机制,可以通过 `rules` 属性来定义字段的校验规则。如果希望将某个筛选框设为必填项,则可以利用该功能实现。 以下是具体方法: #### 使用 Form 表单配合 Rules 实现必填校验 在 Element-UI 的 `<el-form>` 组件中,通过绑定 `model` 和 `rules` 来控制数据模型及其对应的校验规则。对于筛选框(如下拉菜单),可以将其嵌入到表单项 `<el-form-item>` 中,并为其指定 `required` 验证规则[^5]。 ```vue <template> <el-form :model="form" :rules="rules" ref="filterForm"> <!-- 筛选--> <el-form-item label="请选择:" prop="selectedOption"> <el-select v-model="form.selectedOption" placeholder="请选择选项"> <el-option label="选项一" value="option1"></el-option> <el-option label="选项二" value="option2"></el-option> </el-select> </el-form-item> <!-- 提交按钮 --> <el-button type="primary" @click="submitForm('filterForm')">提交</el-button> </el-form> </template> <script> export default { data() { return { form: { selectedOption: '' // 初始值为空字符串表示未选择 }, rules: { selectedOption: [ { required: true, message: '此项不能为空', trigger: 'change' } // 设置必填规则 ] } }; }, methods: { submitForm(formName) { this.$refs[formName].validate((valid) => { if (valid) { alert('提交成功!'); } else { console.log('错误! 数据未填写完整'); return false; } }); } } }; </script> ``` 上述代码展示了如何创建一个带有必填校验的筛选框。当用户尝试提交表单而未选择任何选项时,会触发提示消息:“此项不能为空”。 --- #### 关键点解析 1. **`prop` 属性的作用** 在 `<el-form-item>` 中使用 `prop` 将其关联至 `rules` 对应的字段名称。此属性用于指示哪个字段需要接受特定的校验逻辑[^6]。 2. **`trigger` 参数的选择** 校验触发方式可以选择 `'blur'` 或 `'change'`。如果是下拉列表或其他交互型控件,推荐使用 `'change'`,以便实时响应用户的操作变化[^7]。 3. **自定义错误信息** 可以通过 `{message}` 定义更友好的提示文字,提升用户体验。 --- ### 注意事项 虽然 Element-UI 支持丰富的表单校验功能,但在实际开发过程中需要注意以下几点: - 如果筛选框的数据来源于动态接口加载,请确保初始状态已正确初始化,以免影响校验流程。 - 当涉及复杂业务场景时,可能还需要结合其他插槽或事件监听进一步扩展功能[^8]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值