element表格多选和单选、选中高亮处理、保存多页选中记录和翻页回显选中

【element-ui组件】一.elementUI组件在使用时的问题;二.elementUI的消息组件;三.Form表单;四.Dialog组件 【element-ui组件】一.elementUI组件在使用时的问题;二.elementUI的消息组件;三.Form表单;四.Dialog组件 阅读详情

环境:

  • element-ui@2.13.2

  • vue@2.6.6

示例:

1. 表格单选

  • 方案1
    <template>
    <div class="radio_page">
      <div class="selected_num">已选 {{selectedRow.name}}</div>
      <el-table
        :data="list"
        ref="table"
        :border="true"
        v-loading="loading"
        :row-class-name="rowClassName"
        @select="selectItem">
        <el-table-column
          type="selection"
          width="50">
        </el-table-column>
        <el-table-column
          prop="name"
          label="姓名">
        </el-table-column>
        <el-table-column
          prop="age"
          label="年龄">
        </el-table-column>
      </el-table>
      <el-pagination
        v-if="total"
        :total="total"
        :current-page.sync="pageNo"
        :page-size="limit"
        @current-change="handleCurrentChange">
      </el-pagination>
    </div>
    </template>
    <script>
    export default {
      data() {
        return {
          total: 100,
          pageNo: 1,
          limit: 10,
          selectedId: null, // 选中数据id
          selectedRow: {}, // 选中数据
          list: [], // 表格数据
          loading: false, // 加载标记
        }
      },
      methods: {
        init() {
          this.getList();
        },
        // 模拟接口获取数据
        getList() {
          if (this.loading) return;
          this.loading = true;
          setTimeout(() => {
            this.list = this.createList();
            this.loading = false;
            this.updateTableSelect();
          }, 1000);
        },
        // 生成数据
        createList() {
          const { pageNo, limit } = this;
          const res = [];
          const baseNum = limit * (pageNo - 1);
          for (let i = 0; i < limit; i++) {
            res.push({
              id: baseNum + i,
              name: '姓名' + (baseNum + i),
              age: baseNum + i
            })
          }
          return res;
        },
        // 接口返回数据后更新选中状态
        updateTableSelect() {
          this.$nextTick(() => {
            const list = this.list;
            const selectedRow = this.selectedRow;
            const needUpdate = list.find(item => {
              if (selectedRow && selectedRow.id == item.id) {
                return true;
              }
              return false;
            });
            if (needUpdate) {
              this.$refs.table.toggleRowSelection(needUpdate, true)
            }
          })
        },
        // 标记选中行增加特殊类
        rowClassName({row}) {
          const selectedRow = this.selectedRow;
          if (selectedRow && selectedRow.id == row.id) {
            return 'green';
          }
          return '';
        },
        // 单行切换选中状态处理
        selectItem(selection, row) {
          this.$refs.table.clearSelection()
          this.$nextTick(() => {
            this.$refs.table.toggleRowSelection(row, true);
            this.selectedRow = row;
          })
        },
        // 分页器页码变化
        handleCurrentChange(page) {
          this.pageNo = page;
          this.getList();
        },
      },
      created() {
        this.init();
      },
    }
    </script>
    <style lang="stylus">
    .radio_page{
      .green{
        background-color: #ddf7dd;
      }
      .el-table__header .el-checkbox{
        display none
      }
    }
    </style>
    
  • 方案2
    <template>
    <div class="radio_page">
      <div class="selected_num">已选 {{selectedRow.name}}</div>
      <el-table
        :data="list"
        ref="table"
        :border="true"
        v-loading="loading"
        :row-class-name="rowClassName">
        <el-table-column label="" align="center" width="50">
          <template scope="scope">
            <el-radio :label="scope.row.id" v-model="selectedId" @change.native="selectItem(scope.row)"></el-radio>
          </template>
        </el-table-column>
        <el-table-column
          prop="name"
          label="姓名">
        </el-table-column>
        <el-table-column
          prop="age"
          label="年龄">
        </el-table-column>
      </el-table>
      <el-pagination
        v-if="total"
        :total="total"
        :current-page.sync="pageNo"
        :page-size="limit"
        @current-change="handleCurrentChange">
      </el-pagination>
    </div>
    </template>
    <script>
    export default {
      data() {
        return {
          total: 100,
          pageNo: 1,
          limit: 10,
          selectedId: null, // 选中数据
          selectedRow: {}, // 选中数据
          list: [], // 表格数据
          loading: false, // 加载标记
        }
      },
      methods: {
        init() {
          this.getList();
        },
        // 模拟接口获取数据
        getList() {
          if (this.loading) return;
          this.loading = true;
          setTimeout(() => {
            this.list = this.createList();
            this.loading = false;
          }, 1000);
        },
        // 生成数据
        createList() {
          const { pageNo, limit } = this;
          const res = [];
          const baseNum = limit * (pageNo - 1);
          for (let i = 0; i < limit; i++) {
            res.push({
              id: baseNum + i,
              name: '姓名' + (baseNum + i),
              age: baseNum + i
            })
          }
          return res;
        },
        // 标记选中行增加特殊类
        rowClassName({row}) {
          const selectedRow = this.selectedRow;
          if (selectedRow && selectedRow.id == row.id) {
            return 'green';
          }
          return '';
        },
        // 单行切换选中状态处理
        selectItem(row) {
          this.selectedRow = row;
        },
        // 分页器页码变化
        handleCurrentChange(page) {
          this.pageNo = page;
          this.getList();
        },
      },
      created() {
        this.init();
      },
    }
    </script>
    <style lang="stylus">
    .radio_page{
      .green{
        background-color: #ddf7dd;
      }
      .el-radio__label{
        display: none;
      }
    }
    </style>
    

