VUE3:统计分析页面布局+自适应页面参考

一、布局

<template>
    <div class="container1">
        <div class="form white">
            <el-form :inline="true" :rules="rules" :model="queryParams" label-width="80px" ref="querParmRef">
                <el-form-item label="城市" prop="cityId">

                    <el-select v-model="queryParams.cityId" clearable filterable placeholder="请选择城市" style="width: 169px">
                        <el-option v-for="item in citylists" :key="item.english" :label="item.english"
                            :value="item.chinese">
                        </el-option> </el-select>

                </el-form-item>
                <el-form-item label="公司" prop="companyId">

                    <el-select v-model="queryParams.companyId" clearable filterable placeholder="请选择公司"
                        style="width: 169px">
                        <el-option v-for="item in citylists" :key="item.english" :label="item.english"
                            :value="item.chinese">
                        </el-option> </el-select>

                </el-form-item>
                <el-form-item label="日期" prop="date">
                    <el-date-picker v-model="queryParams.date" value-format="YYYY-MM-DD" style="width: 169px" type="date"
                        placeholder="" />

                </el-form-item>

                <el-form-item label="对比日期" prop="date">
                    <el-date-picker v-model="queryParams.date" value-format="YYYY-MM-DD" style="width: 169px" type="date"
                        placeholder="" />

                </el-form-item>
                <el-form-item>
                    <el-button @click="resetQuery">重置</el-button>
                    <el-button type="primary" @click="btntop()" class="btnClick">搜索</el-button>
                </el-form-item>

                <!-- <el-form-item label="起止时间">
                    <el-date-picker style="width: 358px" v-model="queryParams.timeValue" type="datetimerange"
                        range-separator="-" value-format="YYYY-MM-DD HH:mm:ss" start-placeholder="开始时间"
                        end-placeholder="结束时间" :size="size" />
                </el-form-item> -->
                <div>
                </div>
            </el-form>
        </div>

        <div class="echartsBot white">
            <el-tabs v-model="activeName" class="tabs">
                <el-tab-pane label="1" name="first"></el-tab-pane>
                <el-tab-pane label="2" name="second">2</el-tab-pane>
                <el-tab-pane label="3" name="third">3</el-tab-pane>
            </el-tabs>
            <!-- 上部分 -->
            <div class="top">
                <!-- 左边 -->
                <div class="left">
                    <div class="chart chart1"></div>
                    <div class="chart chart2"></div>
                </div>
                <!-- 中间 -->
                <div class="middle">
                    <div class="chart chart3"></div>
                </div>
                <!-- 右边 -->
                <div class="right">
                    <div class="chart chart4"></div>
                </div>
            </div>
            <!-- 下部分 -->
            <div class="bottom">
                <div class="chart chart5"></div>
                <div class="chart chart6"></div>
                <div class="chart chart7"></div>
                <div class="chart chart8"></div>
            </div>
        </div>
    </div>
</template>

<style scoped lang="scss">
.container1 {
    padding: calc(100vw * 15 / 1920);
    display: flex;
    flex-direction: column;
    /* 设置垂直方向排列 */
    height: 100%;
    width: 100%;
    background-color: #F7F8FA;

}

.white {
    background-color: #fff;
}

.echartsBot {
    flex: 1;
    width: 100%;
    padding: 0 calc(100vw * 15 / 1920) calc(100vw * 15 / 1920);
    margin-top: calc(100vw * 10 / 1920);
}

.titles1 {
    width: 100%;
    height: calc(100vw * 20 / 1920);
    font-size: calc(100vw * 14 / 1920);
    font-weight: 600;
    color: #1d2129;
    line-height: calc(100vw * 20 / 1920);
    padding-left: 1vh;
}


/* 上部分 */
.echartsBot .top {
    display: flex;
    height: calc(65% - 50px)
}

/* 左边 */
.echartsBot .left {
    width: 46%;
    display: flex;
    flex-direction: column;
    margin-right: calc(100vw * 15 / 1920);

}

/* 中间 */
.echartsBot .middle {
    width: 27%;
    background-color: #5be948;
    margin-right: calc(100vw * 15 / 1920);

}

/* 右边 */
.echartsBot .right {
    width: 27%;
    background-color: #1e7f97;

}

/* 柱状图 */
.echartsBot .chart {
    /* 修改为需要的宽度和高度 */
    // width: 300px;
    // height: 200px;
}

/* 左边的柱状图 */
.echartsBot .left .chart1 {
    /* 样式设置 */
    flex:1;
    margin-bottom: calc(100vw * 15 / 1920);
    background-color: #64b959;

}

.echartsBot .left .chart2 {
    /* 样式设置 */
    flex:1;
    background-color: #8d2424;

}

/* 中间的柱状图 */
.echartsBot .middle .chart3 {
    /* 样式设置 */
}

