import * as React from "react"; import { Table, Checkbox } from "antd"; import NestTable from "./children/NestTable"; import { CheckboxChangeEvent } from "antd/lib/checkbox"; import { TreeLevel } from "./children/NestTable/type"; import { IProduct4Order } from "@/models/cart"; import "./index.scss"; type P = { checkable?: boolean; //是否开始选择框 }; type S = { dataSource: IProduct4Order[]; checkedAll: boolean; indeterminate: boolean; }; class NestOrderList extends React.Component { readonly state: S = { checkedAll: false, indeterminate: false, dataSource: [] }; getTableProps = () => { const { dataSource } = this.state; const columns = [ { key: "product", dataIndex: "product", title: "商品", width: 250, render: product => { return (

{product.name}

{product.num}

); } }, { key: "unitPrice", dataIndex: "unitPrice", width: 150, title: "单价" // render: curVal => { // const price = curVal.toFixed(2).toString(); // return '¥' + price.replace(/\B(?=(\d{3})+(?!\d))/g, ','); // }, }, { key: "shopNum", dataIndex: "shopNum", width: 150, title: "商品数量" }, { key: "discount", dataIndex: "discount", width: 150, title: "享受折扣" }, { key: "offer", dataIndex: "offer", title: "优惠", width: 150 }, { key: "price", dataIndex: "price", title: "金额", width: 150 // render: curVal => { // const price = curVal.toFixed(2).toString(); // return '¥' + price.replace(/\B(?=(\d{3})+(?!\d))/g, ','); // }, } ]; return { dataSource, columns, rowKey: "id", pagination: false }; }; onChange = (e: CheckboxChangeEvent, level: TreeLevel) => { const checked = e.target.checked; this.filterDataSourceByLevelAndStatus(checked, level); this.setState({ checkedAll: checked }); }; // 根据层级过滤数据源 filterDataSourceByLevelAndStatus = ( checked: boolean = false, level: TreeLevel = TreeLevel.FIRST, tid?: number ) => { // const originData = [...this.state.dataSource]; // let dataSource = []; // originData.forEach((item, index) => { // switch (level) { // case TreeLevel.FIRST: // item.checked = checked; // dataSource.push({ // ...item, // checked, // product: item.product.map((spu, index: number) => { // const skuList = spu.children; // return { // ...spu, // checked, // children: skuList.map((sku, index: number) => { // return { // ...sku, // checked // }; // }) // }; // }) // }); // break; // case TreeLevel.SECOND: // if (item.id === tid) { // dataSource.push({ // ...item, // checked, // product: item.product.map((spu, index: number) => { // const skuList = spu.children; // return { // ...spu, // checked, // children: skuList.map((sku, index: number) => { // return { // ...sku, // checked // }; // }) // }; // }) // }); // } else { // dataSource.push(item); // } // break; // case TreeLevel.THIRD: // const product = item.product.map((spu, index: number) => { // const skuList = spu.children; // if (spu.id === tid) { // return { // ...spu, // checked, // children: skuList.map((sku, index: number) => { // return { // ...sku, // checked // }; // }) // }; // } else { // return spu; // } // }); // dataSource.push({ // ...item, // checked: this.getParentCheckStatus(product), // product // }); // break; // case TreeLevel.FOUR: // dataSource.push({ // ...item, // product: item.product.map((spu, index: number) => { // const skuList = spu.children; // const children = skuList.map((sku, index: number) => { // return { // ...sku, // checked: sku.id === tid ? checked : sku.checked // }; // }); // return { // ...spu, // checked: this.getParentCheckStatus(children), // children: skuList.map((sku, index: number) => { // return { // ...sku, // checked: sku.id === tid ? checked : sku.checked // }; // }) // }; // }) // }); // break; // } // }); // this.refreshDataSource(dataSource); }; // 更新全选状态 refreshCheckAllStatus = (dataSource: any) => { const checkedList = dataSource.filter(item => item.checked); this.setState({ checkedAll: checkedList.length === dataSource.length, indeterminate: checkedList.length < dataSource.length && checkedList.length > 0 }); }; // 获取父级选择状态 getParentCheckStatus = (dataSource: any) => { const checkedList = dataSource.filter(item => item.checked); return checkedList.length === dataSource.length; }; // 动态更新数据源 refreshDataSource = (dataSource: any) => { const curDataSource = dataSource.map((item, index) => { const firstLevelChecked = []; item.product.forEach((item, index) => { firstLevelChecked.push(~~item.checked); item.children.forEach((sku, index) => { firstLevelChecked.push(~~sku.checked); }); }); return { ...item, checked: this.getParentCheckStatus(item.product), indeterminate: ~firstLevelChecked.indexOf(1) && !this.getParentCheckStatus(item.product), product: item.product.map((spu, index) => { const secondLevelChecked = []; spu.children.forEach((item, index) => { secondLevelChecked.push(~~item.checked); }); return { ...spu, checked: this.getParentCheckStatus(spu.children), indeterminate: ~secondLevelChecked.indexOf(1) && !this.getParentCheckStatus(spu.children), children: spu.children.map((sku, index) => { return sku; }) }; }) }; }); this.setState( { dataSource: curDataSource }, () => { this.refreshCheckAllStatus(this.state.dataSource); } ); }; renderThead = () => { const columns = [ { key: "product", dataIndex: "product", title: "商品", width: 250, render: product => { return (

{product.name}

{product.num}

); } }, { key: "unitPrice", dataIndex: "unitPrice", width: 150, title: "单价", render: curVal => { const price = curVal.toFixed(2).toString(); return "¥" + price.replace(/\B(?=(\d{3})+(?!\d))/g, ","); } }, { key: "quantity", dataIndex: "quantity", width: 150, title: "商品数量" }, { key: "discount", dataIndex: "discount", width: 150, title: "享受折扣" }, { key: "offer", dataIndex: "offer", title: "优惠", width: 150 }, { key: "price", dataIndex: "price", title: "金额", width: 150, render: curVal => { const price = curVal.toFixed(2).toString(); return "¥" + price.replace(/\B(?=(\d{3})+(?!\d))/g, ","); } } ]; return columns.map((item, index) => { return (
{item.title}
); }); }; // 渲染嵌套表格 renderNestTableList = () => { const { dataSource } = this.state; return dataSource.map((item, index: number) => { return ( ); }); }; render() { const { checkable } = this.props; console.log({ checkable }, "------"); return (
{checkable ? (
this.onChange(e, TreeLevel.FIRST)} /> 全选
) : null} {this.renderThead()}
{this.renderNestTableList()}
); } } export default NestOrderList;