2. 表格多选

<template>
<div class="check_page">
  <div class="selected_num">已选 {{selection.length}} 人</div>
  <el-table
    :data="list"
    ref="table"
    :border="true"
    v-loading="loading"
    :row-class-name="rowClassName"
    @select="selectItem"
    @select-all="selectAll"
    @selection-change="selectionChange">
    <el-table-column
      type="selection"
      width="50">
    </el-table-column>
    <el-table-column
      prop="name"
      label="姓名">
    </el-table-column>
    <el-table-column
      prop="age"
      label="年龄">
    </el-table-column>
  </el-table>
  <el-pagination
    v-if="total"
    :total="total"
    :current-page.sync="pageNo"
    :page-size="limit"
    @current-change="handleCurrentChange">
  </el-pagination>
</div>
</template>
<script>
export default {
  data() {
    return {
      total: 100,
      pageNo: 1,
      limit: 10,
      selection: [], // 选中数据
      list: [], // 表格数据
      loading: false, // 加载标记
      selectRow: new Map(), // 标记当前选中行
    }
  },
  methods: {
    init() {
      this.getList();
    },
    // 模拟接口获取数据
    getList() {
      if (this.loading) return;
      this.loading = true;
      setTimeout(() => {
        this.list = this.createList();
        this.updateTableSelect();
        this.loading = false;
      }, 1000);
    },
    // 生成数据
    createList() {
      const { pageNo, limit } = this;
      const res = [];
      const baseNum = limit * (pageNo - 1);
      for (let i = 0; i < limit; i++) {
        res.push({
          id: baseNum + i,
          name: '姓名' + (baseNum + i),
          age: baseNum + i
        })
      }
      return res;
    },
    // 接口返回数据后更新选中状态
    updateTableSelect() {
      const selection = this.selection;
      if (!selection.length) return;
      this.$nextTick(() => {
        const list = this.list;
        const selectionMap = new Map();
        selection.forEach(item => {
          selectionMap.set(item.id, 1);
        });
        const needUpdate = list.filter(item => {
          if (selectionMap.has(item.id)) {
            return true;
          }
          return false;
        });
        needUpdate.forEach(item => {
          this.$refs.table.toggleRowSelection(item, true)
        });
      })
    },
    // 标记选中行增加特殊类
    rowClassName({row}) {
      const selectRow = this.selectRow;
      if (selectRow.has(row.id)) {
        return 'green';
      }
      return '';
    },
    // 单行切换选中状态处理
    selectItem(selection, row) {
      const selected = selection.find(item => item.id == row.id);
      if (selected) {
        this.selection = [ ...this.selection, row ];
      } else {
        this.selection = this.selection.filter(item => item.id != row.id)
      }
    },
    // 全选、全取消处理
    selectAll(newSelected) {
      if (newSelected.length == 0) {
        const cancelMap = new Map();
        this.list.forEach(item => {
          cancelMap.set(item.id, item);
        });
        const newSelected = this.selection.filter(item => {
          if (cancelMap.has(item.id)) {
            return false;
          }
          return true;
        });
        this.selection = [...newSelected];
      } else {
        const selectedMap = new Map();
        newSelected.forEach(item => {
          selectedMap.set(item.id, item);
        });
        const oldSelected = this.selection.filter(item => {
          if (selectedMap.has(item.id)) {
            return false;
          }
          return true;
        })
        this.selection = [...oldSelected, ...newSelected];
      }
    },
    // 选中状态变化,只会记录当前页,因此用于生成当前页选中行数据
    selectionChange(selection) {
      const newMap = new Map();
      selection.forEach(item => {
        newMap.set(item.id, item)
      });
      this.selectRow = newMap;
    },
    // 分页器页码变化
    handleCurrentChange(page) {
      this.pageNo = page;
      this.getList();
    },
  },
  created() {
    this.init();
  },
}
</script>
<style lang="stylus">
.check_page{
  .green{
    background-color: #ddf7dd;
  }
}
</style>
注意:

