Bootstrap

vue el-table selection @select 多选 同时选中条件相同的行

两条数据,组方相同
选中其中一个,另一个也选中

<el-table :data="druglist" stripe border @select="selectRow" @selection-change="handleSelectionChange" 
        @row-click="rowClick" ref="drugTable" :cell-class-name="getstyle" id="OrderQueryTable" 
        :cell-style="{ height: '40px' }" :row-class-name="tableRowClassName">
       <el-table-column
        	type="selection"
         	width="45"
         ></el-table-column>
         <el-table-column
            prop="groupflag"
            width
            label="组方"
          ></el-table-column>
          <el-table-column
            prop="doflag"
            width
            label="标志"
          ></el-table-column>
       <el-table-column
            prop="ordertype"
            width
            label="状态"
          ></el-table-column>
          <el-table-column
            prop="orderflag"
            width
            label="类别"
          ></el-table-column>
</el-table>
selectRow(selection, row) {
		//selection: 已选的数组。
		//row: 当前点击或选中的行数据。
      this.currentRow = row;                    //orderno 根据数据替换
      let existsItem = selection.filter((s) => s.orderno == row.orderno);
      if (existsItem.length == 1) {
      					//this.druglist 全部数据
        for (let item1 of this.druglist) {
          if (
            row.setno == item1.setno &&
            row.setno != "0" &&
            row.setno != null &&
            row.orderno != item1.orderno &&
            row.orderflag1 != "Z"
          ) {
          	//drugTable 绑定在table上的ref
            this.$refs.drugTable.toggleRowSelection(item1, true);
          }
        }
      } else {
        for (let item1 of this.druglist) {
          if (
            row.setno == item1.setno &&
            row.setno != "0" &&
            row.setno != null &&
            row.orderno != item1.orderno &&
            row.orderflag1 != "Z"
          ) {
            this.$refs.drugTable.toggleRowSelection(item1, false);
          }
        }
      }
    },
rowClick(row, column, event) {
      let now_k =null;
      let tr =null;
      if(event.path==undefined){ 
        tr = $(event.currentTarget);
      }else{
        now_k = event.path[0];
        tr = $(now_k).parents("tr");
      } 
      let num = row.listNum;
      let _this = this;
      //加class到tr 
      if (tr.hasClass("s_clickLine")) {
        tr.removeClass("s_clickLine");
        _this.$refs.drugTable.toggleRowSelection(_this.druglist[num], false);
        //触发原有的同时绑定和解除事件
        _this.selectRow(_this.checkInfo, _this.druglist[num]);
      } else {
        tr.addClass("s_clickLine");
        _this.$refs.drugTable.toggleRowSelection(_this.druglist[num], true);
        //触发原有的同时绑定和解除事件
        _this.selectRow(_this.checkInfo, _this.druglist[num]);
      }
    },
handleSelectionChange(val) {
      let _this = this;
      this.checkInfo = val;
      _this.check_all_num = {};
      $.each(val, function (i, n) {
        _this.check_all_num[n.listNum] = n.listNum;
      });
    },

selectRow 函数以下是对这个函数的详细解释:

1. 参数:

selection: 包含已选项的数组。
row: 当前点击或选中的行数据。

2. 功能:

  • 设置当前行: 将传入的 row 设置为当前行(this.currentRow)。
  • 检查 selection 中是否存在与 row 有相同orderno 的项:
  • 使用 filter 方法从 selection 数组中筛选出与 row 有相同 orderno 的项,并存储在 existsItem 中。
  • 如果 existsItem 的长度为 1(即找到了一个匹配的项),则执行第一个 for 循环。
  • 否则,执行第二个 for 循环。

3. 第一个 for 循环:

  • 遍历 this.druglist(包含所有药品的列表)。

  • 对于 this.druglist 中的每一项 item1,检查以下条件:

  • row.setno 与 item1.setno 相同。

  • row.setno 不是 “0” 且不是 null。

  • row.orderno 与 item1.orderno 不同。

  • row.orderflag1 不是 “Z”。

  • 如果上述条件都满足,则使用 this.$refs.drugTable.toggleRowSelection(item1, true)
    来选择 item1。

4. 第二个 for 循环:

  • 它的逻辑与第一个 for 循环相似,但使用的是
    this.$refs.drugTable.toggleRowSelection(item1, false) 来取消选择 item1。

