zoukankan      html  css  js  c++  java
  • elment-ui table组件 -- 远程筛选排序

    elment-ui table组件 -- 远程筛选排序

    基于 elment-ui table组件 开发,主要请求后台实现筛选 排序的功能。

    需求

    • 排序 筛选 是对后台整个数据进行操作,而不是对当前页面的数据进行操作
    • 若是其关联的下一级页面,(eg:点击查看编辑时,再返回当前页面时,保留之前筛选,或排序条件),否则清空

    先上一份源码, 直接使用官网的(修改了一小部分参数,可以忽略)

    <el-table
      :data="tableData"
      style=" 100%"
    >
      <el-table-column
        prop="date"
        label="日期"
        sortable="custom"
        min-width="180"
        :filters="dateList"
      >
      </el-table-column>
      <el-table-column
        sortable="custom"
        prop="name"
        label="姓名"
        min-width="180"
      >
      </el-table-column>
      <el-table-column
        prop="address"
        label="地址"
        min-width="200"
      >
      </el-table-column>
      <el-table-column
        prop="tag"
        label="标签"
        min-width="100"
        :filters="flagList"
      >
        <template slot-scope="scope">
          <el-tag
            :type="scope.row.tag === '家' ? 'primary' : 'success'"
            disable-transitions
          >{{scope.row.tag}}</el-tag>
        </template>
      </el-table-column>
    </el-table>
    

    知识点

    • 筛选
      • 表头 (el-table

        • filter-change
        <el-table
          :data="tableData"
          style=" 100%"
          @filter-change="handleFilter"
        >
        
      • 表格(el-table-column

        • 针对需要排序的列添加 :filters="Array[Object]" ,此处注意 Object 的格式必须为 {text: **, value: **} 键必须如此,暂时没有找到可以修改的api
          <el-table-column
            prop="date"
            label="日期"
            sortable="custom"
            min-width="180"
            :filters="dateList"
          >
          </el-table-column>
          
      • 设置默认值

        • filtered-value (作用在 el-table-column
        <el-table-column
          prop="tag"
          label="标签"
          min-width="100"
          :filters="flagList"
          :filtered-value="['公司']"
        >
        

        显示效果如下

    • 排序
      • 表头 (el-table)
        • sort-change
        <el-table
          :data="tableData"
          style=" 100%"
          @filter-change="handleFilter"
          @sort-change="handleSort"
        >
        
    • tbody (el-table-column)
      • sortable 设置为 :sortable="'custom'"
      <el-table-column
        prop="date"
        label="日期"
        :sortable="'custom'"
        min-width="180"
        :filters="dateList"
      >
      
    • 设置默认值
      • default-sort 参数 { order: **, prop: **}, `prop指那一列,order 指升序还是倒序

    显示效果如下

    至此,初步需求完成,现在就是具体细化了

    细化

    • 将未知的值都存入 vuex 中,便于全局控制

      • default-sort, filtered-value, filters

      default-sort, filtered-value 不能写死,因为是动态的请求参数,因而得注意了

      // component
      computed: mapState('elTable', [
        'flagList',
        'dateList',
        'filters',
        'sort'
      ])
      // vuex
      filters: [],
      sort: {
        order: '',
        prop: ''
      }
      
    • 方法,进行调用修改

      • 筛选过程中,无法很好定位到具体哪一列, 给当前列添加 column-key
      // vuex
      filtersDate: [],
      filtersTag: [],
      sort: {
        order: '',
        prop: ''
      }
      },
      mutations: {
        setFilters_date (state, data = []) {
          state.filtersDate = data
        },
        setFilters_tag (state, data = []) {
          state.filtersTag = data
        },
        setSort (state, data = {}) {
          state.sort = data
        }
      }
      // component
      methods: {
        ...mapMutations('elTable', [
          'setFilters_date',
          'setSort',
          'setFilters_tag'
        ]),
      
         handleFilter (filter) {
           // 拿到 key
           /**
            * 命名技巧罢了,只是关联
            */
          const key = Object.keys(filter)[0]
          this['setFilters_' + key](filter[key])
         },
         handleSort (column, prop, order) {
           console.log(column, prop, order)
         }
      },
      computed: mapState('elTable', [
        'flagList',
        'dateList',
        'filtersDate',
        'filtersFlag',
        'sort'
      ])
      

      上面主要是如何将几者之间进行关联罢了

    清除

    即要清除当前页面的数据,同时还要清除 vuex 里存的数据

    • clearFilter, clearSort
    // vuex
    clear (state) {
      state.filtersDate = []
      state.filtersTag = []
      state.sort = {
        order: '',
        prop: ''
      }
    }
    // component
    clearAll () {
     this.$refs.tb.clearFilter()
     this.$refs.tb.clearSort()
     this.clear()
    }
    

    • 是否是关联的页面
      created () {
          // 此处做判断,是否是其关联的页面,不是清除,是就不清除
          if (!isPage) return 
          this.clearAll()
      }
      

    总结

    • 可能还有些不完善,但是已经可以实现上述需求了
    • 有个问题, 筛选时,不点击筛选或重置,是无法在vuex中缓存,其实也很合理,vuex里存请求的数据,没点击也就没必要存储了

    2019-03-18补充

    由于设置 filtered-value时,有默认值,便会导致有时使用 clearFilter 方法时无法清除该值,看了下源码,感觉需要将筛选组件激活下才能使用,而一进页面是没有的,特别页面间跳转,再回来清除,基本没指望了。

    • 思路
      想了许久,既然方法不够用,那就让该组件重置即可,要不就刷新
      • 刷新 window.location.reload() 但是体验实在是不敢恭维,毕竟也面刷新,走的接口多,其次视觉效果也不是很好
      • 组件重置,这个才是我现在研究的对象
        • vue自带组件重置功能 $forceUpdate ,使用了却没有效果,因为不对子组件进行操作,所以排除
        • 人为重置,v-if 可以让组件重新渲染,在点击清除时v-if=flase 再给个几秒延迟设置v-if=true 便可以实现

        此处需要注意,使用$nextTick时,时间依旧不够,若是涉及到数据请求,放在数据请求回来时设置 v-if=true会更好

    虽然这些方法还不是最好的,但是还需要一步步继续前行了

  • 相关阅读:
    Linux第七周学习总结——可执行程序的装载
    《深入理解计算机系统》第七章读书笔记
    《Linux内核设计与实现》第三章读书笔记
    《Linux内核设计与实现》第十八章读书笔记
    Linux第六周学习总结——进程额管理和进程的创建
    Linux第五周学习总结——扒开系统调用的三层皮(下
    《Linux内核设计与实现》第五章读书笔记
    #Linux第四周学习总结——扒开系统调用的三层皮(上)
    《Linux内核设计与实现》第一二章读书笔记
    Linux第三周学习总结——构造一个简单的Linux系统MenuOS
  • 原文地址:https://www.cnblogs.com/sinosaurus/p/10420509.html
Copyright © 2011-2022 走看看