/* 右边的柱状图 */
.echartsBot .right .chart4 {
    /* 样式设置 */
}

/* 下部分 */
.echartsBot .bottom {
    display: flex;
    // height: 40%;
    margin-top: calc(100vw * 15 / 1920); // height: calc(50%- 10px);
    height: calc(35% - calc(100vw * 19 / 1920));
}

/* 底部柱状图 */
.echartsBot .bottom .chart {
    /* 修改为需要的宽度和高度 */
    // width: 200px;
    // height: 150px;
}

.echartsBot .bottom .chart5 {
    /* 样式设置 */
    flex: 1;
    background-color: #ecd2d2;
    height: 100%;
    margin-right: calc(100vw * 15 / 1920);


}

.echartsBot .bottom .chart6 {
    /* 样式设置 */
    flex: 1;
    margin-right: calc(100vw * 15 / 1920);

    background-color: #b6c789;
    height: 100%;

}

.echartsBot .bottom .chart7 {
    /* 样式设置 */
    flex: 1;
    margin-right: calc(100vw * 15 / 1920);

    background-color: #a7a2e0;
    height: 100%;

}

.echartsBot .bottom .chart8 {
    /* 样式设置 */
    flex: 1;

    background-color: #dba6d0;
    height: 100%;

}
</style>

 上面效果图的代码,用的flex布局,宽高边距都用了动态的,浏览器窗口大小改变也会自适应

二、分完模块优化

最终效果图如上

完整版代码

 

<template>
    <div class="container1">
        <div class="form white">
            <el-form :inline="true" :rules="rules" :model="queryParams" label-width="80px" ref="querParmRef">
                <el-form-item label="城市" prop="cityId">

                    <el-select v-model="queryParams.cityId" clearable filterable placeholder="请选择城市" style="width: 169px">
                        <el-option v-for="item in citylists" :key="item.english" :label="item.english"
                            :value="item.chinese">
                        </el-option> </el-select>

                </el-form-item>
             
                <el-form-item label="公司" prop="companyId">

                    <el-select v-model="queryParams.companyId" clearable filterable placeholder="请选择公司"
                        style="width: 169px">
                        <el-option v-for="item in citylists" :key="item.english" :label="item.english"
                            :value="item.chinese">
                        </el-option> </el-select>

                </el-form-item>
                <el-form-item label="日期" prop="date">
                    <el-date-picker v-model="queryParams.date" value-format="YYYY-MM-DD" style="width: 169px" type="date"
                        placeholder="" />

                </el-form-item>

                <el-form-item label="对比日期" prop="date">
                    <el-date-picker v-model="queryParams.date" value-format="YYYY-MM-DD" style="width: 169px" type="date"
                        placeholder="" />

                </el-form-item>
                <el-form-item>
                    <el-button @click="resetQuery">重置</el-button>
                    <el-button type="primary" @click="btntop()" class="btnClick">搜索</el-button>
                </el-form-item>

                <!-- <el-form-item label="起止时间">
                    <el-date-picker style="width: 358px" v-model="queryParams.timeValue" type="datetimerange"
                        range-separator="-" value-format="YYYY-MM-DD HH:mm:ss" start-placeholder="开始时间"
                        end-placeholder="结束时间" :size="size" />
                </el-form-item> -->
                <div>
                </div>
            </el-form>
        </div>

        <div class="echartsBot white">
            <el-tabs v-model="activeName" class="tabs">
                <el-tab-pane label="1" name="first"></el-tab-pane>
                <!-- <el-tab-pane label="冷热能效耗能排名总览" name="first"></el-tab-pane> -->
                <el-tab-pane label="2" name="second">2</el-tab-pane>
                <el-tab-pane label="3" name="third">3</el-tab-pane>
            </el-tabs>
            <!-- 上部分 -->
            <div class="top">
                <!-- 左边 -->
                <div class="left">
                    <div class="chart chart1">
                        <div class="titles1">面积排名</div>
                        <Echarts1 :echartList="echartList1" />

                    </div>
                    <div class="chart chart2">
                        <div class="titles1">运营天数排名</div>

                        <Echarts2 :echartList="echartList2" />

                    </div>
                </div>
                <!-- 中间 -->
                <div class="middle">
                    <div class="titles1">COP排名</div>
                    <Echarts3 :echartList="echartList3" />

                    <!-- <div class="chart chart3"></div> -->

                </div>
                <!-- 右边 -->
                <div class="right">
                    <div class="titles1">SCOP排名</div>
                    <Echarts4 :echartList="echartList4" />
                </div>
            </div>
            <!-- 下部分 -->
            <div class="bottom">
                <div class="chart chart5">
                    <div class="titles1">热单耗排名</div>

                    <Echarts5 :echartList="echartList5" />

                </div>
                <div class="chart chart6">
                    <div class="titles1">热单耗排名</div>

                    <Echarts6 :echartList="echartList6" />
                </div>
                <div class="chart chart7">
                    <div class="titles1">热单耗排名</div>

                    <Echarts7 :echartList="echartList7" />
                </div>
                <div class="chart chart8">
                    <div class="titles1">热单耗排名</div>

                    <Echarts8 :echartList="echartList8" />
                </div>
            </div>
        </div>
    </div>