总结:

  • 当用户点击或选择某个 row 时,该函数首先检查 selection 中是否已存在与 row 有相同 orderno 的项。
  • 如果存在,则选择 this.druglist 中与 row 有相同 setno 但不同 orderno 的所有项(但排除
    orderflag1 为 “Z” 的项)。
  • 如果不存在,则取消选择这些项。

这种逻辑用于某种特定的场景,例如,当选择一个药品订单时,可能需要自动选择或取消选择与该订单属于同一套餐(由 setno 标识)的其他药品订单。

rowClick 的方法,它用于处理表格行点击事件。下面是对代码的详细解释:

1. 参数:

  • row: 被点击的行的数据对象。
  • column: 被点击的列的信息(但在这段代码中并未使用)。
  • event: 触发事件的 DOM 事件对象。

2. 变量声明:

  • now_k: 用于存储事件路径中的第一个元素(如果可用)。
  • tr: 用于存储被点击的 元素(表格行)。

3. 事件路径处理:

  • 检查 event.path 是否存在。如果 event.path 是 undefined(在某些浏览器中可能不存在 event.path),则使用 event.currentTarget 来获取被点击的元素(通常是一个子元素),并通过 .parents(“tr”) 找到它的父 元素。
  • 如果 event.path 存在,则取其第一个元素 now_k,并通过 .parents(“tr”) 找到它的父 元素。

4. 获取 listNum:

  • 从传入的 row 对象中获取 listNum 属性,它用于标识表格行的唯一编号。

5. 存储 this 引用:

  • 使用 _this 变量来存储 this 的引用,以便在后续的回调或函数中能够访问到正确的上下文。

6. 处理点击事件:

  • 检查 tr 是否已经有 s_clickLine 这个 CSS 类。
  • 如果有,则移除这个类,并通过 toggleRowSelection 方法取消选择对应的行(该方法用于切换行的选择状态)。
  • 接着,调用 selectRow 方法(用于处理选中行后的一些逻辑,比如更新其他行的选择状态)。
  • 如果 tr 没有 s_clickLine 这个 CSS 类,则添加这个类,并通过 toggleRowSelection 方法选择对应的行。
  • 同样地,之后调用 selectRow 方法处理选中行后的逻辑。
    注意:
  • event.path 不是所有浏览器都支持的标准属性。在一些浏览器中,你可能需要使用 event.composedPath() 来获取事件路径。

handleSelectionChange 的方法 下面是对代码的详细解释:

1. 变量声明:

  • let _this = this;: 创建一个局部变量 _this,并将其设置为当前对象(通常是 Vue 实例、React 组件或其他任何 JavaScript 对象)。这样做通常是为了在回调函数中能够访问外部作用域的 this,因为回调函数内部的 this 可能会改变其指向。

2. 更新属性:

  • this.checkInfo = val;: 将传入的 val 赋值给当前对象的 checkInfo 属性。

3. 初始化对象:

  • _this.check_all_num = {};: 使用 _this(即 this)初始化一个空对象 check_all_num。

4. 遍历并赋值:

  • 使用 jQuery 的 $.each 方法遍历 val 数组。对于 val 中的每个元素(这里用 n 表示),它执行一个回调函数。
  • function (i, n) { … }: 这是一个回调函数,其中 i 是索引(对于数组),n 是当前元素的值。
  • _this.check_all_num[n.listNum] = n.listNum;: 在这里,它尝试从当前元素 n 中访问 listNum 属性,并将该值作为键和值都添加到 _this.check_all_num 对象中。

总结:

  • handleSelectionChange 方法接收一个数组 val 作为参数。
  • 它将该数组赋值给当前对象的 checkInfo 属性。
  • 它初始化一个空对象 check_all_num。
  • 它遍历 val 数组,并将每个元素的 listNum 属性作为键和值添加到 check_all_num 对象中。

改进建议:

  • 如果你的目的是简单地检查 val 数组中的哪些 listNum 存在,并创建一个只包含这些键的对象,那么只需将 n.listNum 作为键,并可以为其赋予一个特定的值(例如 true),而不是再次使用 n.listNum 作为值。
    例如:
$.each(val, function (i, n) {  
  _this.check_all_num[n.listNum] = true; // 或其他你希望的值  
});

这样,check_all_num 对象将只包含 val 数组中元素的 listNum 属性作为键,每个键对应的值都是 true(或其他你指定的值)。

;