@td-design/charts
概要
基于 G2 和 G2Plot 的雷数图表组件库
使用方法
用 babel-plugin-import 引入@td-design/charts 组件样式
需要在项目根目录下babel.config.js
文件中加入以下配置:
plugins: [
[
'import',
{
libraryName: '@td-design/charts',
customName: (name) => {
if (name.indexOf('create') > -1) {
return `@td-design/charts/es/utils/${name}`;
}
return `@td-design/charts/es/components/${name}`;
},
style: true,
},
],
],
API
从 @td-design/charts
下导出两种 API:
全部 API 结构如下:
@td-design/charts
|-- components (DOM 组件类)
|-- ChartDom (图表组合组件)
|-- ComBlock (组件显示的载体,包含 border )
|-- ComCard (大屏卡片组件)
|-- ChartPlot (图表组件)
|-- utils (图表生成方法)
|-- createLinePlot (普通折线图)
|-- createColumnPlot (普通柱状图)
|-- createGroupColumnPlot (分组柱状图)
|-- createDonutPlot (基础环图)
|-- createStackColumnPlot (堆叠柱状图)
|-- createRangeColumnPlot (区间柱状图)
|-- createWaterfallPlot (瀑布图)
|-- createLiquidPlot (水波图)
|-- createDonutRosePlot (玫瑰图)
|-- createCustomBarPlot (基础条形图)
|-- createStackRosePlot (堆叠玫瑰图)
|-- createRadarPlot (雷达图)
|-- createStackAreaPlot (堆叠面积图)
|-- createScatterPlot (单象限散点图)
|-- createCustomRangeBarPlot (区间条形图)
|-- createRadialStackPlot (径向堆叠柱形图)
|-- createCustomGroupedBarPlot (分组条形图)
|-- createColumnLinePlot (柱线混合图)
|-- createGroupedColumnLinePlot (分组柱线混合图)
|-- createDualLinePlot (双折线图)
在线文档
具体导出的组件和方法详见 在线文档 。
主题切换方法
如果需要使用图表主题功能以实现主题配置或主题切换。
步骤一:安装环境
安装最新版 umi-plugin-antd-theme
,
步骤二:基础配置
在项目 config 文件夹下新建 theme.config.json 文件,然后加入以下配置:
{
"theme": [
{
"theme": "dark",
"fileName": "dark.css",
"modifyVars": {
"@blue-screen-bg": "#090b2c"
}
},
{
"theme": "light",
"fileName": "light.css",
"modifyVars": {
"@blue-screen-bg": "#fff"
}
}
],
"min": true,
"isModule": true,
"ignoreAntd": false,
"ignoreProLayout": false,
"cache": true,
"extraLibraries": ["@td-design/charts"]
}
theme 下的 modifyVars 下默认可配置 antd 的自带样式变量如:@primary-color 等。
其中 extraLibraries
项目加入组件库名称后可以引入其他库的样式,并且添加组件库中定义的 less 变量到 modifyVars 下,可实现对该变量的主题色自定义配置,就可以实现组件库主题样式的统一配置。
步骤三:项目中使用经过主题色配置的变量
在 src/styles 文件夹下 default.less 下添加该变量的默认配置。如:
@blue-screen-bg: #fff;
在项目的样式文件xxx.module.less
中使用该颜色变量,并从 default.less 文件中引入。antd-pro-merge-less
会自动将该组件库中处理过的样式整合入/theme/xxx.css
下,缓存在 node_modules/.plugin-theme 下 配合 theme/index.ts 中的主题切换方法就可以实现自定义主题色配置了。
步骤四:在项目中初始化/切换使用主题
初始化主题
global.ts 中配置初始 theme ,这里配置了 dark
为初始主题:
((global as unknown) as CustomWindow).chartConfig = {
theme: 'dark',
};
interfaces/common.ts 下需要新增 chartConfig 属性:
export interface CustomWindow extends Window {
chartConfig: {
theme: string;
themeConfig?: {
[name: string]: {
[name: string]: string;
};
};
};
}
在 app.ts 的 render
方法中调用 themeInit
方法,新建 theme/index.ts
并放入以下代码:
import { CustomWindow } from '@/interfaces/common';
const getUrlQuery = (name?: string) => {
let after = window.location.search || window.location.hash;
after = after ? after.split('?')[1] : '';
const query = {};
const strs = after ? after.split('&') : [];
for (let i = 0; i < strs.length; i += 1) {
const keyValueMaps = strs[i] ? strs[i].split('=') : [];
if (keyValueMaps.length === 2) {
query[keyValueMaps[0]] = decodeURIComponent(keyValueMaps[1]);
} else if (keyValueMaps[0]) {
query[keyValueMaps[0]] = null;
}
}
if (name && typeof name !== 'object') {
return query[name];
}
return query;
};
const getFormatedUrl = (paramName: string, paramValue: string) => {
const params = getUrlQuery();
const { origin, pathname } = window.location;
let newUrl = `${origin}${pathname}?`;
const otherParamsKeys = Object.keys(params).filter(item => item !== paramName);
otherParamsKeys.forEach((item, idx) => {
newUrl = newUrl.concat(`${idx !== 0 ? '&' : ''}${item}=${params[item]}`);
});
const formatedUrl = `${newUrl}${otherParamsKeys.length > 0 ? '&' : ''}${paramName}=${paramValue}`;
window.location.href = formatedUrl;
};
export const themeInit = (customTheme?: string) => {
const { chartConfig } = (global as unknown) as CustomWindow;
let { theme } = chartConfig;
let styleLink = document.getElementById('theme-style') as HTMLLinkElement;
const body = document.getElementsByTagName('body')[0];
const newTheme = customTheme || getUrlQuery('theme');
if (newTheme) {
((global as unknown) as CustomWindow).chartConfig.theme = newTheme;
theme = newTheme;
if (customTheme) {
getFormatedUrl('theme', theme);
}
} else {
getFormatedUrl('theme', theme);
}
if (styleLink) {
if (theme) {
styleLink.href = `/theme/${theme}.css`;
body.className = `body-warp-${theme}`;
}
} else {
styleLink = document.createElement('link');
styleLink.type = 'text/css';
styleLink.rel = 'stylesheet';
styleLink.id = 'theme-style';
if (theme) {
styleLink.href = `/theme/${theme}.css`;
body.className = `body-warp-${theme}`;
}
document.body.append(styleLink);
}
};
切换主题
1.如果需要切换主题的功能,则需要配置chartConfig
中的themeConfig
属性,在themeConfig
下需要配置对应主题的属性。
比如:需要dark
和light
的主题切换,则可以配置chartConfig
如下:
((global as unknown) as CustomWindow).chartConfig = {
theme: 'dark',
themeConfig: {
dark: {
legendColor: 'rgba(255, 255, 255, 0.6)',
fontColor: 'rgba(255, 255, 255, 0.4)',
axisStyle: {
stroke: '#666',
},
gridStyle: {
stroke: '#999',
},
donutConfig: {
stroke: '#122749',
},
liquidConfig: {
statistic: {
fill: '#fff',
},
},
radialStackConfig: {
emptyFillColor: 'rgba(255, 255, 255, 0.1)',
},
},
light: {
legendColor: '#666',
fontColor: '#666',
axisStyle: {
stroke: '#ddd',
},
gridStyle: {
stroke: '#ddd',
},
donutConfig: {
stroke: '#fff',
},
liquidConfig: {
statistic: {
fill: '#333',
},
},
radialStackConfig: {
emptyFillColor: 'rgba(235, 248, 255, 0.7)',
},
},
},
};
目前主题库有dark
和light
,上面的属性(如legendColor
)是全部目前图表库暴露的可配置属性,都是可选可不选的,如果不传会用默认的主题设置。如果是自定义的其他主题,图表库则会默认使用dark
主题颜色作为模板。
2.调用 themeInit 方法(从 theme/index.ts 中引入)并传入主题名称即可。如:
import { themeInit } from '@/theme';
themeInit('light');
- 注:在 global.less 中的样式不会被整合,所以修改不会生效。