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();
     

     

     
  • 相关阅读:
    WMware下的Linux系统安装VMtools
    VMware虚拟机安装Ubuntu图文攻略
    Python高级编程(三)
    Python高级编程(二)
    Python高级编程(一)
    纯div+css样式弹出泡泡消息框
    EF应用CodeFirst模式,数据迁移的基本用法要点摘记
    sql左连接的误区
    ExtJs,从开始接触到如今,我都觉得你好垃圾阿。。。。
    EntityFramework经典的left join语法
  • 原文地址:https://www.cnblogs.com/volodya/p/10818337.html
Copyright © 2011-2022 走看看