</template>
<script setup>
import { ElMessageBox, ElMessage, ElLoading } from "element-plus";
import Echarts1 from "./echarts/echarts1.vue";
import Echarts2 from "./echarts/echarts2.vue";
import Echarts3 from "./echarts/echarts3.vue";
import Echarts4 from "./echarts/echarts4.vue";
import Echarts5 from "./echarts/echarts5.vue";
import Echarts6 from "./echarts/echarts6.vue";
import Echarts7 from "./echarts/echarts7.vue";
import Echarts8 from "./echarts/echarts8.vue";
const { proxy } = getCurrentInstance();
import { parseTime } from "@/utils/ruoyi";
import { useRoute } from "vue-router";

const echartList1 = ref([
    { cityName: '济南', parkArea: 12 }, { cityName: '济南', parkArea: 12 }, { cityName: '济南', parkArea: 12 },
    { cityName: '济南', parkArea: 12 }, { cityName: '济南', parkArea: 12 }, { cityName: '济南', parkArea: 12 },
    { cityName: '济南', parkArea: 12 }, { cityName: '济南', parkArea: 12 }, { cityName: '济南', parkArea: 12 },
    { cityName: '济南', parkArea: 12 }, { cityName: '济南', parkArea: 12 }, { cityName: '济南', parkArea: 12 },
    { cityName: '济南', parkArea: 12 }, { cityName: '济南', parkArea: 12 }, { cityName: '济南', parkArea: 12 },
    { cityName: '济南', parkArea: 12 }, { cityName: '济南', parkArea: 12 }, { cityName: '济南', parkArea: 12 },
    { cityName: '济南', parkArea: 12 }, { cityName: '济南', parkArea: 12 }, { cityName: '济南', parkArea: 12 },
]);
const echartList2 = ref([
    { cityName: '济南', parkArea: 12 }, { cityName: '济南', parkArea: 12 }, { cityName: '济南', parkArea: 12 },
    { cityName: '济南', parkArea: 12 }, { cityName: '济南', parkArea: 12 }, { cityName: '济南', parkArea: 12 },


]);
const echartList3 = ref([
    { cityName: '济南', parkArea: 12 }, { cityName: '济南', parkArea: 12 }, { cityName: '济南', parkArea: 12 },
    { cityName: '济南', parkArea: 12 }, { cityName: '济南', parkArea: 12 }, { cityName: '济南', parkArea: 12 },


]);
const echartList4 = ref([
    { cityName: '济南', parkArea: 12 }, { cityName: '济南', parkArea: 12 }, { cityName: '济南', parkArea: 12 }


])
const echartList5 = ref([
    { cityName: '济南', parkArea: 12 }, { cityName: '济南', parkArea: 12 }, { cityName: '济南', parkArea: 12 },
    { cityName: '济南', parkArea: 12 }, { cityName: '济南', parkArea: 12 }, { cityName: '济南', parkArea: 12 }


])
const echartList6 = ref([
    { cityName: '济南', parkArea: 12 }, { cityName: '济南', parkArea: 12 }, { cityName: '济南', parkArea: 12 }, { cityName: '济南', parkArea: 12 }, { cityName: '济南', parkArea: 12 }, { cityName: '济南', parkArea: 12 }


])
const echartList7 = ref([
    { cityName: '济南', parkArea: 12 }, { cityName: '济南', parkArea: 12 }, { cityName: '济南', parkArea: 12 }, { cityName: '济南', parkArea: 12 }, { cityName: '济南', parkArea: 12 }, { cityName: '济南', parkArea: 12 }


])
const echartList8 = ref([
    { cityName: '济南', parkArea: 12 }, { cityName: '济南', parkArea: 12 }, { cityName: '济南', parkArea: 12 }, { cityName: '济南', parkArea: 12 }, { cityName: '济南', parkArea: 12 }, { cityName: '济南', parkArea: 12 }


])
const activeName = ref('first')
</script>
<style scoped lang="scss">
.container1 {
    padding: calc(100vw * 15 / 1920);
    display: flex;
    flex-direction: column;
    /* 设置垂直方向排列 */
    height: 100%;
    width: 100%;
    background-color: #F7F8FA;

}

.white {
    background-color: #fff;
}

.echartsBot {
    flex: 1;
    width: 100%;
    padding: 0 calc(100vw * 15 / 1920) ;
    margin-top: calc(100vw * 10 / 1920);
}