更新选中状态都是放到了$nextTick里面,否则选中行高亮会有问题。

Axure高保真下拉列表原型:从单选、多选到树形结构的完整实现方案 在界面设计与原型制作领域,下拉列表是用户交互的核心组件之一,广泛应用于表单填写、数据筛选和设置选项等场景。其基本原理是通过触发事件切换显示状态,实现用户从预设列表中选择一个或多个项目。从技术价值看,高保真交互原型能精准传达设计意图,显著提升产品评审效率和开发还原度。在应用层面,无论是Web端的Element UI、Vant,还是移动端的原生组件,下拉列表的复杂交互逻辑都需在原型阶段充分验证。本文聚焦于利用Axure动态面板和中继器,系统构建支持单选、多选及树形结构的高保真下拉列表方案,解决产品设计中交互逻辑 阅读详情

相关推荐

Python Selenium自动化填表:从环境搭建到批量处理实战

浏览器自动化是提升Web操作效率的核心技术,其原理是通过程序指令模拟真实用户对浏览器的交互行为。这项技术的核心价值在于将重复、耗时的网页操作(如数据录入、功能测试)转化为可编程、可复用的自动化流程,从而解放人力,减少错误。在数据采集、系统测试、RPA(机器人流程自动化)及日常办公自动化等场景中,浏览器自动化扮演着关键角色。本文聚焦于利用Python和Selenium这一经典组合,深入讲解如何实现网页表单的自动化填写,特别是针对包含下拉框、单选框、复选框及文件上传等复杂元素的表单,提供从环境配置、元素定位到批

weixin_34375251的博客 465

Vue+ElementUI el-radio列表单选

实现效果: 对某条数据进行数据修改 步骤: 1、添加单选按钮:(点击获取该条信息的id,并将id传给修改按钮) div. <span size="mini" class="select-button" @click="handleItem" v-loading="loadingButton" element-loading-spinner="el-icon-loading">修改信息</span> <el-table size="mini" :data="list

