zoukankan      html  css  js  c++  java
  • vue2使用echarts markLine中的symbol引入png图片路径问题解决过程

    在刚刚的开发中有个需求,需求是这样的:需要一条markLine标记线,标记线的顶端形状为实心箭头,且颜色和markLine标记线颜色不一致,这个箭头的方向会有一个接口返回的参数控制箭头在markLine标记线的首端还是末端,

    如下图所示:

    刚开始用的是echarts提供的默认配置(ECharts 提供的标记类型包括 'circle', 'rect', 'roundRect', 'triangle', 'diamond', 'pin', 'arrow', 'none

    symbol:['arrow','arrow'],但无法让箭头和markLine标记线颜色不一致。

    后来又用了svg图片,因为svg图片可以直接修改颜色和尺寸大小不会使图片失真,echarts引入svg图片的方法如下:

    markLine: {
    silent: true,
    /* symbol: "none", */
    /* symbol: ["path://M359.665 1021.432c-193.509 0-350.931-157.428-350.931-350.931s157.428-350.931 350.931-350.931 350.931 157.428 350.931 350.931-157.428 350.931-350.931 350.931zM359.665 366.367c-167.695 0-304.145 136.45-304.145 304.145s136.45 304.145 304.145 304.145c167.71 0 304.145-136.45 304.145-304.145s-136.435-304.145-304.145-304.145z","path://M359.665 1021.432c-193.509 0-350.931-157.428-350.931-350.931s157.428-350.931 350.931-350.931 350.931 157.428 350.931 350.931-157.428 350.931-350.931 350.931zM359.665 366.367c-167.695 0-304.145 136.45-304.145 304.145s136.45 304.145 304.145 304.145c167.71 0 304.145-136.45 304.145-304.145s-136.435-304.145-304.145-304.145z"], */
    symbol: ['path://M851.56351056 616.51087917l-318.18515625-318.18515625-317.22099609 317.2209961z', 'path://M851.56351056 616.51087917l-318.18515625-318.18515625-317.22099609 317.2209961z'],
    label: {
    formatter: function(val) {
    return (val.value = "");
    }
    },
    data:data
    }
    还是无法实现上述需求。
    最后,查阅echarts官网文档,可以使用png图片,既然能引入png图片,那上述需求就能实现,因为png图片无法直接改变其颜色,不过用PS可以改的,我们的讨论和PS无关。

    (可以通过 'image://url' 设置为图片,其中 URL 为图片的链接,或者 dataURI

    URL 为图片链接例如:

    'image://http://xxx.xxx.xxx/a/b.png')
    引入网络图片固然可行,但两个很小的png图片没必要放到服务器上,引入网络图片。
    这样,就把两个箭头图片放到了vue项目的src/assets/img下了


    但实际上,这种方式引入图片也不能实现上述需求,具体原因尚不明确。希望有知道原因的大神,希望不吝赐教!
    既然能引入网络png图片,那我就把这两个png图片放到static/img下

    这样就解决了上述问题。
    附源码如下:
    echarts.vue

    <template>
    <div :class="className" :style="{height:height,width}"/>
    </template>

    <script>
    import Bus from "@/bus.js";
    import { debounce } from "@/utils";
    export default {
    name: "Echarts2",
    props: {
    className: {
    type: String,
    default: "chart"
    },
    {
    type: String,
    default: "102%"
    },
    height: {
    type: String,
    default: "140px"
    },
    autoResize: {
    type: Boolean,
    default: true
    }
    /* chartData: {
    type: Object,
    required: true
    } */
    },
    data() {
    return {
    chart: null,
    sidebarElm: null,
    nextdiaodutimedata: "",
    /* ysechartsareaflowresdata: [], */
    chartData: {}
    };
    },
    watch: {
    chartData: {
    deep: true,
    handler(val) {
    this.setOptions(val);
    }
    }
    },
    mounted() {
    Bus.$on("nextdiaodutime", e => {
    var _this = this;
    _this.nextdiaodutimedata = e;
    console.log("nextdiaodutime");
    console.log(e);
    });
    Bus.$on("pressurecontroltoechats1", e => {
    console.log("pressurecontrolecharts1");
    console.log(e);
    var TargetValuetamp = this.nextdiaodutimedata;
    var nowtimestamp = Number(Date.parse(new Date())) / 1000; //获取的现在时间戳
    var tampcutdown = Number(TargetValuetamp) - nowtimestamp;
    var S = this.nextdiaodutimedata,
    T = new Date(1e3 * S),
    Format = function(Q) {
    return Q < 10 ? "0" + Q : Q;
    },
    Result =
    Format(T.getHours()) + ":" + Format(T.getMinutes()) + ":" + "00";
    var hourdata=Result.slice(0,2)
    var fendata=Result.slice(3,5)
    /* alert(Result);
    alert(hourdata);*/
    /* alert(fendata); */
    if (tampcutdown > 0 || tampcutdown == 0) {
    var TargetValuetime =(hourdata +":" +Number((Number(fendata) - (Number(fendata) % 15)) +15) +":" +"00");
    /* var TargetValuetime =
    ( hourdata + ":" + (Number((Number(fendata) - (Number(fendata) % 15)))==0?'00':Number((Number(fendata) - (Number(fendata) % 15)))) + ":" + "00"); */
    } else if (tampcutdown < 0) {
    var TargetValuetime =
    ( hourdata + ":" + (Number((Number(fendata) - (Number(fendata) % 15)))==0?'00':Number((Number(fendata) - (Number(fendata) % 15)))) + ":" + "00");
    }
    /* alert(TargetValuetime); */
    var time = [];
    var ControlData = [];
    var HistoryData = [];
    var RealData = [];
    var ForcastData=[]
    var PmaxData=[]
    var PminData=[]
    var Targetpresurepointer = [];
    var TargetValue = e.TargetValue;
    /* var TargetValuetime = this.nextdiaodutimedata; */
    /* var TargetValuetime = "15:15:00"; */
    Targetpresurepointer.push(TargetValuetime, TargetValue);
    var erweiArray = [];
    erweiArray.push(Targetpresurepointer);
    /* for (var i = 0; i < 1; i++) {
    erweiArray.push(Targetpresurepointer)
    } */
    for (var i = 0; i < e.RealData.length; i++) {
    RealData.push(e.RealData[i].Data);
    time.push(e.RealData[i].Time);
    }
    for (var i = 0; i < e.ControlData.length; i++) {
    ControlData.push(e.ControlData[i].Data);
    }
    for (var i = 0; i < e.HistoryData.length; i++) {
    HistoryData.push(e.HistoryData[i].Data);
    }
    for (var i = 0; i < e.ForcastData.length; i++) {
    ForcastData.push(e.ForcastData[i].Data);
    }
    for (var i = 0; i < e.PmaxData.length; i++) {
    PmaxData.push(e.PmaxData[i].Data);
    }
    for (var i = 0; i < e.PminData.length; i++) {
    PminData.push(e.PminData[i].Data);
    }
    console.log("pressurecontrolecharts1+ControlData");
    console.log(ControlData);
    console.log(RealData);
    console.log(HistoryData);
    console.log(time);
    console.log(Targetpresurepointer);
    console.log(erweiArray);

    var a = {
    ControlData,
    RealData,
    HistoryData,
    ForcastData,
    PmaxData,
    PminData,
    Targetpresurepointer,
    TargetValuetime,
    erweiArray,
    time,
    TargetValuetamp,
    Result
    };
    this.chartData = a;
    this.$nextTick(this.initChart());
    });
    if (this.autoResize) {
    this.__resizeHandler = debounce(() => {
    if (this.chart) {
    this.chart.resize();
    }
    }, 100);
    window.addEventListener("resize", this.__resizeHandler);
    }

    // 监听侧边栏的变化
    this.sidebarElm = document.getElementsByClassName("sidebar-container")[0];
    this.sidebarElm &&
    this.sidebarElm.addEventListener(
    "transitionend",
    this.sidebarResizeHandler
    );
    },
    beforeDestroy() {
    if (!this.chart) {
    return;
    }
    if (this.autoResize) {
    window.removeEventListener("resize", this.__resizeHandler);
    }

    this.sidebarElm &&
    this.sidebarElm.removeEventListener(
    "transitionend",
    this.sidebarResizeHandler
    );

    this.chart.dispose();
    this.chart = null;
    },
    methods: {
    sidebarResizeHandler(e) {
    if (e.propertyName === "width") {
    this.__resizeHandler();
    }
    },
    setOptions(chartData) {
    this.chart.setOption({
    grid: {
    height: 94,
    760,
    bottom: 20,
    top: 35,
    right: 1,
    left: 49,
    show: true,
    /* backgroundColor: "#e5e8ec", */
    borderColor: "#dfdfe1",
    borderWidth: 1,
    },
    /* color: ["#a9b2bf", "#0060ff", "#b53f9a"], */
    /* dataZoom: [
    {
    show: true,
    realtime: true,
    start: 0,
    end: 100
    },
    {
    type: "inside",
    realtime: true,
    start: 0,
    end: 100
    }
    ], */
    legend: {
    show: true,
    orient: "horizontal",
    right: 5,
    600,
    itemWidth: 15,
    itemGap: 20,
    data: [
    {
    name: "历史压力",
    textStyle: {
    fontSize: 12,
    fontWeight: "bolder",
    color: "#6e7b8b"
    },
    icon: "rect"
    },
    {
    name: "控制压力",
    textStyle: {
    fontSize: 12,
    fontWeight: "bolder",
    color: "#6e7b8b"
    },

    icon: "rect"
    },
    {
    name: "实际压力",
    textStyle: {
    fontSize: 12,
    fontWeight: "bolder",
    color: "#6e7b8b"
    },

    icon: "rect"
    },
    {
    name: "预测压力",
    textStyle: {
    fontSize: 12,
    fontWeight: "bolder",
    color: "#6e7b8b"
    },

    icon: "rect"
    },
    {
    name: "调度预测压力",
    textStyle: {
    fontSize: 12,
    fontWeight: "bolder",
    color: "#6e7b8b"
    },
    icon:
    "path://M700.562286 447.049143c-15.36-49.005714-50.029714-91.867429-99.620572-116.004572-46.372571-22.528-98.742857-25.746286-147.456-8.923428-48.713143 16.822857-88.064 51.638857-110.592 98.011428-4.096 8.484571-7.606857 17.261714-10.386285 26.038858h-112.201143v117.174857h112.347428c15.506286 48.566857 50.029714 90.843429 99.328 114.834285 27.209143 13.165714 55.881143 19.456 84.260572 19.456 71.533714 0 140.580571-39.936 173.933714-108.544 4.242286-8.777143 7.753143-17.554286 10.678857-26.624v0.731429h117.174857v-117.028571h-117.174857v0.877714z m-63.195429 116.589714C614.107429 611.474286 566.125714 639.268571 516.242286 639.268571c-19.748571 0-39.789714-4.388571-58.660572-13.604571-66.706286-32.475429-94.500571-113.225143-62.025143-179.931429C411.062857 413.403429 438.564571 389.12 472.502857 377.417143c14.336-4.973714 29.257143-7.460571 44.032-7.460572 20.187429 0 40.228571 4.534857 58.806857 13.604572 66.706286 32.621714 94.500571 113.371429 62.025143 180.077714zM0 446.025143h117.174857V563.2H0zM906.825143 446.025143H1024V563.2h-117.174857z"
    },
    {
    name: "上下限",
    textStyle: {
    fontSize: 12,
    fontWeight: "bolder",
    color: "#6e7b8b"
    },

    icon: "rect"
    },
    ]
    },
    tooltip: {
    trigger: "axis",
    padding: [0, 10],
    confine:true,
    formatter: function(params) {
    console.log("params");
    console.log(params);
    var res = "<div> <p> 时间:" + params[0].name+" </p> </div>";
    for (var i = 0; i < params.length; i++) {
    if (params[i].seriesName == "历史压力") {
    res +=
    "<p>" + params[i].seriesName + ":" + params[i].data + "</p>";
    } else if (params[i].seriesName == "控制压力") {
    res +=
    "<p>" + params[i].seriesName + ":" + params[i].data + "</p>";
    } else if (params[i].seriesName =="实际压力") {
    res += "<p>" + "实际压力" + ":" + params[i].data + "</p>";
    }else if (params[i].seriesName =="预测压力") {
    res += "<p>" + "预测压力" + ":" + params[i].data + "</p>";
    }else if (params[i].seriesName =="上下限") {
    res += "<p>" + "上限" + ":" + params[i].data + "</p>";
    }else if (params[i].seriesName =="下限") {
    res += "<p>" + "下限" + ":" + params[i].data + "</p>";
    }
    else if (params[i].seriesName == "调度预测压力") {
    res += "<p>" +"调度时间:"+chartData.Result+"<br>" + "调度预测压力" + ":" + params[i].data[1] + "</p>";
    }
    }
    return res;
    },
    textStyle: {
    align: "left"
    }
    },
    xAxis: [
    {
    data: chartData.time,
    axisLabel: {
    inside: false,
    textStyle: {
    color: "#fff"
    }
    },
    axisTick: {
    show: false
    },
    axisLine: {
    show: false
    },
    z: 10
    }
    ],
    yAxis: {
    splitLine: {
    show: false,
    lineStyle: {
    color: "#dfdfdf",
    1,
    type: "dashed"
    }
    },
    axisLine: {
    show: false
    },
    axisTick: {
    show: false
    },
    axisLabel: {
    textStyle: {
    color: "#999"
    }
    }
    },
    series: [
    {
    name: "历史压力",
    type: "line",
    symbol: "none",
    data: chartData.HistoryData,
    zlevel: 999999,
    itemStyle: {
    normal: {
    color: "#a9b2bf"
    }
    }
    },

    {
    name: "控制压力",
    type: "line",
    symbol: "none",
    data: chartData.ControlData,
    zlevel: 999,
    itemStyle: {
    normal: {
    borderColor: "#f03939",
    color: "#f03939"
    }
    },
    lineStyle: {
    normal: {
    2,
    color: "#f03939"
    }
    }
    },

    {
    name: "实际压力",
    type: "line",
    symbol: "none",
    itemStyle: {
    normal: {
    color: "#0060ff"
    }
    },
    zlevel: 1333,
    data: chartData.RealData
    },
    {
    name: "预测压力",
    type: "line",
    symbol: "none",
    itemStyle: {
    normal: {
    color: "#8a13bc"
    }
    },
    zlevel: 1333,
    data: chartData.ForcastData
    },
    {
    name: "下限",
    stack: "上下限",
    type: "line",
    smooth:true,
    symbol: "none",
    itemStyle: {
    normal: {
    color: "rgba(255,255,255,0)"
    }
    },
     
    zlevel: 1333,
    data: chartData.PminData
    },
    {
    name: "上下限",
    type: "line",
    smooth:true,
    stack: "上下限",
    symbol: "none",
    itemStyle: {
    normal: {
    color: "#dfd7f6",
    /* color: "rgba(255,255,255,0)" */
    }
    },
    lineStyle:{
    normal: {
    color: "rgba(255,255,255,0)"
    }
    },
    areaStyle: {
    normal: {
    color: "#dfd7f6"
    }
    },
    zlevel: 1333,
    data: chartData.PmaxData
    },
     
    {
    name: "调度预测压力",
    type: "scatter",
    /* data: chartData.Targetpresurepointer, */
    data: chartData.erweiArray,
    /* symbol:
    "path://M359.665 1021.432c-193.509 0-350.931-157.428-350.931-350.931s157.428-350.931 350.931-350.931 350.931 157.428 350.931 350.931-157.428 350.931-350.931 350.931zM359.665 366.367c-167.695 0-304.145 136.45-304.145 304.145s136.45 304.145 304.145 304.145c167.71 0 304.145-136.45 304.145-304.145s-136.435-304.145-304.145-304.145z", */
    /* data: [["15:15:00", 0.134]], */
    symbolSize: 8,
    itemStyle: {
    normal: {
    color: "red",
    borderColor: "#fff",
    borderType: "solid",
    borderWidth:1
    }
    },
    zlevel: 333331333333,
    markLine: {
    silent: true,
    symbol:['image://static/0.png', 'image://static/1.png'],
    /* symbolSize: 10,
    symbol:'image://http://121.40.242.176:9999/img/0.png', */
    /* symbol: "none", */
    /* symbol: ["path://M359.665 1021.432c-193.509 0-350.931-157.428-350.931-350.931s157.428-350.931 350.931-350.931 350.931 157.428 350.931 350.931-157.428 350.931-350.931 350.931zM359.665 366.367c-167.695 0-304.145 136.45-304.145 304.145s136.45 304.145 304.145 304.145c167.71 0 304.145-136.45 304.145-304.145s-136.435-304.145-304.145-304.145z","path://M359.665 1021.432c-193.509 0-350.931-157.428-350.931-350.931s157.428-350.931 350.931-350.931 350.931 157.428 350.931 350.931-157.428 350.931-350.931 350.931zM359.665 366.367c-167.695 0-304.145 136.45-304.145 304.145s136.45 304.145 304.145 304.145c167.71 0 304.145-136.45 304.145-304.145s-136.435-304.145-304.145-304.145z"], */
    /* symbol: ['path://M851.56351056 616.51087917l-318.18515625-318.18515625-317.22099609 317.2209961z', 'path://M851.56351056 616.51087917l-318.18515625-318.18515625-317.22099609 317.2209961z'], */
    label: {
    formatter: function(val) {
    return (val.value = "");
    }
    },
    data: [
    {
    name: "chartData.TargetValuetime",
    /* type: 'average', */
     
    /* symbol: ["path://M359.665 1021.432c-193.509 0-350.931-157.428-350.931-350.931s157.428-350.931 350.931-350.931 350.931 157.428 350.931 350.931-157.428 350.931-350.931 350.931zM359.665 366.367c-167.695 0-304.145 136.45-304.145 304.145s136.45 304.145 304.145 304.145c167.71 0 304.145-136.45 304.145-304.145s-136.435-304.145-304.145-304.145z","path://M359.665 1021.432c-193.509 0-350.931-157.428-350.931-350.931s157.428-350.931 350.931-350.931 350.931 157.428 350.931 350.931-157.428 350.931-350.931 350.931zM359.665 366.367c-167.695 0-304.145 136.45-304.145 304.145s136.45 304.145 304.145 304.145c167.71 0 304.145-136.45 304.145-304.145s-136.435-304.145-304.145-304.145z"], */
    xAxis: chartData.TargetValuetime,
    lineStyle: {
    normal: {
    color: "#3c5da7"
    }
    }
    }
    ]
    }
    }
    ]
    });
    },
    initChart() {
    this.chart = this.$echarts.init(this.$el, "macarons");
    this.chart.clear();
    this.setOptions(this.chartData);
    }
    }
    };
    </script>
     
    utils/index.js如下:
    export function debounce(func, wait, immediate) {
    let timeout, args, context, timestamp, result

    const later = function () {
    // 据上一次触发时间间隔
    const last = +new Date() - timestamp

    // 上次被包装函数被调用时间间隔 last 小于设定时间间隔 wait
    if (last < wait && last > 0) {
    timeout = setTimeout(later, wait - last)
    } else {
    timeout = null
    // 如果设定为immediate===true,因为开始边界已经调用过了此处无需调用
    if (!immediate) {
    result = func.apply(context, args)
    if (!timeout) context = args = null
    }
    }
    }

    return function (...args) {
    context = this
    timestamp = +new Date()
    const callNow = immediate && !timeout
    // 如果延时不存在,重新设定延时
    if (!timeout) timeout = setTimeout(later, wait)
    if (callNow) {
    result = func.apply(context, args)
    context = args = null
    }

    return result
    }
    }
    bus.js

     

    import Vue from 'vue'
    export default new Vue();
     

     

     
  • 相关阅读:
    mysql索引
    springboot mybatis 后台框架平台 shiro 权限 集成代码生成器
    java 企业网站源码模版 有前后台 springmvc SSM 生成静态化
    java springMVC SSM 操作日志 4级别联动 文件管理 头像编辑 shiro redis
    activiti工作流的web流程设计器整合视频教程 SSM和独立部署
    .Net Core中的ObjectPool
    文件操作、流相关类梳理
    .Net Core中的配置文件源码解析
    .Net Core中依赖注入服务使用总结
    消息中间件RabbitMQ(一)
  • 原文地址:https://www.cnblogs.com/volodya/p/10818337.html
Copyright © 2011-2022 走看看