react antd table表格点击一行选中数据的方法

news2025/1/18 3:27:50

一、前言

在这里插入图片描述

antd的table,默认是点击左边的单选/复选按钮,才能选中一行数据;

现在想实现点击右边的部分,也可以触发操作选中这行数据。

可以使用onRow实现,样例如下。

二、代码

1.表格样式部分

//表格table样式部分

{isRadio ?
                <Table
                dataSource={data.list}
                onRow={(record) => ({
                  onClick: () => {
                    this.selectRow(record);
                  },
                })}
                rowSelection={{
                  type: 'radio',
                  selectedRowKeys: selectedIdsInSearchTab,
                  //onChange: this.onSelectChange,
                }} // 表格是否可复选,加type是单选,去掉是多选
                columns={this.getColumns()}
                rowKey={record => record.id}
                pagination={false}
                loading={loading}
                size="middle"
                bordered
                scroll={{ x: 1100 }}
              /> 
          :
              <Table
              dataSource={data.list}
              onRow={(record) => ({
                onClick: () => {
                  this.selectRow(record);
                },
              })}
              rowSelection={{
                selectedRowKeys: selectedIdsInSearchTab,
                //onChange: this.onSelectChange,
              }} // 表格是否可复选,加type是单选,去掉是多选
              columns={this.getColumns()}
              rowKey={record => record.id}
              pagination={false}
              loading={loading}
              size="middle"
              bordered
              scroll={{ x: 1100 }}
            />
          }

说明:
(1)isRadio 是自己写的一个变量,用来区分是单选表格还是多选表格

(2)onRowthis.selectRow(record)方法是核心,用来实现点击一行数据即可选中(其实是点击 单选/多选按钮右边的部分时,触发这个方法)

(3)//onChange: this.onSelectChange,这个方法是点击左边的单选/多选按钮时,会触发;

但是由于框架自身bug,翻页多选数据的话,id数组没有问题、内容数组会只保留当前页、无法保留前几页选中的内容,所以在此注释了(后果是点击左边的单选/多选按钮没有反应,只能点击行右边部分进行选择/取消选择,也许也能接受?)

(4)加上 type: 'radio',表格就会展示为单选按钮;去掉,表格默认展示为多选按钮

(5)selectedRowKeys: selectedIdsInSearchTab,这个是保存选中行id的一个数组,必须加,数组有内容后,页面就会显示出哪行被选中的样式

2.onRowthis.selectRow(record)方法


  selectRow = (record) => {

    const {
      dispatch,
      TrainPlanManage_SelectBscUserT: { selectedIdsInSearchTab,selectedRowsInSearchTab },
      isRadio
    } = this.props;

    //如果是单选
    if(isRadio){
      //获取存放的key
      const selectedRowKeys = [record.id];
      //获取存放的数据value
      const selectedRows = [record];

      dispatch({
        type: 'TrainPlanManage_SelectBscUserT/updateSelectedIdsInSearchTab',
        selectedIds : selectedRowKeys,
        selectedRows: selectedRows,
      });
    }
    //否则是多选
    else{

      //获取存放的key
      const selectedRowKeys = [...selectedIdsInSearchTab];
      //获取存放的数据value
      const selectedRows = [...selectedRowsInSearchTab];  
      
      if (selectedRowKeys.indexOf(record.id) >= 0) {
        //当点击选中的数据,取消选中
        selectedRowKeys.splice(selectedRowKeys.indexOf(record.id), 1);
        //取消选中也要删除数组中的value
        selectedRows.forEach((element,index) => {
          if(element.id === record.id){
            //根据id获取到数组里当前数据的下标,并删除。
            selectedRows.splice(index,1)
          }
        });
      } else {
        selectedRowKeys.push(record.id);
        //将选中的数据加入数组里
        selectedRows.push(record)
      }
      
      //this.setState({ selectedRowKeys,selectedRows });    

      dispatch({
        type: 'TrainPlanManage_SelectBscUserT/updateSelectedIdsInSearchTab',
        selectedIds : selectedRowKeys,
        selectedRows: selectedRows,
      });
    }

  }

说明:

(1)TrainPlanManage_SelectBscUserT: { selectedIdsInSearchTab,selectedRowsInSearchTab }的意思是,从TrainPlanManage_SelectBscUserT.js里拿出2个变量来,selectedIdsInSearchTab是保存被选中id的数组,selectedRowsInSearchTab 是保存被选中整行数据的数组

(2)入参record,就是当前点击的行数据,单选时直接保存回那2个变量中即可;
多选时,先判断现有数组中是否存在当前点击行的id,如果存在,那就是取消选择的意思,从数组移除内容;
如果不存在,那就是新增,直接放入数组。

(3)selectedRows.splice(index,1)的意思是,从数组中删除下标为index的数据。

