用ReactJs编写的带斜线,行和列都分组的表格

NewUserTrackTable.js文件

/**
 * Created by Administrator on 2017/3/3 0003.
 */
import React, {Component} from "react"
import "./NewUserTrackTable.less"
var g_index = -1;
export default class NewUserTrackTable extends Component {
    constructor(props) {
        super(props);
        this.state = {
            "kpi": {
                "id": "01",
                "title": "发展用户"
            },
            "thData": [
                {
                    "year": "2015年",
                    "months": [
                        "1月",
                        "2月"
                    ]
                },
                {
                    "year": "2016年",
                    "months": [
                        "1月",
                        "2月",
                        "3月",
                        "4月"
                    ]
                },
                {
                    "year": "2017年",
                    "months": [
                        "1月",
                        "2月",
                        "3月"
                    ]
                }
            ],
            "tbodyData": [
                {
                    "year": "2015年",
                    "months": [
                        {
                            "month": "1月",
                            "net_value": "220",
                            "obs_values": [
                                "111",
                                "222",
                                "333",
                                "333",
                                "3333",
                                "3333",
                                "444",
                                "3333",
                                "444"
                            ]
                        },
                        {
                            "month": "2月",
                            "net_value": "220",
                            "obs_values": [
                                "111",
                                "222",
                                "333",
                                "333",
                                "3333",
                                "3333",
                                "444",
                                "3333",
                                "444"
                            ]
                        },
                        {
                            "month": "3月",
                            "net_value": "220",
                            "obs_values": [
                                "111",
                                "222",
                                "333",
                                "333",
                                "3333",
                                "3333",
                                "444",
                                "3333",
                                "444"
                            ]
                        },
                        {
                            "month": "4月",
                            "net_value": "220",
                            "obs_values": [
                                "111",
                                "222",
                                "333",
                                "333",
                                "3333",
                                "3333",
                                "444",
                                "3333",
                                "444"
                            ]
                        }
                    ]
                },
                {
                    "year": "2016年",
                    "months": [
                        {
                            "month": "1月",
                            "net_value": "220",
                            "obs_values": [
                                "111",
                                "222",
                                "333",
                                "333",
                                "3333",
                                "3333",
                                "444",
                                "3333",
                                "444"
                            ]
                        },
                        {
                            "month": "2月",
                            "net_value": "220",
                            "obs_values": [
                                "111",
                                "222",
                                "333",
                                "333",
                                "3333",
                                "3333",
                                "444",
                                "3333",
                                "444"
                            ]
                        },
                        {
                            "month": "3月",
                            "net_value": "220",
                            "obs_values": [
                                "111",
                                "222",
                                "333",
                                "333",
                                "3333",
                                "3333",
                                "444",
                                "3333",
                                "444"
                            ]
                        },
                        {
                            "month": "4月",
                            "net_value": "220",
                            "obs_values": [
                                "111",
                                "222",
                                "333",
                                "333",
                                "3333",
                                "3333",
                                "444",
                                "3333",
                                "444"
                            ]
                        }
                    ]
                }
            ]
        }
    }

