element-ui中@selection-change执行两次

问题描述

行内处理数据也就是:

data="roleData.filter((data) => !serarchText || data.name.includes(serarchText))"和type="selection"

共存的时候执行出错,@selection-change执行了两次

我最近再试这段代码发现并没有执行两次,element-plus好像修复了这个??

<template>
  <div>
    <div>
      <el-input clearable placeholder="搜索..." prefix-icon="el-icon-search" v-model="serarchText"></el-input>
    </div>
    <el-table border stripe
              :data="roleData.filter((data) => !serarchText || data.name.includes(serarchText))"
              :header-cell-style="{background:'#409EFF',color:'#FFF'}"
              @selection-change="handleRoleChange">
      <el-table-column align="center" type="selection" width="50" />
      <el-table-column align="center" label="ID" prop="id" width="50" />
      <el-table-column align="center" label="角色名称" prop="name" width="150" />
      <el-table-column align="center" label="角色代码" prop="code" width="120" />
    </el-table>
  </div>
</template>
<script lang="ts" setup>
import { reactive, ref, watch } from "vue";
const roleData = ref();
roleData.value = [
  {
    id: 1,
    code: "ROLE_TEST0_1",
    name: "测试角色3",
    enabled: true,
  },
  {
    id: 3,
    code: "ROLE_TEST0_3",
    name: "系统开发员",
    enabled: true,
  },
];
let roleSelectedData = ref([]);
let serarchText = ref();
const handleRoleChange = (value: any) => {
  roleSelectedData.value = value;
  console.log(value);//选择selection框 两次执行
};
</script>

我暂且认为应该是行内处理数据的时候 (就是行内处理data),每一次修改table相关数据或者变量,会重新加载数据(触发行内数据处理)从而触发table的更新,导致两次执行,一次有你操作的数据,一次是重置table。

所以有两种方法解决,第一种是不触发table的更新,还有一种是更新后,获取第一次触发的结果。

  • 如果不是因为行内处理数据引起,则直接看第二种方法

第一种方法就是,改变你data的数据处理方式,不在行内进行数据处理。

<el-input clearable placeholder="搜索..." prefix-icon="el-icon-search" v-model="serarchText"></el-input>
<el-table border stripe
     :data="transData"
     :header-cell-style="{background:'#409EFF',color:'#FFF'}"
     @selection-change="handleRoleChange"
>
</el-table>
<script lang="ts" setup>
const roleData = ref();
roleData.value = [
  {
    id: 1,
    code: "ROLE_TEST0_1",
    name: "测试角色3",
    enabled: true,
  },
  {
    id: 3,
    code: "ROLE_TEST0_3",
    name: "系统开发员",
    enabled: true,
  },
];
let serarchText = ref();
const transData = ref([...roleData.value])
watch(serarchText,(newValue)=>{
  if(newValue){
    let tempdata = roleData.value
    transData.value = tempdata.filter((data) => !newValue || data.name.includes(newValue))
  }else{
    transData.value =roleData.value
  }
})
</script>

第二种就是继续使用行内数据处理,table添element-ui内自带的属性 加row-key以及type="selection"添加reserve-selection,在数据更新之后保留第一次触发的数据。

  • reserve-selection:仅对 type=selection 的列有效,类型为 Boolean,为 true 则会在数据更新之后保留之前选中的数据(需指定 row-key)
  • row-key:行数据的 Key,用来优化 Table 的渲染;在使用 reserve-selection 功能与显示树形数据时,该属性是必填的。
<el-table border stripe
          :data="roleData.filter((data) => !serarchText || data.name.includes(serarchText))"
          :header-cell-style="{background:'#409EFF',color:'#FFF'}"
          @selection-change="handleRoleChange"
          :row-key="(row)=>{row.id}">
  <el-table-column align="center" type="selection" :reserve-selection="true" width="50" />
  <el-table-column align="center" label="ID" prop="id" width="50" />
  <el-table-column align="center" label="角色名称" prop="name" width="150" />
  <el-table-column align="center" label="角色代码" prop="code" width="120" />
</el-table>

最近试这个:reserve-selection=“true”,会导致在搜索值变化的时候,造成所选值的更改反转之类的

element-ui的@selection-change学习总结

<template>
  <el-table
    ref="multipleTable"
    :data="tableData3"
    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>
    <el-table-column
      prop="name"
      label="姓名"
      width="120">
    </el-table-column>
    <el-table-column
      prop="address"
      label="地址"
      show-overflow-tooltip>
    </el-table-column>
  </el-table>
  <div style="margin-top: 20px">
    <el-button @click="toggleSelection([tableData3[1], tableData3[2]])">切换第二、第三行的选中状态</el-button>
    <el-button @click="toggleSelection()">取消选择</el-button>
  </div>
</template>
 
