欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

ElementUI的el-table的多选的取消选择和筛选的取消所有过滤器之ref冲突问题

程序员文章站 2023-01-28 12:39:16
写此文的缘由:现如今,网络上,没有同下的解释形式(或者在外网,所以我没找到,或者大佬觉得太简单所以不屑解释)。然而,我认为这是对VUE+ElementUI的底层框架的理解深入化问题。(为什么要深入理解底层,来自学习java时留下的习惯,挖底层代码是常态) 在API文档中:

写此文的缘由:现如今,网络上,没有同下的解释形式(或者在外网,所以我没找到,或者大佬觉得太简单所以不屑解释)。然而,我认为这是对vue+elementui的底层框架的理解深入化问题。(为什么要深入理解底层,来自学习java时留下的习惯,挖底层代码是常态)

在api文档中:

<el-button @click="clearfilter">清除所有过滤器</el-button>
  <el-table
    ref="filtertable"
    :data="tabledata"
    style="width: 100%">
    <el-table-column
      prop="date"
      label="日期"
      sortable
      width="180"
      column-key="date"
      :filters="[{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'}]"
      :filter-method="filterhandler"
    >
    </el-table-column>
    <el-table-column
      prop="name"
      label="姓名"
      width="180">
    </el-table-column>

  

<el-table
    ref="multipletable"
    :data="tabledata"
    tooltip-effect="dark"
    style="width: 100%"
    @selection-change="handleselectionchange">
    <el-table-column
      type="selection"
      width="55">
    </el-table-column>
    <el-table-column
      label="日期"
      width="120">
      <template slot-scope="scope">{{ scope.row.date }}</template>
    </el-table-column>

  如果要同时使用取消选择和清空所有过滤器的话,按照api的例子,这里的ref是定义了不同的名字。

那么我遇到的问题,错误的认为,ref=“***”这里对应的是不同key值对应的不同value;

实际上:不论这的ref=“**”,ref等于任何一个字符串,只是将ref这个{key,value}中的key赋值,不论key赋给什么值,都会指向定位到唯一的value;

从实际例子上看:

api代码中:

toggleselection(rows) {
        if (rows) {
          rows.foreach(row => {
            this.$refs.multipletable.togglerowselection(row);
          });
        } else {
          this.$refs.multipletable.clearselection();
        }
      }

  多选的取消选择定义的ref的key名叫multipletable,而筛选里:

clearfilter() {
        this.$refs.filtertable.clearfilter();
      }

  取名叫filtertable,这里只是取名问题,取key值名叫什么什么的情况,其对应的value的属性是不变的;

所以,可以写成以下这种情况:

<el-table
      :data="tabledata"
      stripe
      border
      ref="multipletable"
      tooltip-effect="dark"
      style="width: 100%"
      height="420"
      @selection-change="handleselectionchange">
      <el-table-column
        type="selection"
        width="55">
      </el-table-column>
......
    toggleselection (rows) {
      if (rows) {
        rows.foreach(row => {
          this.$refs.multipletable.togglerowselection(row)
        })
      } else {
        this.$refs.multipletable.clearselection()
      }
    },
    handleselectionchange (val) {
      this.multipleselection = val
    },
    clearfilter () { // 清空全部筛选
      this.$refs.multipletable.clearfilter()
    }

  附上底层vue代码:

export interface vue {
  readonly $el: element;
  readonly $options: componentoptions<vue>;
  readonly $parent: vue;
  readonly $root: vue;
  readonly $children: vue[];
  readonly $refs: { [key: string]: vue | element | vue[] | element[] };
  readonly $slots: { [key: string]: vnode[] | undefined };
  readonly $scopedslots: { [key: string]: normalizedscopedslot | undefined };
  readonly $isserver: boolean;
  readonly $data: record<string, any>;
  readonly $props: record<string, any>;
  readonly $ssrcontext: any;
  readonly $vnode: vnode;
  readonly $attrs: record<string, string>;
  readonly $listeners: record<string, function | function[]>;
......