接口文档SDK业务专题开发者工具

快速构建报表UI

本章节以日报表数据展示为例,介绍了 Marketing UI 中报表模块的安装、使用方法及步骤。其他报表数据使用方式类似。

支持的报表类型

表格 (ReportTable) ## 使用步骤

step 1. 加载 Marketing UI 组件包

请参考 如何安装组件包

step 2. 加载组件

为方便调试,我们为您准备了一份该接口返回数据示例,可将其保存为 daily_reports_get.js,点此获取。 注意,实际使用组件时,请使用 MKT API 报表相关接口实时拉取。

import React, { Component } from 'react';
import { render } from 'react-dom';
import { Report } from '@tencent/mktui';
const { ReportTable } = Report;

// 注意,实际使用组件时,请使用相关报表接口实时拉取
import dailyReportsMockData from './daily_reports_get';
const {
    dailyReport1,                    // 未排序第一页数据 (pageSize = 5)
    dailyReport1SortedByClickAsc,    // 按click字段升序排序的第一页数据
    dailyReport1SortedByClickDesc,   // 按click字段降序排序的第一页数据
    dailyReport2,                    // 未排序第二页数据
    dailyReport2SortedByClickAsc,    // 按click字段升序排序的第二页数据
    dailyReport2SortedByClickDesc,   // 按click字段降序排序的第二页数据 
    dailyReportPageSize10            // pageSize = 10 的数据
} = dailyReportsMockData;

step 3. 初始化表格组件

在Demo代码中初始化ReportTable组件,并传入必须的属性,包括data, page, onPageChange, pageSize 等等, 具体可参考 ReportTable 组件文档

// 自定义不同字段的表头名、表头描述、是否可以该字段排序
const keyNameMap = {
    click: {
        label: '点击量',
        sortable: true // 是否可作为排序字段,默认false
    }
}

class  Example extends Component {
    constructor(props) {
        super(props);

        this.state = {
            data: dailyReport1.data.list,
            page: 1,
            pageSize: 5,
            totalNumber: dailyReport1.data.page_info.total_number,
            sortName: '',
            sortOrder: '',
            loading: false
        };

        this.handlePageSizeChange = this.handlePageSizeChange.bind(this)
        this.handlePageChange = this.handlePageChange.bind(this)
        this.handleSort = this.handleSort.bind(this)
    }

     // 修改每页展示数据条数后的回调
     handlePageSizeChange(pageSize) {
        // 模拟loading效果
        this.setState({
            loading: true
        })

        const newState = {
            pageSize,
            page: 1
        };

        // 更新表格数据
        if (pageSize === 10) {
            newState.data = dailyReportPageSize10.data.list
        } else if (pageSize === 5) {
            newState.data = dailyReport1.data.list
        }
        this.setState(newState);

        // 结束loading效果
        setTimeout(() => {
            this.setState({
                loading: false
            })
        }, 2000)
    }

    // 修改当前页码后的回调
    handlePageChange(event, page) {
        const { sortName, sortOrder } = this.state
        let data = ''
        if (sortName === 'click') {

            data = sortOrder === 'desc' ? dailyReport1SortedByClickDesc.data.list : dailyReport1SortedByClickAsc.data.list
            if (page === 2) {
                data = sortOrder === 'desc' ? dailyReport2SortedByClickDesc.data.list : dailyReport2SortedByClickAsc.data.list
            }
        } else {
            data = dailyReport1.data.list
            if (page === 2) {
                data = dailyReport2.data.list
            }
        }

        this.setState({
            data,
            page
        });
    }

    // 点击排序之后的回调
    handleSort(event, sortName, sortOrder) {
        const newState = {
            sortName,
            sortOrder,
            page: 1
        }

        // 这里需要根据返回的排序字段名和排序规则重新请求数据
        if (sortName === 'click') {
            newState.data = sortOrder === 'desc' ? dailyReport1SortedByClickDesc.data.list : dailyReport1SortedByClickAsc.data.list
        }

        this.setState(newState);
    }

    render() {
        const { page, pageSize, data, sortName, sortOrder, totalNumber, loading } = this.state
        return (
            <div>
                <ReportTable
                    data={data}
                    keyNameMap={keyNameMap}
                    onPageChange={this.handlePageChange}
                    onPageSizeChange={this.handlePageSizeChange}
                    page={page}
                    pageSize={pageSize}
                    totalNumber={totalNumber}
                    pageSizeList={[5, 10]}
                    sortName={sortName}
                    sortOrder={sortOrder}
                    onSort={this.handleSort}
                    emptyText={'抱歉,暂时没有相关数据'}
                    loading={loading}
                />
            </div>
        );
    }
}

render(<Example/>, document.getElementById('test'));