.titles1 {
    width: 100%;
    height: calc(100vw * 20 / 1920);
    font-size: calc(100vw * 14 / 1920);
    font-weight: 600;
    color: #1d2129;
    line-height: calc(100vw * 20 / 1920);
    padding-left: 1vh;
}


/* 上部分 */
.echartsBot .top {
    display: flex;
    height: calc(63% - 50px)
}

/* 左边 */
.echartsBot .left {
    width: 46%;
    display: flex;
    flex-direction: column;
    margin-right: calc(100vw * 15 / 1920);

}

/* 中间 */
.echartsBot .middle {
    width: 27%;
    // padding: calc(100vw * 15 / 1920);

    margin-right: calc(100vw * 15 / 1920);
    border-radius: 4px 4px 4px 4px;
    border: 1px solid rgba(61, 61, 61, 0.1);
}

/* 右边 */
.echartsBot .right {
    width: 27%;
    // padding: calc(100vw * 15 / 1920);

    border-radius: 4px 4px 4px 4px;
    border: 1px solid rgba(61, 61, 61, 0.1);
}

/* 柱状图 */
.chart {
    /* 修改为需要的宽度和高度 */
    // width: 300px;
    // height: 200px;
    // padding: calc(100vw * 15 / 1920);

}

/* 左边的柱状图 */
.echartsBot .left .chart1 {
    /* 样式设置 */
    height: calc(50% - calc(100vw * 16 / 1920));
    margin-bottom: calc(100vw * 10 / 1920);
    border-radius: 4px 4px 4px 4px;
    border: 1px solid rgba(61, 61, 61, 0.1);
}

.echartsBot .left .chart2 {
    /* 样式设置 */
    flex: 1;
    border-radius: 4px 4px 4px 4px;
    border: 1px solid rgba(61, 61, 61, 0.1);
}

/* 中间的柱状图 */
.echartsBot .middle .chart3 {
    /* 样式设置 */
}

/* 右边的柱状图 */
.echartsBot .right .chart4 {
    /* 样式设置 */
}

/* 下部分 */
.echartsBot .bottom {
    display: flex;
    // height: 40%;
    margin-top: calc(100vw * 15 / 1920); // height: calc(50%- 10px);
    height: calc(35% - calc(100vw * 19 / 1920));
}

/* 底部柱状图 */
.echartsBot .bottom .chart {
    /* 修改为需要的宽度和高度 */
    // width: 200px;
    // height: 150px;
}

.echartsBot .bottom .chart5 {
    /* 样式设置 */
    flex: 1;
    height: 100%;
    margin-right: calc(100vw * 15 / 1920);
    border-radius: 4px 4px 4px 4px;
    border: 1px solid rgba(61, 61, 61, 0.1);

}

.echartsBot .bottom .chart6 {
    /* 样式设置 */
    flex: 1;
    margin-right: calc(100vw * 15 / 1920);

    height: 100%;
    border-radius: 4px 4px 4px 4px;
    border: 1px solid rgba(61, 61, 61, 0.1);
}

.echartsBot .bottom .chart7 {
    /* 样式设置 */
    flex: 1;
    margin-right: calc(100vw * 15 / 1920);

    height: 100%;
    border-radius: 4px 4px 4px 4px;
    border: 1px solid rgba(61, 61, 61, 0.1);
}

.echartsBot .bottom .chart8 {
    /* 样式设置 */
    flex: 1;

    height: 100%;
    border-radius: 4px 4px 4px 4px;
    border: 1px solid rgba(61, 61, 61, 0.1);
}
</style>

具体echarts图

第一个

<template>
  <div id="echarts1"></div>
</template>

<script setup>
import * as echarts from "echarts";
const emit = defineEmits();