Bling Bling ~~ 2889

VB+SeleniumBasic浏览器自动化:从环境搭建到实战项目架构

浏览器自动化是提升Web操作效率的核心技术,其原理是通过程序模拟用户操作,控制浏览器执行点击、输入、导航等行为。这项技术的价值在于能够将重复、繁琐的网页操作自动化,从而解放人力,提升数据处理和系统集成的效率。在金融、运营、IT支持等涉及大量网页报表处理或老旧系统集成的应用场景中,自动化脚本能显著减少人工错误和工作负担。本文聚焦于在VB/VBA环境中,通过SeleniumBasic这一COM组件实现现代浏览器自动化,详细介绍了从环境搭建、元素定位、等待机制到表单处理、数据提取等关键实践,并深入探讨了项目架构、

weixin_30896825的博客 427

element table组件实现单选,单选回显操作

最近开发遇到一个需求:选择表格的一条数据在表格外进行操作,还有一个最令人痛疼的是回显数据,要把选中的那条数据的radio按钮高亮展示,最近刚好有时间整理了一下,大家可以去借鉴一下。 ...

qwyio的博客 4771

Selenium点击无响应?八大解决方案与深度排查指南

在Web自动化测试与数据抓取中,元素定位与交互是核心基础。其原理在于通过浏览器驱动模拟用户操作,与页面DOM及JavaScript事件机制进行通信。这项技术的价值在于实现流程自动化、提升测试效率与数据采集的可靠性。然而,在实际工程实践中,尤其是在处理现代动态Web应用时,常会遇到元素定位成功但点击无响应的棘手问题。这通常涉及元素状态、事件监听、异步加载等复杂场景。本文聚焦Selenium自动化测试中的点击失效难题,系统剖析了其根源,并提供了从强化等待策略、执行JavaScript点击到使用ActionCha

weixin_30315905的博客 405

VB开发者浏览器自动化指南:SeleniumBasic环境搭建与实战应用

浏览器自动化是现代软件开发和测试中的关键技术,它通过模拟用户操作实现网页交互的自动化。其核心原理是WebDriver协议,它作为浏览器与自动化脚本之间的桥梁,允许程序化控制浏览器行为。这项技术的价值在于能够显著提升重复性Web操作的效率,确保测试的一致性和准确性,广泛应用于数据抓取、自动化测试和业务流程自动化等场景。对于VB开发者而言,SeleniumBasic是一个关键的COM库,它将WebDriver的强大能力无缝集成到VB6和VB.NET开发环境中。通过SeleniumBasic,开发者无需切换技术栈

weixin_30892889的博客 496

实现Element的table表格选中点击下一页回来保持选中

【代码】实现Element的table表格选中点击下一页回来保持选中。

m0_72270036的博客 940

Selenium动态网页爬虫实战:从环境搭建到反反爬策略

网络爬虫是自动化获取互联网公开数据的关键技术,其核心原理是模拟客户端向服务器发送请求并解析响应。对于静态网页,传统的请求-解析模式效率很高。然而,随着Web 2.0技术的发展,大量网站采用JavaScript动态渲染内容,数据在初始HTML中并不存在,这给传统爬虫带来了挑战。此时,浏览器自动化工具的价值便凸显出来,它能够驱动真实浏览器执行JavaScript,完整渲染页面后再提取数据,从而有效解决动态内容抓取难题。Selenium作为主流的浏览器自动化工具,在Python爬虫生态中扮演着重要角色,尤其适用于

aoe41606的博客 533

elementui中el-table中selection框选中的回显(带有expand的table)

el-table-column show-overflow-tooltip prop="chemicalName align="center label="化 学品名称">//toggleRowExpansion展开扩展按钮,展开后会调用handleExpandChange方法。选中的项自动展开,点击新增按钮打开dialog并进行选中项的展开和选中回显。-- 表格数据的分页的功能 -->//chooseData可选的列表数据。//tableData选中项集合。// 备份一下选中数据。

