stories/chart.pie.stories.js (453 lines of code) (raw):

import React, { useEffect, useMemo, useState } from 'react'; import { storiesOf } from '@storybook/react'; import { action } from '@storybook/addon-actions'; import { withKnobs, number, array } from '@storybook/addon-knobs'; import { Wpie, Wnumber, Wcontainer } from '@alicloud/cloud-charts'; const data = [ { name: '浏览器占比', data: [ ['Firefox', 45.0], ['IE', 26.8], ['Chrome', -12.8222222], ['Safari', 8.5], ['Opera', 6.2], ['Others', 0.7], ], }, ]; const extermeData = [ { name: '浏览器占比', data: [ ['计算', 90860.0], ['存储', 6067.8], ['网络', 459.8], ['数据库22222222', 102.5], ['云产品1', 0], ['云产品2', 0], ['云产品3', 0], ], }, ]; const temp = [ { name: '浏览器占比', data: [['Firefox', 45.0]], }, ]; // function WdashboardDemo() { // const data = number('仪表盘数字', 20); // const arr = array('值域范围', [0, 100],); // const [count, setCount] = useState(data); // const [range, setRange] = useState(arr); // useMemo(() => { // setRange(arr.map(Number)); // setCount(data); // }, [data, arr]); // return <Wdashboard data={count} config={{range}} className="demos"/>; // } class NewData extends React.Component { state = { data, }; componentDidMount() { setInterval(() => { let t = Date.now(); this.setState({ data: temp, }); }, 2000); } render() { return ( <Wcontainer className="demos"> <Wpie height="300" config={{ select: true, geomStyle: { cursor: 'pointer', }, }} data={this.state.data} /> </Wcontainer> ); } } const stories = storiesOf('Wpie', module); stories.add('饼图', () => ( <Wcontainer className="demos"> <Wpie width={300} height="300" config={{ label: true, // outerRadius: 0.5, legend: { // align: 'top', // padding: [20, 0, 0, 20] // nameFormatter(v) { // return v + v; // }, // valueFormatter(v) { // return `${v}%`; // }, unit: '¥', "needUnitTransform": true, "valueType": "money", decimal: 3, }, cycle: true, innerContent: true, tooltip: { // valueFormatter(n, ...args) { // // console.log(args); // return n; // }, }, }} data={data} /> </Wcontainer> )); stories.add('饼图-为0测试', () => ( <Wcontainer className="demos"> <Wpie width={300} height="300" config={{ legend: { valueFormatter(v, d) { return d.percent; }, }, }} data={data_0} /> </Wcontainer> )); stories.add('标签饼图', () => ( <Wcontainer className="demos"> <Wpie height="300" config={{ label: true, legend: false, }} data={data} /> </Wcontainer> )); stories.add('块可选饼图', () => ( <Wcontainer className="demos"> <Wpie height="300" config={{ select: true, geomStyle: { cursor: 'pointer', }, }} data={data} /> </Wcontainer> )); stories.add('环图', () => ( <Wcontainer className="demos"> <Wpie height="300" config={{ cycle: true, showDecoration: { // innerRadius: 100 // 自定义圆环底 }, }} data={data} /> </Wcontainer> )); stories.add('带内容环图', () => ( <Wcontainer className="demos"> <Wpie height="300" config={{ cycle: true, }} data={data} > <Wnumber bottomTitle="现代浏览器占比" unit="%"> 72.5 </Wnumber> </Wpie> </Wcontainer> )); stories.add('带点选饼图', () => ( <Wcontainer className="demos"> <NewData /> </Wcontainer> )); stories.add('带标签环图', () => ( <Wcontainer className="demos"> <Wpie height="300" config={{ cycle: true, label: true, legend: false, }} data={data} /> </Wcontainer> )); // stories.add('仪表盘', () => ( // <WdashboardDemo data={11} className="demos"/> // )); stories.add('饼图数据从有到无', () => { const [d, setD] = useState(data); useEffect(() => { const timer = setTimeout(() => { setD([]); // setD([{ name: '浏览器占比', data: [] }]); }, 2000); return () => clearTimeout(timer); }, []); return ( <Wcontainer className="demos"> <Wpie height="300" config={{ cycle: true, tooltip: { valueFormatter: function (v, data) { return v + '%'; }, }, legend: { valueFormatter: function (v, data) { return v + '%'; }, }, }} data={d} /> </Wcontainer> ); }); stories.add('饼图数据从无到有', () => { const [d, setD] = useState([]); useEffect(() => { const timer = setTimeout(() => { setD(data); // setD([{ name: '浏览器占比', data: [] }]); }, 2000); return () => clearTimeout(timer); }, []); return ( <Wcontainer className="demos"> <Wpie height="300" config={{ cycle: true, tooltip: { valueFormatter: function (v, data) { return v + '%'; }, }, legend: { valueFormatter: function (v, data) { return v + '%'; }, }, }} data={d} > <Wnumber bottomTitle="现代浏览器占比" unit="%"> 72.5 </Wnumber> </Wpie> </Wcontainer> ); }); stories.add('限定角度', () => ( <Wcontainer className="demos"> <Wpie width={500} height="300" config={{ cycle: true, startAngle: Math.PI, endAngle: 1.5 * Math.PI, // outerRadius: 1, }} data={data} > asdklfh </Wpie> </Wcontainer> )); const longData = [ { name: '浏览器占比', data: [ ['Firefox', 45.0], ['IE', 26.8], ['Chrome', 12.8], ['Safari', 8.5], ['Opera', 6.2], ['Others', 0.7], ['Firefox111Firefox111', 45.0], ['IE111IE111', 26.8], ['Chrome111Chrome111', 12.8], ['Safari111Safari111', 8.5], ['Opera111Opera111', 6.2], ['Others111Others222', 0.7], ['Firefox111Firefox222', 45.0], ['IE111IE222', 26.8], ['Chrome111Chrome222', 12.8], ['Safari111Safari222', 8.5], ['Opera111Opera222', 6.2], ['Others111Others222', 0.7], ['Chrome111Chrome333', 12.8], ['Safari111Safari333', 8.5], ['Opera111Opera333', 6.2], ['Others111Others333', 0.7], ], }, ]; stories.add('饼图图例切分', () => ( <Wcontainer className="demos"> <Wpie width={380} height="240" config={{ legend: { customConfig: { // maxWidth: 300, // maxItemWidth: 300, // maxWidthRatio: 0.5, }, }, }} data={longData} /> </Wcontainer> )); const zeroData = [ { name: '浏览器占比', data: [ ['Firefox', 45.0], ['IE', 26.8], ['Chrome', 12.8], ['Safari', 8.5], ['Opera', 0], ['Others', 0], ], }, ]; stories.add('可筛选为全0的饼图', () => ( <Wcontainer className="demos"> <Wpie width={300} height="300" data={zeroData} config={{ legend: { valueFormatter(v, d) { return d.percent; }, }, }} /> </Wcontainer> )); stories.add('饼图-蜘蛛标签', () => ( <Wcontainer className="demos"> <Wpie width={300} height="300" data={[ { name: '浏览器占比', data: [ ['Firefox', 45.0], ['IE', 26.8], ['Chrome', 32.8], ['Safari', 28.5], ['Opera', 18.5], ], }, ]} config={{ cycle: true, outerRadius: 0.4, // 动态调整 legend: false, label: { layout: [ { type: 'pie-spider' }, { type: 'limit-in-plot', cfg: { action: 'translate' /** 或 ellipsis */ } }, ], labelFormatter: (v, datam) => { return `${datam?._origin?.x}(${v})`; }, }, }} /> </Wcontainer> )); stories.add('自动填充中心内容', () => { const [loading, setLoading] = useState(true); useEffect(() => { setTimeout(() => { setLoading(false); }, 3000); }, []); return ( <Wcontainer className="demos"> <Wpie width={300} height="300" data={data} loading={loading} config={{ cycle: true, innerContent: true, }} /> </Wcontainer> ); }); stories.add('大数据判断', () => ( <Wcontainer className="demos"> <Wpie width={300} height="300" data={extermeData} config={{ cycle: true, // 增加间隔后推荐增加点击效果 // 保证占比小的数据的显示 select: true, // geomStyle(x, y, type) { // return { // stroke: themes['widgets-color-background'], // lineWidth: 2, // cursor: 'pointer', // }; // }, innerContent: { value: 40000 }, autoFormat: { // percent: 0.05 }, // legend: { // position: 'bottom', // align: 'center', // collapseRow: Math.ceil(extermeData[0].data.length / 2), // customConfig: { // // pageNavigator: false // } // } }} /> </Wcontainer> )); const testData = [ { name: '浏览器占比', data: [ ['Firefox', 0], ['IE', 0], ['Chrome', 0], ], }, ]; stories.add('环图bug', () => { useEffect(() => { setTimeout(() => { document.dispatchEvent(new CustomEvent('setAiscWidgetsLanguage', { detail: 'en-us' })); }, 3000); }, []); return ( <Wcontainer className="demos"> <Wpie height="300" data={testData} config={{ cycle: true, }} /> </Wcontainer> ); });