const props = defineProps({
  echartList: {
    default: [],
  },
});
const initChart = () => {
  let xdata = [];
  let ydata1 = [];
  let xdataid = [];
  props.echartList.forEach((item) => {
    xdata.push(item.cityName);
    xdataid.push(item.cityId);
    ydata1.push(item.parkArea);
  });
  const machart = echarts.init(document.getElementById("echarts1"));
  var defaultShowNum = 10; // 默认显示的数据条数

  var start = 0;
  var end = Math.min(defaultShowNum, xdata.length) / xdata.length * 100;
  var option = {
    tooltip: {
      trigger: "axis",
      formatter: '{c}', // 修改为只显示名称和数值

      backgroundColor: 'rgba(255,255,255,0.8)', // 气泡框背景颜色
      textStyle: {
        color: '#333', // 文字颜色
        fontSize: 14 // 文字大小
      },
      position: function (pos, params, el, elRect, size) {
        return { left: pos[0], top: pos[1] };
      }, // 设置气泡框的位置在鼠标悬浮的地方
      padding: [10, 10, 10, 10], // 设置气泡框的内边距
      extraCssText: 'width: auto; height: auto; text-align: center; line-height: 30px;', // 设置气泡框的宽度、高度、文本居中显示

    },
    dataZoom: [
      {
        type: 'slider', // 缩放条类型为滑动条
        show: true, // 显示缩放条
        start: start, // 根据数据计算的开始位置
        end: end, // 根据数据计算的结束位置
        bottom: '5%', // 距离底部的距离
        height: 5, // 设置高度
      },
      {
        type: 'inside', // 内置缩放条
        start: start,
        end: end,
      },
    ],
    calculable: true,
    // legend: {
    //   // data: ["xxx"],
    //   left: "left",s
    //   x: "left",
    //   top: "0%",
    //   left: "2%",
    //   icon: "roundRect",
    //   itemWidth: 10, // 设置宽度
    //   itemHeight: 10, // 设置高度
    // },
    color: ["#579AFF", "#B1B1F0", "#F7BEBE", '#BDF6E6'],
    grid: {
      top: "14sss%",
      bottom: "10%",
      left: "1%",
      right: "1%",
      containLabel: true,
    },
    xAxis: [
      {
        type: "category",
        data: xdata,
        axisTick: {
          show: false, // 不显示刻度
        },

      },
    ],
    yAxis: [
      {
        type: "value",

      },
    ],

    series: [
      {
        // name: "城市占比",
        type: "bar",
        data: ydata1,
        barWidth: "35%",
        //   label: { // 添加标签配置
        //   show: true, // 显示标签
        //   position: 'top', // 标签位置为柱子顶部
        //   formatter: '{c} ', // 标签内容格式为数据加单位
        // },
      },

    ],
  };
  machart.setOption(option);
  setTimeout(() => {
    window.addEventListener("resize", resizeFn);
  }, 100);
  const resizeFn = () => {
    return machart.resize();
  };
  machart.on("click", (params) => {
    if (params.componentType === "series") {
      const dataIndex = params.dataIndex;
      const yValue = xdata[dataIndex]; // 获取对应柱子的y值
      const cidtyid = xdataid[dataIndex]; // 获取对应柱子的y值
      emit("changedi", yValue, cidtyid);

      // 在这里你可以对获取到的y值进行其他操作,比如弹窗显示等
    }
  });
};
setTimeout(() => {
  initChart();
}, 800);
defineExpose({
  initChart,
});
onBeforeUnmount(() => {
  // 离开页面必须进行移除,否则会造成内存泄漏,导致卡顿
  window.removeEventListener("resize", initChart);
});
</script>

<style scoped>
#echarts1 {
  width: 100%;
  height: 95%;
  /* height:    calc(30vh- 10px); */
}
</style>

右边两个

<template>
  <div id="echarts3"></div>
</template>

<script setup>
import * as echarts from "echarts";
const emit = defineEmits();

const props = defineProps({
  echartList: {
    default: [],
  },
});
const initChart = () => {
  let xdata = [];
  let ydata1 = [];
  let xdataid = [];
  props.echartList.forEach((item) => {
    xdata.push(item.cityName);
    xdataid.push(item.cityId);
    ydata1.push(item.parkArea);
  });
  const machart = echarts.init(document.getElementById("echarts3"));
  var defaultShowNum = 10; // 默认显示的数据条数

  var start = 0;
  var end = Math.min(defaultShowNum, xdata.length) / xdata.length * 100;
  var option = {
    tooltip: {
      trigger: "axis",
      formatter: '{c}', // 修改为只显示名称和数值

      backgroundColor: 'rgba(255,255,255,0.8)', // 气泡框背景颜色
      textStyle: {
        color: '#333', // 文字颜色
        fontSize: 14 // 文字大小
      },
      position: function (pos, params, el, elRect, size) {
        return { left: pos[0], top: pos[1] };
      }, // 设置气泡框的位置在鼠标悬浮的地方
      padding: [10, 10, 10, 10], // 设置气泡框的内边距
      extraCssText: 'width: auto; height: auto; text-align: center; line-height: 30px;', // 设置气泡框的宽度、高度、文本居中显示

    },
    dataZoom: [
      {
        type: 'slider',
        orient: 'vertical', // 设置为垂直方向
        show: true,
        start: start,
        end: end,
        right: 0, // 距离右侧的距离
        width: 10, // 设置宽度
      },
      {
        type: 'inside', // 内置缩放条
        start: start,
        end: end,
      },
    ],
    calculable: true,
    // legend: {
    //   // data: ["xxx"],
    //   left: "left",s
    //   x: "left",
    //   top: "0%",
    //   left: "2%",
    //   icon: "roundRect",
    //   itemWidth: 10, // 设置宽度
    //   itemHeight: 10, // 设置高度
    // },
    // color: ["#579AFF", "#B1B1F0", "#F7BEBE", '#BDF6E6'],
    grid: {
      top: "5%",
      bottom: "1%",
      left: "1%",
      right: "8%",
      containLabel: true,
    },
    yAxis: [
      {
        type: "category",
        data: xdata.reverse(),
        axisLine: {
          show: false, // 隐藏坐标轴线
        },
        axisTick: {
          show: false, // 不显示刻度线
        },
        axisLabel: {
          show: true, // 显示坐标轴标签
        },
      },
    ],
    xAxis: [
      {
        type: "value",
        show: false, // 不显示x轴
      },
    ],

    series: [
      {
        // name: "城市占比",
        type: "bar",
        data: ydata1.reverse(),
        barWidth: "35%",
        itemStyle: {
          color: function (params) {
            if (params.dataIndex >= xdata.length - 3) {
              // 最后三条数据
              if (params.dataIndex === xdata.length - 1) {
                return '#E96163'; // 设置最后一条数据的颜色
              } else if (params.dataIndex === xdata.length - 2) {
                return '#FEA935'; // 设置倒数第二条数据的颜色
              } else {
                return '#F0DC5A'; // 设置倒数第三条数据的颜色
              }
            } else {
              return '#579AFF'; // 其他数据的颜色
            }
          }
        },

      },

    ],
  };
  machart.setOption(option);
  setTimeout(() => {
    window.addEventListener("resize", resizeFn);
  }, 100);
  const resizeFn = () => {
    return machart.resize();
  };
  machart.on("click", (params) => {
    if (params.componentType === "series") {
      const dataIndex = params.dataIndex;
      const yValue = xdata[dataIndex]; // 获取对应柱子的y值
      const cidtyid = xdataid[dataIndex]; // 获取对应柱子的y值
      emit("changedi", yValue, cidtyid);

      // 在这里你可以对获取到的y值进行其他操作,比如弹窗显示等
    }
  });
};
setTimeout(() => {
  initChart();
}, 800);
defineExpose({
  initChart,
});
onBeforeUnmount(() => {
  // 离开页面必须进行移除,否则会造成内存泄漏,导致卡顿
  window.removeEventListener("resize", initChart);
});
</script>