qq_45750213的博客 3177

Selenium核心函数深度解析:从自动化测试到数据抓取

Web自动化测试与数据抓取是现代软件开发与数据分析中的关键技术,其核心在于模拟真实用户与浏览器的交互行为。Selenium作为该领域的标准工具,其底层实现基于W3C WebDriver协议,通过将浏览器抽象为可远程控制的对象,提供了一套完整的API体系。理解Selenium的核心函数,如元素定位、等待机制、浏览器生命周期管理等,不仅能提升脚本的稳定性和执行效率,还能有效应对动态内容加载、反爬策略等复杂场景。掌握这些函数,意味着开发者可以从基础的脚本录制进阶到自动化架构设计,为构建健壮的UI自动化测试用例或可

weixin_34212762的博客 354

一个低代码拖拉拽的表单编辑器,开源咯!!!

Everright-formEditor是一个基于vue3的可视化表单编辑器,依赖于element-plus和vant进行开发。内部提供了适配器进行参数转码,在form editor通过拖拉拽的方式轻松实现一个表单,生成JSON。

weixin_54424699的博客 888

【vue】el-table 优化单选效果,加入el-radio

前言: 开发中经常遇到需要列表单选的情况,先前我用的是CheckBox,通过el-table自带的 selection-change 方法中的逻辑处理来实现单选效果,但这有个缺点就是 当点击全选按钮时,方法中设定的逻辑就不好用了,导致页面只选中一条,而取值却取到了所有。 今天有点时间,对这个做个改造,顺手记录下。 解决办法: 由element api中的table组件api(https://element.eleme.cn/#/zh-CN/compon...

_修铁路的、的博客 7074

PC桌面端UI设计规范:从核心原则到组件落地的完整指南

UI设计规范是构建一致、高效用户体验的基石,它通过定义统一的设计语言、组件和交互模式,确保产品在视觉和操作上保持协调。其原理在于将设计决策系统化、模块化,从而提升开发效率、降低维护成本,并保证不同团队间的协作顺畅。在技术价值上,一套成熟的设计系统能显著加速产品迭代,保障品牌一致性,并优化用户的学习曲线。在应用场景中,尤其在信息密集、操作复杂的PC桌面端——如企业级SaaS软件、开发工具、内容管理系统等生产力工具中,规范的指导作用尤为关键。本文聚焦于PC桌面端这一特定领域,深入探讨如何针对大屏幕、键鼠交互、多

weixin_34161083的博客 464

elementUI表格单选(radio)

elementUI表格单选(radio),官网上有案例,但不是我想要的样式,改动后,记录一下

wang_59881的博客 3656

使用 ANSYS 实现铸造、凝固和熔炼的高级解决方案

凭借其强大的有限元分析 (FEA) 和计算流体动力学 (CFD) 功能,ANSYS 可以准确预测模具内的热和流体流动行为。总之,ANSYS 是铸件凝固和熔化领域的关键工具。其全面的仿真功能、工艺优化功能、材料特性分析和用户友好的界面使其成为旨在创新和改进制造工艺的工程师不可或缺的工具。通过利用 ANSYS,各行各业可以在铸造业务中实现更高的质量、效率和成本效益,从而为先进的制造解决方案铺平道路。ANSYS是一款领先的工程仿真软件,提供强大的功能来建模和优化这些复杂的热过程,从而显著提高生产效率和质量。

jkh920184196的博客 2108

扫码器USB键盘报告描述符数据格式解析

Byte0用于判断Shift是否按下,当按下时Byte0的Bit1会置1,即0x02,若未按下,Bit为0,即0x00。0x00 0x00 0x00 0x00 0x00 0x00 0x00--->>未按下Shift。0x00 0x00 0x00 0x00 0x00 0x00 0x00--->>按下Shift。0x00 0x04 0x00 0x00 0x00 0x00 0x00--->>输出A。0x00 0x04 0x00 0x00 0x00 0x00 0x00--->>输出a。

m0_65548585的博客 1141

element 表格自动滚动加载数据_后台产品PRD系列(1):如何设计优秀的数据报表?...

在后台产品中,数据报表的重要性毋庸置疑,不过优秀的数据表单并不多见,所以本文就从基础功能、体验升级两方面来聊聊如何设计一个优秀的数据报表。数据报表一直是后台产品的重要组件,相较于复杂的业务处理逻辑来讲算是非常简单了,简单到我们都不乐意花太多的时间去审视它。现实情况却是:PRD整好交给开发后,开发又抛来各种问题,上线后的功能可以满足业务需求却总又有那么点不如意,然而出于各种原因也就将就着用了,所以设...

weixin_39874809的博客 264

RDD2022 数据格式转换与清洗

Rdd2022数据集,是关于道路损伤的数据集,与rdd2020相比增加了两万多张图片但是由于格式不能被yolo直接使用且其中有大量的图片没有符合要求的标注,特写此文章记录数据清洗与格式化的过程。

蓝胖子的博客 9945

封装elementui的table的合并方法

主要是记录一下span-method的封装,在此过程中发现emit是无返回值的,这里的解决方案是使用回调函数来实现的。以后有好的方法在补充。

xixi_csdn的博客 336

零基础玩转NILM:用nilmtk提取UKDALE电器数据的保姆级教程

本文为零基础用户提供了一份详细的NILM入门指南,重点讲解如何使用nilmtk工具包从UKDALE数据集中提取电器级用电数据。教程涵盖环境搭建、核心概念解析、数据提取实战及常见问题排查,帮助读者快速掌握非侵入式负荷监测的数据预处理关键步骤。

rgv234567的博客 498

Fastp实战指南:高效处理fastq数据的质控技巧

本文是Fastp实战指南,详细介绍了如何使用Fastp工具高效处理fastq数据的质控技巧。从数据清洗的必要性、基础命令解析,到高级参数定制、UMI数据处理及批量自动化流程,提供一站式解决方案。Fastp以其“All-in-One”的快速质控能力,帮助用户确保测序数据质量,为后续生物信息学分析奠定可靠基础。

weixin_29254029的博客 387

Avue-crud 实战指南:核心属性、方法与高级配置解析

在 Vue.js 中后台管理系统开发中,CRUD(增删改查)页面是核心且高频的需求。其原理是通过组件化封装,将列表、表单、弹窗、搜索、分页等通用交互模式抽象为可配置的模块,从而提升开发效率和维护性。这种配置化方案的技术价值在于,它通过声明式的 JSON 配置替代了大量重复的命令式代码,实现了关注点分离,让开发者能更专注于业务逻辑。其典型应用场景包括用户管理、订单处理、内容审核等各类数据管理后台。本文聚焦于基于 Vue 和 Element UI 的 Avue-crud 组件,深入剖析其核心配置属性如 `opt

weixin_30536513的博客 377

DataWorks数据安全治理最佳实践

DataWorks基于数据安全治理的常见思路,针对资产梳理、技术体系建设和运营体系建设,提供了一系列数据安全产品能力,您可通过“基础防护建设、数据安全防护措施及策略增强建设、数据安全持续运营”三个阶段在DataWorks上落地数据安全治理项目。参考本文启动数据安全治理项目前,建议您先了解DataWorks数据安全产品相关能力了解DataWorks数据安全产品能力后,您可参考如下三个阶段在DataWorks上落地数据安全治理项目。

soso1968的博客 1438
上一篇: 自定义指令函数传参
下一篇: gitignore不生效
xiaojinglyd
博客等级 码龄9年 6粉丝 29原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值