(4)dispatch方法,调用的是TrainPlanManage_SelectBscUserT.js里的方法,把处理好的数组保存进去用,如下:

export default {
  namespace: 'TrainPlanManage_SelectBscUserT',

  state: {
      selectedIdsInSearchTab:[],
      selectedRowsInSearchTab:[],

......

---------------------------------------
  reducers: {
  
    updateSelectedIdsInSearchTab(state, action) {
      return {
        ...state,
        selectedIdsInSearchTab: action.selectedIds || state.selectedIds,
        selectedRowsInSearchTab: action.selectedRows || state.selectedRows,
      };
    },
    
}    

(5)如果变量在同一个js中,也可以使用//this.setState({ selectedRowKeys,selectedRows }); 来保存。

//3.//onChange: this.onSelectChange方法

这个方法是点击左边的 单选/复选 按钮 触发的;

单选没有问题;

但是多选的上方提到了,由于框架自身bug,翻页多选数据的话,id数组没有问题、内容数组会只保留当前页、无法保留前几页选中的内容,所以不推荐使用,注释了(后果是点击左边的单选/多选按钮没有反应,只能点击行右边部分进行选择/取消选择,也许也能接受?)

代码如下:

  // 复选框选中后的方法
  onSelectChange = (selectedIds, selectedRows) => {
    const { dispatch } = this.props;
    dispatch({
      type: 'TrainPlanManage_SelectBscUserT/updateSelectedIdsInSearchTab',
      selectedIds,
      selectedRows,
    });
  };

说明:
(1) 这个方法入参是选中行的id数组和选中行的数据数组(再强调一次,翻页多选的话,选中行的数据数组只有当前页的,有问题)

(2)dispatch方法与上方相同,就是把数组直接保存进去。

三、备注

1.发现,table绑定的已选中的id数组(selectedRowKeys),如果列表有id的话,把id装入数组,页面就会显示哪些行被选中;
但是如果数据列表没有叫id的字段,那么把其它值装入绑定数组没有效果,页面不知道选中的是哪行;

可能是框架会有默认的id,装入默认的id才行(比如0,1,2),但是数据列表没有id字段,我们无法区分这条数据应该的id是什么,从而无法实现点击一行选中当前数据的功能……

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1081080.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何在手机上设置节日提醒和倒计时天数?

在平淡的生活和工作中&#xff0c;时不时有各种各样节日的点缀&#xff0c;为我们的日常增添了一些仪式感&#xff0c;例如春节、元宵节、情人节、端午节、七夕节等。此外还有一些特殊的日子也值得纪念&#xff0c;例如恋爱纪念日、结婚纪念日、亲朋好友生日等。面对这些节日&a…

provide,inject

通过provide和inject函数可以简便的实现跨级组件通讯 父组件提供 const count ref(0); provide(count, count);const updateCount (num) > {count.value num; }; provide(updateCount, updateCount);子组件或者孙子组件接受 const count inject(count); const upda…

快手新版本sig3参数算法还原

Frida Native层主动调用 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81…

ViewModifier/视图修饰符, ButtonStyle/按钮样式 的使用

1. ViewModifier 视图修饰符 1.1 创建默认按钮视图修饰符 ViewModifierBootcamp.swift import SwiftUI/// 默认按钮修饰符 struct DefaultButtonViewModifier: ViewModifier{let bcakgroundColor: Colorfunc body(content: Content) -> some View {content.foregroundColor…

如何去图片水印?这些方法解决你的问题

当我们希望更新自己的头像时&#xff0c;经常会发现网上有许多精彩的图片&#xff0c;但它们通常带有水印&#xff0c;使我们无法轻松使用这些照片。这个情况大家应该都有遇到过吧&#xff1f;那么&#xff0c;如何去除图片上的水印呢&#xff1f;接下来&#xff0c;我们将分享…

选择适合变更管理的产品开发工具的要点和建议

什么是变更管理&#xff1f; 变更管理是指导组织改进的学科。由于可观察到的行为变化&#xff0c;它会导致永久性变化。它确保您的组织以彻底、有序和可持续的方式学习和改进。成功的改进项目需要个人和团队保持一致&#xff0c;他们有共同的愿景&#xff0c;他们知道如何定义…

大麦网回流票监控,sing参数分析

最近演唱会增多&#xff0c;总是抢不到票&#xff0c;所以想从回流票入手&#xff0c;做一个某麦网的演唱会回流票的监控。 最简单的方向就是从网页端入手。 在演唱会页面看到网页端不支持购买&#xff0c;不慌&#xff0c;咱只是看看有没有票不购买&#xff0c;直接抓包随便一…

营销科学中的边际ROI计量随笔记

主要是读这篇基于AB实验的边际ROI增长分析实践 的随笔记。 传统ROI计量 一些营销活动中的传统的ROI的计算方式是&#xff1a; 拉新ROI LTV / CAC 用户生命周期价值/平均获客成本 买量类拉新策略评估使用。 促活ROI GMV / RotalRecallCost 促销活动期间的总销售额/促销活…

#IIC 通信协议

IIC简介 I2C 通讯协议 (Inter &#xff0d; Integrated Circuit) 是由 Phiilps 公司开发的 物理层 它的物理层有如下特点&#xff1a; (1) 它是一个支持设备的总线。“总线”指多个设备共用的信号线。在一个 I2C 通讯总线中&#xff0c;可连接多个 I2C 通讯设备&#xff0c;支…

草柴APP如何领取淘宝内部隐藏优惠券拿淘宝返利?

什么是草柴APP&#xff1f; 草柴APP是一款购物省钱工具。草柴APP现已支持淘宝、天猫、京东等知名电商平台&#xff0c;通过草柴APP查询领取内部隐藏大额优惠券&#xff0c;确认收货后拿购物返利&#xff1b;让您与别人购买相同的商品&#xff0c;不求比别人花的少&#xff0c;…

零样本异常分割SAA+

文章目录 一、测试效果展示二、相关链接三、优点总结四、SAA vs SAA4.1 SAA4.2 SAA 五、SAA结构5.1 专家领域知识&#xff08;Domain Expert Knowledge&#xff09;5.2 目标图片上下文信息&#xff08;Target Image Context&#xff09; 六、How to use 最近在做缺陷检测&#…

Qt打开ui文件经常报错

报错如下&#xff1a; 解决方法&#xff1a; 最后设置成默认值 即可

国标28181 开源WVP-PRO项目部署

感谢大牛的开源框架 https://doc.wvp-pro.cn/#/ 一.直接使用源码部署&#xff08;在linux&#xff09; -- 安装环境 yum install -y java-1.8.0-openjdk.x86_64 git maven nodejs npm -- 下载源码-wvp项目 git clone https://gitee.com/pan648540858/wvp-GB28181-pro.git ---…

Linux系统编程:UDP协议和TCP协议

目录 一. 对于端口号的理解 1.1 网络通信五元组 1.2 端口号的划分策略 二. 网络通信中常用的指令 2.1 netstat指令 2.2 pidof指令 三. udp协议 3.1 udp的概念及特点 3.2 udp协议端格式 3.3 对于面向数据报及应用层发送与读取数据的理解 四. tcp协议的概念及特点 五.…

怎么把视频转换成mp4格式?

怎么把视频转换成mp4格式&#xff1f;如果你经常在网上下载视频的话&#xff0c;那么应该知道视频文件的格式种类非常的多&#xff0c;不同网站下载到的视频格式各不相同&#xff0c;除了最常见的mp4格式外&#xff0c;其它视频格式基本上都存在着兼容问题&#xff0c;如果格式…

Qt creator下载安装

版本问题&#xff1a; Qt4的开发环境包括3个基本部分&#xff1a;Qt Framework&#xff08;Qt库&#xff09;、QtCreator&#xff08;IDE&#xff09;和MinGW&#xff08;编译调试&#xff09;&#xff0c;都要分别下载安装并配置&#xff0c;比较麻烦。 Qt5之后&#xff0c;…

Vuex->vuex获取值以及改变值,vuex异步请求

vuex获取值以及改变值vuex异步请求 1.vuex获取值以及改变值 Vuex分成五个部分&#xff1a; 1.State&#xff1a;单一状态树 2.Getters&#xff1a;状态获取 3.Mutations&#xff1a;触发同步事件 4.Actions&#xff1a;提交mutation&#xff0c;可以包含异步操作 5.Module&…

2023云栖大会即将开幕,速来免费预约!

2023云栖大会 500热点话题 1000行业实干家 现场实操 即学即用 40000平米科技展 3000前沿展品 72小时沉浸式科技体验 与数字人李白共吟盛唐诗歌 视频云边缘云云通信 深入3大Tech领域&#xff0c;覆盖20话题演讲 虚拟演播室、智能全景声 AIGC与数字人的一站式制作 “AI更…

重温mybatis之一篇带你入门Mybatis

一.前言 我是一个五年得java开发工程师&#xff0c;在印象里&#xff0c;从第一年我就会使用mybatis了&#xff0c;从最开始得xml配置&#xff0c;到spring整合&#xff0c;再到springboot。无非就是写个mapper抽象类&#xff0c;写个mapper.xml方法。就这么一直用着。期间也想…

ASP.Core3.1 WebAPI 发布到IIS

本篇文章简述如何在IIS中发布你的.Core 程序 1.打包 首先你要打包好你程序&#xff0c;如果你是Visual Studio开发的程序&#xff0c;那你右击你的项目点击发布 如果你是Visual Code 开发的&#xff0c;那你在你的终端切换到你的目录然后执行命令 dotnet publish --config…