<style scoped>
#echarts3 {
  width: 100%;
  height: 95%;
  /* height:    calc(30vh- 10px); */
}
</style>

最下面的

<template>
  <div id="echarts8"></div>
</template>

<script setup>
import * as echarts from "echarts";
const emit = defineEmits();

const props = defineProps({
  echartList: {
    default: [],
  },
});
const initChart = () => {
  let xdata = [];
  let ydata1 = [];
  let xdataid = [];
  props.echartList.forEach((item) => {
    xdata.push(item.cityName);
    xdataid.push(item.cityId);
    ydata1.push(item.parkArea);
  });
  const machart = echarts.init(document.getElementById("echarts8"));
  var defaultShowNum = 10; // 默认显示的数据条数

  var start = 0;
  var end = Math.min(defaultShowNum, xdata.length) / xdata.length * 100;
  var option = {
    tooltip: {
      trigger: "axis",
      formatter: '{c}', // 修改为只显示名称和数值

      backgroundColor: 'rgba(255,255,255,0.8)', // 气泡框背景颜色
      textStyle: {
        color: '#333', // 文字颜色
        fontSize: 14 // 文字大小
      },
      position: function (pos, params, el, elRect, size) {
        return { left: pos[0], top: pos[1] };
      }, // 设置气泡框的位置在鼠标悬浮的地方
      padding: [10, 10, 10, 10], // 设置气泡框的内边距
      extraCssText: 'width: auto; height: auto; text-align: center; line-height: 30px;', // 设置气泡框的宽度、高度、文本居中显示

    },
    dataZoom: [
      {
        type: 'slider', // 缩放条类型为滑动条
        show: true, // 显示缩放条
        start: start, // 根据数据计算的开始位置
        end: end, // 根据数据计算的结束位置
        bottom: 10, // 距离底部的距离
        height: 5, // 设置高度
      },
      {
        type: 'inside', // 内置缩放条
        start: start,
        end: end,
      },
    ],
    calculable: true,
    // legend: {
    //   // data: ["xxx"],
    //   left: "left",s
    //   x: "left",
    //   top: "0%",
    //   left: "2%",
    //   icon: "roundRect",
    //   itemWidth: 10, // 设置宽度
    //   itemHeight: 10, // 设置高度
    // },
    color: ["#579AFF", "#B1B1F0", "#F7BEBE", '#BDF6E6'],
    grid: {
      top: "8%",
      bottom: "8%",
      left: "1%",
      right: "1%",
      containLabel: true,
    },
    xAxis: [
      {
        type: "category",
        data: xdata,
        axisTick: {
          show: false, // 不显示刻度
        },

      },
    ],
    yAxis: [
      {
        type: "value",

      },
    ],

    series: [
      {
        // name: "城市占比",
        type: "bar",
        data: ydata1,
        barWidth: "35%",
        itemStyle: {
          color: function (params) {
            // 判断是否为最上面的三个柱子,分别设置为红色、橘色、黄色
            if (params.dataIndex <= 2) {
              return params.dataIndex === 0 ? '#E96163' : params.dataIndex === 1 ? '#FEA935' : '#F0DC5A';
            } else {
              return '#D9D9D9'; // 设置其他柱子的颜色
            }
          }
        },
      },

    ],
  };
  machart.setOption(option);
  setTimeout(() => {
    window.addEventListener("resize", resizeFn);
  }, 100);
  const resizeFn = () => {
    return machart.resize();
  };
  machart.on("click", (params) => {
    if (params.componentType === "series") {
      const dataIndex = params.dataIndex;
      const yValue = xdata[dataIndex]; // 获取对应柱子的y值
      const cidtyid = xdataid[dataIndex]; // 获取对应柱子的y值
      emit("changedi", yValue, cidtyid);

      // 在这里你可以对获取到的y值进行其他操作,比如弹窗显示等
    }
  });
};
setTimeout(() => {
  initChart();
}, 800);
defineExpose({
  initChart,
});
onBeforeUnmount(() => {
  // 离开页面必须进行移除,否则会造成内存泄漏,导致卡顿
  window.removeEventListener("resize", initChart);
});
</script>

