[ 实战 ] [ 虚拟滚动 ] Ant Design Vue 表格支持全选功能

本页面的代码基于此代码开发,请先阅读 虚拟滚动、支持 Element-UI 、Ant Design Vue

推荐一个超好用的网站:silencelove.top
适宜:开发者 、测试人员 、学生

使用示例

<style>
	.ant-table-wrapper {
      height: 100%;
     }
     .ant-table-wrapper .ant-spin-container>.ant-table {
         height: 100%;
     }
<style>

<a-table id="elDataTable" 
	:data-source="viewportScroll.showData" :pagination="pagination" :row-key="(obj,index)=>obj.id"
	:row-selection="{ selectedRowKeys: viewportScroll.selectedRowKeys, onChange: onSelectChange ,preserveSelectedRowKeys:true}"
	:columns="[]">
</a-table>
vue({
	data:{
	   viewportScroll:{excludeHeight:0,itemHeight:49,selectedRowKeys:[] },
    },
    mounted() {
		this.viewportScroll.data= 原数据;
        initViewportScroll(elDataTable, this.viewportScroll);
	},
	methods{
        onSelectChange(selectedRowKeys) {
            this.viewportScroll.selectedRowKeys=selectedRowKeys;
        },
	}
})

虚拟滚动代码 js/viewport.scroll.js 增加方法

// 在原有方法 function initOptions 中添加代码
// let def = {
	// 新增的属性
    rowKey:'id',
//};

// 在原有方法 function run(options) 中添加代码
 if(options.selectedRowKeys!==undefined){
	 requestAnimationFrame(()=>{
	    refreshSelSelectAll(options);
	 });
 }

// 新增以下代码
function refreshSelSelectAll(options){
        if(options.selectedRowKeys===undefined){
            return;
        }

        let target=options.$checkboxAll;
        if(!target){
            target=options.$scroll.querySelector('table > thead > tr > th.ant-table-cell.ant-table-selection-column > div > label > span > input');
            options.$checkboxAll=target;
            options.$checkboxAll.addEventListener('change',(event)=>{
                let target=event.target;
                console.log('$checkboxAll change ',target.checked);
                options.selectedRowKeys.length=0;
                if(target.checked){
                    options.selectedRowKeys.push(...options.data.map(item=>item[options.rowKey]));
                }
            },false);
        }

        let stateClass=['','ant-checkbox-indeterminate','ant-checkbox-checked'];

        let selectedRowKeysLength=options.selectedRowKeys.length;
        let state= selectedRowKeysLength === options.dataLength?2:selectedRowKeysLength>0?1:0;

        let parent = target.parentNode;
        let parentClassList = [...parent.classList];
        if (state === 0) {
            parent.classList.remove(stateClass[1], stateClass[2]);
        } else if (state === 1) {
            if (!parentClassList.includes(stateClass[1])) {
                parent.classList.add(stateClass[1]);
            }
            if (parentClassList.includes(stateClass[2])) {
                parent.classList.remove(stateClass[2]);
            }
        } else if (state === 2) {
            if (parentClassList.includes(stateClass[1])) {
                parent.classList.remove(stateClass[1]);
            }
            if (!parentClassList.includes(stateClass[2])) {
                parent.classList.add(stateClass[2]);
            }
        }
    }

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Ant Design表格中,可以使用 `Checkbox` 组件来实现全选功能。以下是一个简单的实现示例: 1. 在表格的列定义中添加一个 `render` 函数,用于渲染 `Checkbox` 组件: ```javascript const columns = [ { title: '姓名', dataIndex: 'name', }, { title: '年龄', dataIndex: 'age', }, { title: '操作', render: (text, record) => ( <Checkbox onChange={handleSelect(record.key)} /> ), }, ]; ``` 2. 在表格上面添加一个 `Checkbox` 组件,用于触发全选操作: ```javascript const handleSelectAll = (e) => { setData( data.map((item) => { return { ...item, selected: e.target.checked, }; }) ); }; return ( <div> <Checkbox onChange={handleSelectAll}>全选</Checkbox> <Table columns={columns} dataSource={data} rowSelection={{ selectedRowKeys: selectedKeys, onChange: handleSelectChange, }} /> </div> ); ``` 3. 在 `handleSelect` 函数中更新选中状态,并根据选中状态更新全选状态: ```javascript const handleSelect = (key) => (e) => { setData( data.map((item) => { if (item.key === key) { return { ...item, selected: e.target.checked, }; } return item; }) ); const selectedAll = data.every((item) => item.selected); setSelectedAll(selectedAll); }; ``` 完整的示例代码: ```javascript import React, { useState } from 'react'; import { Table, Checkbox } from 'antd'; const data = [ { key: '1', name: 'John Brown', age: 32, selected: false, }, { key: '2', name: 'Jim Green', age: 42, selected: false, }, { key: '3', name: 'Joe Black', age: 32, selected: false, }, ]; const Demo = () => { const [selectedAll, setSelectedAll] = useState(false); const [selectedKeys, setSelectedKeys] = useState([]); const handleSelectAll = (e) => { setData( data.map((item) => { return { ...item, selected: e.target.checked, }; }) ); setSelectedAll(e.target.checked); setSelectedKeys(e.target.checked ? data.map((item) => item.key) : []); }; const handleSelectChange = (selectedRowKeys) => { setSelectedKeys(selectedRowKeys); setSelectedAll(selectedRowKeys.length === data.length); }; const handleSelect = (key) => (e) => { setData( data.map((item) => { if (item.key === key) { return { ...item, selected: e.target.checked, }; } return item; }) ); const selectedAll = data.every((item) => item.selected); setSelectedAll(selectedAll); setSelectedKeys( data.filter((item) => item.selected).map((item) => item.key) ); }; const columns = [ { title: '姓名', dataIndex: 'name', }, { title: '年龄', dataIndex: 'age', }, { title: '操作', render: (text, record) => ( <Checkbox onChange={handleSelect(record.key)} /> ), }, ]; return ( <div> <Checkbox onChange={handleSelectAll} checked={selectedAll}> 全选 </Checkbox> <Table columns={columns} dataSource={data} rowSelection={{ selectedRowKeys: selectedKeys, onChange: handleSelectChange, }} /> </div> ); }; export default Demo; ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值