| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147 |
- import {
- PropType,
- defineComponent,
- nextTick,
- onMounted,
- ref,
- toRefs,
- watch
- } from 'vue';
- import styles from '../index.module.less';
- import icons from '../icons.json';
- import { Badge, Image, Skeleton, SkeletonParagraph } from 'vant';
- import * as echarts from 'echarts';
- import { ISubjectDistribution } from '../type';
- import icon_2 from '../image/icon_2.png';
- type EChartsOption = echarts.EChartsOption;
- const colors = [
- '#5B8FF9',
- '#F6BD16',
- '#5AD8A6',
- '#E8684A',
- '#5D7092',
- '#6DC8EC'
- ];
- export default defineComponent({
- name: 'Subjects',
- props: {
- list: {
- type: Array as PropType<ISubjectDistribution[]>,
- default: () => []
- }
- },
- setup(props) {
- const firstInit = ref(false);
- const echratsRef = ref();
- const { list } = toRefs(props);
- watch(
- () => list.value,
- () => {
- firstInit.value = true;
- nextTick(() => {
- handleInit();
- });
- }
- );
- let myChart: echarts.ECharts;
- const handleInit = () => {
- if (!list.value.length) return;
- if (myChart) {
- myChart.dispose();
- }
- myChart = echarts.init(echratsRef.value);
- const option: EChartsOption = {
- grid: {
- left: 8,
- top: 16,
- right: 5,
- bottom: 5,
- containLabel: true
- },
- xAxis: {
- type: 'category',
- axisTick: {
- show: false
- },
- axisLabel: {
- color: '#333',
- fontSize: 10,
- rotate: 30
- },
- axisLine: {
- lineStyle: {
- color: '#F2F2F2'
- }
- },
- data: list.value.map(item => item.subjectName)
- },
- yAxis: {
- type: 'value'
- },
- series: [
- {
- data: list.value.map(item => item.studentNum),
- type: 'bar',
- label: {
- show: true,
- position: 'top'
- },
- itemStyle: {
- color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
- { offset: 0, color: '#FFD1A9' },
- { offset: 1, color: '#FFCAD0' }
- ])
- },
- barWidth: 20
- }
- ]
- };
- option && myChart.setOption(option);
- };
- return () => (
- <div class={styles.item}>
- <div class={styles.itemTop}>
- <Image class={styles.icon} src={icons[2]} />
- <div class={styles.title}>声部分布</div>
- <div class={styles.des}>(单位:人)</div>
- </div>
- {!firstInit.value && (
- <div class={[styles.subjectContainer, styles.itemEmtry]}>
- <Skeleton loading={true}>
- {{
- template: () => (
- <div class={styles.subjectEcharts}>
- <SkeletonParagraph />
- <SkeletonParagraph />
- <SkeletonParagraph />
- <SkeletonParagraph />
- <SkeletonParagraph />
- <SkeletonParagraph />
- </div>
- )
- }}
- </Skeleton>
- </div>
- )}
- <div
- style={{ display: list.value.length ? '' : 'none' }}
- class={styles.subjectContainer}>
- <div class={styles.subjectEcharts} ref={echratsRef}></div>
- </div>
- {firstInit.value && !list.value.length && (
- <div class={[styles.gradeContainer, styles.itemEmtry]}>
- <Image src={icon_2} />
- </div>
- )}
- </div>
- );
- }
- });
|