<style scoped>
#echarts8 {
  width: 100%;
  height: 95%;
  /* height:    calc(30vh- 10px); */
}
</style>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/417919.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

力扣递归:路径总和

思路&#xff1a;此题思路为递归实现&#xff0c;递归思路为&#xff1a;在每层递归的过程中将各个节点的数据记录下来&#xff0c;不断将减少目标数据的值准备进行判断&#xff0c;当进行到叶子节点时要进行判断 /*** Definition for a binary tree node.* struct TreeNode {…

OJ_二叉树最短路径长度

题干 C实现 #define _CRT_SECURE_NO_WARNINGS #include<iostream> #include<vector> using namespace std;struct TreeNode {int num;TreeNode* left;TreeNode* right;TreeNode* parent; };void createTree(vector<TreeNode*>& nodeArr, int n) {for (i…

2000-2022年上市公司绿色专利申请占比/数据

2000-2022年上市公司绿色专利申请占比数据 1、时间&#xff1a;2000-2022年 2、来源&#xff1a;国家知识产权局、WIPO绿色专利清单 3、指标&#xff1a;年份、股票代码、股票简称、行业代码、省份、城市、区县、行政区划代码、城市代码、区县代码、首次上市年份、上市状态、…

又降价啦!2024年阿里云核心产品价格全线下调,最高幅度达55%

2024年3月1日开始&#xff0c;阿里云将开启新一轮的降价政策&#xff0c;核心产品价格全线下调&#xff0c;平均降幅20%&#xff0c;最高幅度达55%&#xff0c;阿里云希望通过此次大规模降价&#xff0c;让更多企业和开发者用上先进的公共云服务&#xff0c;加速云计算在中国各…

深度学习 精选笔记(8)梯度消失和梯度爆炸

学习参考&#xff1a; 动手学深度学习2.0Deep-Learning-with-TensorFlow-bookpytorchlightning ①如有冒犯、请联系侵删。 ②已写完的笔记文章会不定时一直修订修改(删、改、增)&#xff0c;以达到集多方教程的精华于一文的目的。 ③非常推荐上面&#xff08;学习参考&#x…

备战蓝桥杯Day19 - 堆排序基础知识

一、每日一题 - 填充 详细题解 s input() # 输入字符串 n len(s) # 定义字符的长度 judge ["00", "11", "0?", "1?", "?0", "?1", "??"] # 把所有的情况一一列举出来 count 0 # 设置计数…

【Python】PyGameUI控件

哈里前段时间写了一个windows平板上自娱自乐&#xff08;春节和家人一起玩&#xff09;基于pygame的大富翁游戏。 pygame没有按钮之类的UI控件&#xff0c;写起来不怎么顺手。就自己写一个简单的框架。 仓库地址 哈里PygameUi: pygame ui封装自用 (gitee.com) 使用示例 示…

Tomcat 软件和配置文件 基本介绍

一 &#xff0c;web知识 简介 &#xff08;一&#xff09;web技术 1&#xff0c;http协议和 B/S &#xff08;Browser/Server&#xff09;结构 最早出现了CGl (Common Gateway Interface)通用网关接口&#xff0c;通过浏览器中输入URL直接映射到一个服务器端的脚本程序执行&…

从单体服务到微服务:多模式 Web 应用开发记录<三>预初始化属性

相关文章&#xff1a; 多模式 Web 应用开发记录<一>背景&全局变量优化多模式 Web 应用开发记录<二>自己动手写一个 Struts 开头先看一个简单的例子&#xff0c;这是 ftl 文件的一个表单&#xff1a; <form id"validateForm" action"#&quo…