<script>
  export default {
    data() {
      return {
        tableData3: [{
          date: '2016-05-03',
          name: '王小虎',
          address: '上海市普陀区金沙江路 1518 弄'
        }, {
          date: '2016-05-02',
          name: '王小虎',
          address: '上海市普陀区金沙江路 1518 弄'
        }, {
          date: '2016-05-04',
          name: '王小虎',
          address: '上海市普陀区金沙江路 1518 弄'
        }, {
          date: '2016-05-01',
          name: '王小虎',
          address: '上海市普陀区金沙江路 1518 弄'
        }, {
          date: '2016-05-08',
          name: '王小虎',
          address: '上海市普陀区金沙江路 1518 弄'
        }, {
          date: '2016-05-06',
          name: '王小虎',
          address: '上海市普陀区金沙江路 1518 弄'
        }, {
          date: '2016-05-07',
          name: '王小虎',
          address: '上海市普陀区金沙江路 1518 弄'
        }],
        multipleSelection: []
      }
    },
 
    methods: {
      toggleSelection(rows) {
        if (rows) {
          rows.forEach(row => {
            this.$refs.multipleTable.toggleRowSelection(row);
          });
        } else {
          this.$refs.multipleTable.clearSelection();
        }
      },
      handleSelectionChange(val) {
        this.multipleSelection = val;
      }
    }
  }
</script>
handleSelectionChange(val) { this.multipleSelection = val; }

//val 为选中数据的集合

通过this.multipleSelection.prop字段 取得每一个选项的值,prop字段就是表格里面子项的prop值。

this.multipleSelection.length为选择了多少项。 

以上为个人经验,希望能给大家一个参考,也希望大家多多支持Devmax。

关于element-ui中@selection-change执行两次的问题的更多相关文章

  1. element-ui中导航组件menu的一个属性:default-active说明

    这篇文章主要介绍了element-ui中导航组件menu的一个属性:default-active说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

  2. 关于Element-UI Table 表格指定列添加点击事件

    这篇文章主要介绍了关于Element-UI Table 表格指定列添加点击事件,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

  3. 解决element-ui的el-select选择器的@blur事件失效的坑

    这篇文章主要介绍了解决element-ui的el-select选择器的@blur事件失效的坑,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

  4. element-ui滚动条el-scrollbar置底方式

    这篇文章主要介绍了element-ui滚动条el-scrollbar置底方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

  5. 关于element-ui中@selection-change执行两次的问题

    这篇文章主要介绍了关于element-ui中@selection-change执行两次的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

  6. element ui循环调用this.$alert 消息提示只显示最后一个

    这篇文章主要介绍了element ui循环调用this.$alert 消息提示只显示最后一个,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  7. Vue element-ui中表格过长内容隐藏显示的实现方式

    在Vue项目中,使用ElementUI渲染表格数据时,如果某一个列数值长度超过列宽,会默认换行,造成显示不友好,下面这篇文章主要给大家介绍了关于Vue element-ui中表格过长内容隐藏显示的实现方式,需要的朋友可以参考下

  8. Vue element-UI el-select循环选中的问题

    这篇文章主要介绍了Vue element-UI el-select循环选中的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

  9. Vue+Element-ui弹窗 this.$alert is not a function问题

    这篇文章主要介绍了Vue+Element-ui弹窗 this.$alert is not a function问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

  10. element-ui tree 异步树实现勾选自动展开、指定展开、指定勾选功能

    这篇文章主要介绍了element-ui tree 异步树实现勾选自动展开、指定展开、指定勾选,项目中用到了vue的element-ui框架,用到了el-tree组件,由于数据量很大,使用了数据懒加载模式,即异步树,需要的朋友可以参考下

随机推荐

  1. js中‘!.’是什么意思

  2. Vue如何指定不编译的文件夹和favicon.ico

    这篇文章主要介绍了Vue如何指定不编译的文件夹和favicon.ico,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

  3. 基于JavaScript编写一个图片转PDF转换器

    本文为大家介绍了一个简单的 JavaScript 项目,可以将图片转换为 PDF 文件。你可以从本地选择任何一张图片,只需点击一下即可将其转换为 PDF 文件,感兴趣的可以动手尝试一下

  4. jquery点赞功能实现代码 点个赞吧!

    点赞功能很多地方都会出现,如何实现爱心点赞功能,这篇文章主要为大家详细介绍了jquery点赞功能实现代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  5. AngularJs上传前预览图片的实例代码

    使用AngularJs进行开发,在项目中,经常会遇到上传图片后,需在一旁预览图片内容,怎么实现这样的功能呢?今天小编给大家分享AugularJs上传前预览图片的实现代码,需要的朋友参考下吧

  6. JavaScript面向对象编程入门教程

    这篇文章主要介绍了JavaScript面向对象编程的相关概念,例如类、对象、属性、方法等面向对象的术语,并以实例讲解各种术语的使用,非常好的一篇面向对象入门教程,其它语言也可以参考哦

  7. jQuery中的通配符选择器使用总结

    通配符在控制input标签时相当好用,这里简单进行了jQuery中的通配符选择器使用总结,需要的朋友可以参考下

  8. javascript 动态调整图片尺寸实现代码

    在自己的网站上更新文章时一个比较常见的问题是:文章插图太宽,使整个网页都变形了。如果对每个插图都先进行缩放再插入的话,太麻烦了。

  9. jquery ajaxfileupload异步上传插件

    这篇文章主要为大家详细介绍了jquery ajaxfileupload异步上传插件,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  10. React学习之受控组件与数据共享实例分析

    这篇文章主要介绍了React学习之受控组件与数据共享,结合实例形式分析了React受控组件与组件间数据共享相关原理与使用技巧,需要的朋友可以参考下

返回
顶部