美文网首页
基于antd-react自定义导出标题功能需求

基于antd-react自定义导出标题功能需求

作者: 甘道夫老矣 | 来源:发表于2020-07-20 11:20 被阅读0次

    自己研究出来满足当前需求的功能,研究不宜,觉得好给个赞吧

    需求:标题可以自己选择,并且还能自己排序,标题还可以自己定义
    提供:所有的标题,导出的数据(为解析的),react+antd(4.0)+file-saver
    代码:

    //需要安装拖拽的node包:array-move,react-sortable-hoc
    import React, { Component } from "react";
    import { Route, Link, Switch, Redirect } from "react-router-dom";
    import { Table, Row, Col, Button, Modal, Input, message, Select } from "antd";
    
    //下面的都是拖拽需要的
    import { sortableContainer, sortableElement, sortableHandle } from "react-sortable-hoc";
    import { MenuOutlined } from "@ant-design/icons";
    import arrayMove from "array-move";
    const DragHandle = sortableHandle(() => <MenuOutlined style={{ cursor: "pointer", color: "#999" }} />);
    const SortableItem = sortableElement((props) => <tr {...props} />);
    const SortableContainer = sortableContainer((props) => <tbody {...props} />);
    const DragableBodyRow = ({ index, className, style, ...restProps }) => <SortableItem index={restProps["data-row-key"]} {...restProps} />;
    
    //导入service
    import * as listService from "../service/asset.card.list.service";
    //封装的方法,导出使用
    import ExportExcel from "../components/ExportExcel";
    
    const { Option } = Select;
    export default class AssetCardList extends Component {
        constructor(props) {
            super(props);
            this.state = {
                //标题数据
                titleData: [
                    {
                        key: "1",
                        title: "资产名称", //必须要
                        dataIndex: "aiName", //必须要
                        index: 0, //必须要
                    },
                    {
                        key: "2",
                        title: "价值类型",
                        dataIndex: "aiVaty",
                        index: 1,
                    },
                    {
                        key: "3",
                        title: "经费来源",
                        dataIndex: "aiFufr",
                        index: 2,
                    },
                    {
                        key: "4",
                        title: "项目预算标号",
                        dataIndex: "aiProj",
                        index: 3,
                    },
                    {
                        key: "5",
                        title: "使用部门",
                        dataIndex: "aiUdid",
                        index: 4,
                    },
                    {
                        key: "5",
                        title: "管理人",
                        dataIndex: "aiMpid",
                        index: 5,
                    },
                    {
                        key: "6",
                        title: "销售商",
                        dataIndex: "销售商",
                        index: 6,
                    },
                ],
                //表格数据
                dataSource: [],
                //获取来的数据
                data: [
                    { aiName: "当当", aiVaty: "自定义", aiUdid: "财务部" },
                    { aiName: "朵朵", aiVaty: "规定", aiUdid: "门市部" },
                    { aiName: "当当2", aiVaty: "评估", aiUdid: "人事部" },
                ],
    
                ModalVisible: false,
                record: null,
                inputValue: null,
            };
        }
    
        async componentDidMount() {
            this.getTableData();
        }
    
        //获取表格数据
        getTableData = async () => {
            let res = await listService.selectAssetData();
    
            if (res.statusCode !== 0) return message.info(res.message);
            let arrs = res.result.nodes;
    
            arrs.forEach((item, index, arr) => {
                if (item.aiGode.length > 0) {
                    item.aiGode.forEach((items) => {
                        let obj = {};
                        obj[items.piName] = items.piMsg;
                        Object.assign(item, obj);
                    });
                }
            });
            console.log(arrs);
    
            this.setState({
                data: arrs,
            });
        };
    
        //拖拽方法
        onSortEnd = ({ oldIndex, newIndex }) => {
            const { dataSource } = this.state;
            if (oldIndex !== newIndex) {
                const newData = arrayMove([].concat(dataSource), oldIndex, newIndex).filter((el) => !!el);
                console.log(newData);
                this.setState({ dataSource: newData });
            }
        };
    
        //编辑
        handleEdit = (record) => {
            this.setState({
                ModalVisible: true,
                record,
            });
        };
    
        //选择 添加字段
        handleChange = (value, option) => {
            const { titleData } = this.state;
            let newArr = [];
            option.forEach((item, indexs) => {
                let obj = {};
                obj.index = indexs;
                obj.title = item.value;
                obj.dataIndex = item.key;
                obj.key = (indexs + 1).toString();
                newArr.push(obj);
            });
            this.setState({
                dataSource: newArr,
            });
            //console.log(newArr);
        };
    
        //弹出框按钮
        handleOk = () => {
            let { dataSource, record } = this.state;
            let res = this.inputValue.state.value.replace(/\s+/g, "");
            if (!res) {
                message.info("名称不能为空");
                return;
            }
            dataSource.forEach((item) => {
                if (record.key === item.key) {
                    item.title = res;
                }
            });
            this.setState({
                ModalVisible: false,
                record: null,
            });
        };
        handleCancel = () => {
            this.setState({
                ModalVisible: false,
                record: null,
            });
        };
    
        //点击导出
        handleUpload = () => {
            let { dataSource, data } = this.state;
    
            let newArr = [],
                keyValue = {};
            dataSource.forEach((item) => {
                keyValue[item.dataIndex] = "1";
            });
            newArr = data.map((item) => {
                let currdata = {};
                Object.keys(item).forEach((key) => {
                    if (keyValue[key]) {
                        currdata[key] = item[key];
                    }
                });
                return currdata;
            });
            console.log(dataSource);
    
            newArr.forEach((item) => {
                for (let index in item) {
                    if (item[index] === null || item[index] === undefined || JSON.stringify(item[index]) === "{}") {
                        item[index] = "";
                    }
                    //判断是不是字符串
    
                    if (item[index] && typeof item[index] == "string" && item[index].constructor == String && item[index].toString().indexOf(",") > -1) {
                        item[index] = item[index].replace(/,/g, "、");
                    }
    
                    //使用部门
                    if (index === "aiUdid") {
                        let res = "";
                        item[index].forEach((items, index) => {
                            res += items.osName;
                        });
                        item[index] = res;
                    }
    
                    //资产分类
                    if (index === "aiAsco") {
                        let res = "";
                        item[index].forEach((items, index) => {
                            res += items.caName;
                        });
                        item[index] = res;
                    }
    
                    //object
                    if (item[index] instanceof Object && item[index].label) {
                        item[index] = item[index].label;
                    }
                }
            });
            console.log(newArr);
                    //调用导出的方法
            ExportExcel(dataSource, newArr);
        };
    
        render() {
            const { dataSource, ModalVisible, record, titleData } = this.state;
            const columns = [
                {
                    title: "拖拽",
                    dataIndex: "sort",
                    align: "center",
                    width: 62,
                    render: () => <DragHandle />,
                },
                {
                    title: "序号",
                    align: "center",
                    dataIndex: "key",
                },
                {
                    title: "标题",
                    align: "center",
                    dataIndex: "title",
                },
                {
                    title: "操作",
                    align: "center",
                    dataIndex: "operation",
                    render: (text, record) => {
                        return (
                            <div>
                                <a
                                    onClick={() => {
                                        this.handleEdit(record);
                                    }}
                                >
                                    编辑
                                </a>
                            </div>
                        );
                    },
                },
            ];
    
            const DraggableContainer = (props) => <SortableContainer useDragHandle helperClass="row-dragging" onSortEnd={this.onSortEnd} {...props} />;
    
            return (
                <div className="main-box">
                    <Select
                        placeholder="请选择导出的字段"
                        mode="multiple"
                        //   defaultValue={['a10', 'c12']}
                        onChange={this.handleChange}
                        // onSelect={this.onSelect}
                        style={{ width: "100%" }}
                    >
                        {titleData.length > 0 &&
                            titleData.map((item, index) => {
                                return (
                                    <Option value={item.title} key={item.dataIndex}>
                                        {item.title}
                                    </Option>
                                );
                            })}
                    </Select>
                    <Button onClick={this.handleUpload} style={{ margin: " 20px 0" }}>
                        点击导出
                    </Button>
                    {dataSource && (
                        <Table
                            pagination={false}
                            dataSource={dataSource}
                            columns={columns}
                            rowKey={(record) => record.index}
                            bordered
                            components={{
                                body: {
                                    wrapper: DraggableContainer,
                                    row: dataSource.length > 0 ? DragableBodyRow : null,
                                },
                            }}
                        />
                    )}
    
                    {record && (
                        <Modal title="编辑" visible={ModalVisible} onOk={this.handleOk} destroyOnClose={true} onCancel={this.handleCancel}>
                            <Input placeholder="请编辑名称" ref={(val) => (this.inputValue = val)} />
                        </Modal>
                    )}
                </div>
            );
        }
    }
    
    

    相关文章

      网友评论

          本文标题:基于antd-react自定义导出标题功能需求

          本文链接:https://www.haomeiwen.com/subject/onyekktx.html