【程序员是如何看待“祖传代码”的?】《代码的遗产:探索程序员眼中的“祖传代码”》

程序员是如何看待“祖传代码”的&#xff1f; 在程序员的世界里&#xff0c;代码不仅仅是构建软件的基石&#xff0c;它们也承载着历史、智慧和技术的演变。在我的编程生涯中&#xff0c;我遇到过许多神奇而独特的“祖传代码”&#xff0c;这些代码如同古老的魔法书&#xff0…

【C语言】三子棋

前言&#xff1a; 三子棋是一种民间传统游戏&#xff0c;又叫九宫棋、圈圈叉叉棋、一条龙、井字棋等。游戏规则是双方对战&#xff0c;双方依次在9宫格棋盘上摆放棋子&#xff0c;率先将自己的三个棋子走成一条线就视为胜利。但因棋盘太小&#xff0c;三子棋在很多时候会出现和…

C++面试常见八股分享

1.unordered_set和set&#xff0c;unordered_map和map的区别 set 和 map 是 C STL 中的两种关联容器&#xff0c;而 unordered_set 和 unordered_map 是 C11 新增的基于哈希表的关联容器。它们之间的主要区别在于底层的数据结构和操作复杂度。 set 和 unordered_set&#xff1…

黑马程序员——接口测试——day05——Request库、Cookie、Session、UnitTest框架

目录&#xff1a; Requests库 Requests库安装和简介设置http请求语法应用案例 案例1案例2案例3案例4Cookie Cookie简介CookieSession认证方式案例5-看演示&#xff0c;此代码不需实现Session Session简介Session自动管理Cookie案例6面试题Cookie和Session区别获取指定响应数据…

云原生架构技术揭秘:探索容器技术的奥秘

云原生的概念和演进都是围绕云计算的核心价值展开的&#xff0c;比如弹性、自动化、韧性&#xff0c;所以云原生所涵盖的技术领域非常丰富。 随着云计算技术的不断发展&#xff0c;云原生架构已经成为了新一代软件开发的重要趋势。本文将为您介绍云原生架构的相关技术&#xf…

单片机精进之路-9ds18b20温度传感器

ds18b20复位时序图&#xff0c;先将b20的数据引脚拉低至少480us&#xff0c;然后再将数据引脚拉高15-60us&#xff0c;再去将测传感器的数据引脚是不是变低电平并保持60-240us&#xff0c;如果是&#xff0c;则说明检测到温度传感器&#xff0c;并正常工作。需要在240us后才能检…

鸿蒙真有前景吗?是真是假?

直到“纯血鸿蒙”发布&#xff0c;才看清华为真正的布局&#xff0c;这一招实在是高明&#xff01; “纯血鸿蒙”发布之前&#xff0c;国内大批人唱衰华为&#xff0c;唱衰鸿蒙系统的生态&#xff0c;认为大概率会走诺基亚和微软的老路&#xff0c;没想到“纯血鸿蒙”一经推出…

高质 智能 绿色低碳棒线材轧制 智能测径仪等亦起关键作用

第十一届棒线材会议围绕推动轧钢装备数字化、智能化、绿色化转型升级&#xff0c;实现高质量发展&#xff0c;高质量、智能化、绿色低碳主题&#xff0c;将于4月22-24日在贵州省六盘水市召开。这也是轧钢生产近几年的发展趋势。 在线棒材生产中&#xff0c;蓝鹏测控可提供三种类…

每天十条linux知识点-24-0226(1)

文章目录 1.在哪下载linux内核源码&#xff1f;2.linux文件夹都有哪些文件&#xff1f;arch&#xff1a;包含和硬件体系结构相关的代码&#xff0c;每种平台占一个相应的目录&#xff0c;如i386、arm、arm64、powerpc、mips等。block&#xff1a;块设备驱动程序I/O调度。certs&…

又降价啦!2024年腾讯云服务器优惠价格表,不看后悔!

腾讯云服务器多少钱一年&#xff1f;62元一年起&#xff0c;2核2G3M配置&#xff0c;腾讯云2核4G5M轻量应用服务器218元一年、756元3年&#xff0c;4核16G12M服务器32元1个月、312元一年&#xff0c;8核32G22M服务器115元1个月、345元3个月&#xff0c;腾讯云服务器网txyfwq.co…

高级语言期末2010级B卷(软件学院)

1.编写程序根据如下公式计算X的值&#xff08;精确到1e-5&#xff09;。 #include <stdio.h>int main(){int i1;double flag1.0/(2*i-1)*2.0*i/(2*i-1);double sum0;while(flag>1e-5){sumflag;i;flag1.0/(2*i-1)*2.0*i/(2*i-1);}printf("%lf",sum);return 0…