    getDepth = (data)=> {
        return data.months.length;
    }
    componentDidMount = ()=> {
        /*给表格画表头斜线*/
        // var myCanvas = document.getElementById("myCanvas-nutt");
        var myCanvas=this.refs.myCanvasNUTT;
        var width = myCanvas.width;
        var height = myCanvas.height;
        var ctx = myCanvas.getContext("2d");
        ctx.strokeStyle = "#ffffff";
        ctx.moveTo(0, 0);
        ctx.lineTo(width, height);
        ctx.stroke();


        /*根据表格列数给表格设置宽度*/
        var tableId=this.props.tableId;
        var _tds=this.state.tbodyData[0].months[0].obs_values.length+3;
        document.getElementById(tableId).width=_tds*100+"px";
    }
    getNormalTdStyle = (gindex)=> {
        return gindex % 2 == 0 ? "bg-white" : "bg-gray border-bottom";
    }
    getTableNode = (table, _net_year, data, depth, obsLastMontIndex)=> {
        if (data.length > 0) {
            data.map((netMonth, index)=> {
                g_index++;
                var obj = null;
                var _obs_values = netMonth.obs_values;
                if (_obs_values.length > 0) {
                    var normalTd = _obs_values.map((obsValue, index)=> {
                        return (
                            <td className={this.getNormalTdStyle(g_index, index) + " " + this.isShowBorderRight(index, obsLastMontIndex)}>{obsValue}</td>
                        );
                    })
                }
                if (index == 0) {

                    obj = <tr>
                        <td rowSpan={depth} className="kpi-bg">{_net_year}</td>
                        <td className="kpi-bg">{netMonth.month}</td>
                        <td className="kpi-bg">{netMonth.net_value}</td>
                        {normalTd}
                    </tr>

                }
                else {

                    obj = <tr>
                        <td className="kpi-bg">{netMonth.month}</td>
                        <td className="kpi-bg">{netMonth.net_value}</td>
                        {normalTd}
                    </tr>

                }
                if (obj) {
                    table.push(obj);
                }
            })
        }
    }
    getTable = (tree, data, obsLastMontIndex)=> {
        if (data.length > 0) {
            data.map((netYear, index)=> {
                var _data = netYear.months;
                var _depth = this.getDepth(netYear);
                var _net_year = netYear.year;
                this.getTableNode(tree, _net_year, _data, _depth, obsLastMontIndex);
            })
        }
    }
    /*
     * 该函数用来给相应的td或th添加右边的边框线
     * index改td或th的索引
     * obsMonth记录观察年月中每个年中最后一个月份所对应的索引。
     * */
    isShowBorderRight = (index, obsMonth)=> {
        return obsMonth.indexOf(index + 1) != -1 ? "border-right" : "";
    }
    render = ()=> {
        var table_id = this.props.tableId;
        var kpi = this.state.kpi;
        var thData = this.state.thData;
        var obs_month = thData[0].months;
        var tree = [];
        var _obs_lastmonth_index = [thData[0].months.length];//记录观察年月中每个年中最后一个月份所对应的索引。
        var tbodyData = this.state.tbodyData;
        if (thData.length > 0) {
            var obs_year_th = thData.map((obsYear, index)=> {
                var _depth = this.getDepth(obsYear);
                if (index > 0) {
                    _obs_lastmonth_index.push(_obs_lastmonth_index[_obs_lastmonth_index.length - 1] + obsYear.months.length);
                    Array.prototype.push.apply(obs_month, obsYear.months);
                }
                return (
                    <th colSpan={_depth} className="bg-gray border-right">
                        {obsYear.year}
                    </th>
                );
            })
        }
        if (obs_month.length > 0) {
            var obs_month_th = obs_month.map((obsMonth, index)=> {
                return (
                    <th className={this.isShowBorderRight(index, _obs_lastmonth_index) + " bg-gray border-bottom"}>
                        {obsMonth}
                    </th>
                );
            })
        }
        this.getTable(tree, tbodyData, _obs_lastmonth_index);
        return (
            <div className="new-user-track-table-box">
                <canvas ref="myCanvasNUTT" className="myCanvas"></canvas>
                <table id={table_id} className="new-user-track-table">
                    <thead>
                    <tr>
                        <th colSpan="2" rowSpan="2" className="kpi-bg">
                            <div style={{textAlign: "right", marginRight: "20px"}}>观察年月</div>
                            <div style={{textAlign: "left", marginLeft: "20px"}}>入网年月</div>
                        </th>
                        <th rowSpan="2" className="kpi-bg">{kpi.title}</th>
                        {obs_year_th}
                    </tr>
                    <tr>
                        {obs_month_th}
                    </tr>
                    </thead>
                    <tbody>
                    {tree}
                    </tbody>
                </table>
            </div>
        );
    }
}



NewUserTrackTable.less文件

.new-user-track-table-box{
  width: 100%;
  height: auto;
  overflow-x: scroll;
}
.new-user-track-table{
  margin-left: 10px;
  margin-top: -75px;
  height: auto;
}
.kpi-bg{
  text-align: center;
  width: 100px;
  height: 40px;
  color:#FFF7F6;
  border: solid 1px #AEBECF;
  background-color: #B7CDE5;
}
.bg-gray{
  text-align: center;
  width: 100px;
  height: 40px;
  background-color: #FAFAFA;
}
@border:solid 1px #cfcfcf;
.border-bottom{
  border-bottom: @border;
}
.bg-white{
  text-align: center;
  width: 100px;
  height: 40px;
  background-color: #ffffff;
  border-bottom: @border;
}
.border-right{
  border-right: @border;
}
.myCanvas{
  position: relative;
  top: 10px;
  left: 10px;
  width: 200px;
  height: 80px;
}

表格截图如下

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值