vue中使用G2(二)問(wèn)題匯總

前言

忙活完動(dòng)態(tài)表單,動(dòng)態(tài)附件,動(dòng)態(tài)表格等等事情后,最近公司又在進(jìn)軍報(bào)表可視化問(wèn)題了,對(duì)于我們前端而言如何將一份份數(shù)據(jù)美美的展示在頁(yè)面上實(shí)為一項(xiàng)艱巨的任務(wù).
對(duì)比了現(xiàn)有的幾個(gè)比較有名的可視化工具之后,最終還是決定使用G2來(lái)進(jìn)行項(xiàng)目開(kāi)發(fā).
G2的使用方式及作用我這里就不展開(kāi)了,想了解的小伙伴可以撮這里: vue中使用G2(一)
該篇文章主要是記錄一下近期在使用G2所遇到的一些比較坑的問(wèn)題,如果正好你也在使用G2,且不巧的遇到了和我一樣的問(wèn)題,那么應(yīng)該能幫助到你一些.

一、forceFit屬性寬度自適應(yīng)問(wèn)題

在創(chuàng)建chart圖表的時(shí)候,要是你圖表的寬度設(shè)置為自適應(yīng)模式,切頁(yè)面為欄柵布局的時(shí)候,如下:

const chart = new G2.Chart({
          container: 'g1',
          forceFit: true,
          height: 270
      })

forceFit屬性設(shè)置為true.
此時(shí)打開(kāi)這個(gè)有圖表的頁(yè)面,會(huì)發(fā)現(xiàn)圖表產(chǎn)生樣式錯(cuò)亂的情況,比如這樣:

image.png

canvas超出了父元素的寬度。如果改變?yōu)g覽器的大小,window.resize的時(shí)候才會(huì)觸發(fā)forceFit: true這個(gè)屬性,才會(huì)自適應(yīng)屏幕的寬度,這時(shí)圖表的大小是正常的。
解決方式為:在vue生命周期mounted初始化圖表之后,加入以下代碼即可:

const e = document.createEvent('Event')
e.initEvent('resize', true, true)
window.dispatchEvent(e)

比如我的項(xiàng)目中:

mounted () {
  this.initComponent()
},
methods: {
  initComponent () {
    const chart = new G2.Chart({
          container: 'g1',
          forceFit: true,
          height: 270
    })
    const e = document.createEvent('Event')
    e.initEvent('resize', true, true)
    window.dispatchEvent(e)
    ...
}

此時(shí)頁(yè)面正常了:


image.png

二、自定義圖表的高度問(wèn)題

如上所述, G2中提供了forceFit 屬性使得圖表寬度能自適應(yīng),但是在實(shí)際開(kāi)發(fā)中我們可能希望圖表的高度隨父級(jí)容器的高度變化而變化.
文檔中規(guī)定高度height屬性必需傳遞一個(gè)數(shù)字.這樣就打破了我想直接設(shè)置高度為100%的幻想.
既然高度必需規(guī)定為一個(gè)數(shù)字的話,那么我們就可以獲取包裹圖表的父元素的高度,然后再賦值給圖表就可以了.
例如下面這個(gè)栗子??:

<template>
  <div ref="element" class="element">
    <div id="chart"></div>
  </div>
</template>
<script>
export default {
  mounted () {
    const offsetHeight = this.$refs.element.offsetHeight // 獲取父級(jí)高度 200
    const chart = new G2.Chart({
      container: 'chart',
      forceFit: true,
      height: offsetHeight,
    })
    ....
  }
}
</script>
<style scoped>
.element {
  width: 300px;
  height: 200px;
}
</style>

vue中獲取元素高度的幾種方式:
例如下面的DOM:

<div ref="element" class="element"></div>
<style>
 .element {
  width: 200px;
  height: 200px;
  background-color: red;
  padding: 10px;
}
</style>
  1. 獲取高度值 (內(nèi)容高+padding+邊框)
let height = this.$refs.element.offsetHeight // 220
  1. 獲取元素樣式值 (存在單位)
let height = window.getComputedStyle(this.$refs.element).height // 200px
  1. 獲取元素內(nèi)聯(lián)樣式值(存在單位, 非內(nèi)聯(lián)樣式無(wú)法獲?。?/li>
<div ref="element" class="element" style="height: 300px;"></div>
<script>
  let height = this.$refs.element.style.height // 300px
</script>

不過(guò)我在項(xiàng)目中是將圖表封裝到了一個(gè)組件中,所以可以使用$el直接獲取這個(gè)組件的屬性.

<template>
  <div class='width_full height_full'>
    <div id="chart"></div>
  </div>
<script>
export default {
  mounted () {
    const offsetHeight = this.$el.offsetHeight // 獲取組件高度
    const chart = new G2.Chart({
      container: 'chart',
      forceFit: true,
      height: offsetHeight,
    })
    ....
  }
}
</script>
</template>

該組件的高度由調(diào)用它的父級(jí)組件控制.

三、圖表內(nèi)容太小變形問(wèn)題

在使用圖表時(shí),有時(shí)候可能需要一些特別小的圖作為儀表盤看板的一部分.比如構(gòu)建一個(gè)寬200px,高150px的圖表,此時(shí)圖表會(huì)出現(xiàn)擠壓變形的情況.
我在最開(kāi)始遇到這個(gè)問(wèn)題的時(shí)候也是各種找解決方案.最終還是在G2Issues上找到了解決方案.只需要在創(chuàng)建圖表的時(shí)候,將padding設(shè)置為auto就可以了,如下:

  const chart = new G2.Chart({
      container: 'chart',
      widht: 200,
      height: 150,
      padding: 'auto' // 為了防止小圖時(shí)圖表變形
    })

四、字段格式為時(shí)間戳報(bào)錯(cuò)

若是x軸字段的格式為時(shí)間戳:

2019-09-17
2019.09.17

比如后臺(tái)給我的數(shù)據(jù)結(jié)構(gòu)為:

[
  {
    time: '2019-09-17',
    amount: 100
  },
  {
    time: '2019-09-18',
    amount: 200
  }
]

G2中需要生成一張柱狀圖
此時(shí),控制臺(tái)會(huì)報(bào)錯(cuò):

image.png

解決方案:
x 軸默認(rèn)為解析為 time linear 類型了,這個(gè)類型不能堆疊。
將 x 軸scale 配置為 catTime 就可以。
在創(chuàng)建的圖表的時(shí)候,添加上:

chart.scale('time', { // time為你的x軸時(shí)間的字段
    type:'timeCat'
 })

// 若是使用options配置, 則添加:
options: {
  scales: {
    time: {
      type: 'timeCat'
    }
  }
}

后語(yǔ)

項(xiàng)目還在開(kāi)發(fā)中,對(duì)于我來(lái)說(shuō)G2還有很多需要掌握的,后期使用上要是還遇到比較坑的點(diǎn)還會(huì)在此篇文章上進(jìn)行更新.很多時(shí)候解決問(wèn)題的方案可能是你在深夜中輾轉(zhuǎn)難眠時(shí)的靈光乍現(xiàn),也可能是在地鐵上刷博客時(shí)的驚鴻一瞥,希望這篇文章也能成為你的驚鴻一瞥.

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 吾愛(ài) 廢城連朝沃雪 你莫來(lái) 斷壁殘?jiān)?風(fēng)斜掠如割 瑟縮,拆椽木取暖 白日伏臥夜難成眠 昏慵就連朝昏慵 譫妄亦附夢(mèng)譫...
    昆南閱讀 306評(píng)論 4 8
  • 今天晚上洗完澡,我拖著身子,來(lái)到陽(yáng)臺(tái)的窗前。打開(kāi)紗窗,我把頭探出去;今晚的月亮是個(gè)豐滿的月牙形,很像我小時(shí)候經(jīng)常...
    喚墨閱讀 176評(píng)論 0 0
  • G:【心理咨詢的非指導(dǎo)性技術(shù)】通過(guò)肯定、反應(yīng)、提問(wèn)、總結(jié)提升心理咨詢非指導(dǎo)性技術(shù) 1、肯定。共情、接納。對(duì)于初次見(jiàn)...
    木子青青草閱讀 354評(píng)論 0 0

友情鏈接更多精彩內(nèi)容