忙活完動態表單,動態附件,動態表格等等事情後,最近公司又在進軍報表可視化問題了,對於咱們前端而言如何將一份份數據美美的展現在頁面上實爲一項艱鉅的任務.javascript
對比了現有的幾個比較有名的可視化工具以後,最終仍是決定使用G2
來進行項目開發.css
G2
的使用方式及做用我這裏就不展開了,想了解的小夥伴能夠撮這裏: vue中使用G2(一)html
該篇文章主要是記錄一下近期在使用G2
所遇到的一些比較坑的問題,若是正好你也在使用G2
,且不巧的遇到了和我同樣的問題,那麼應該能幫助到你一些.前端
forceFit
屬性寬度自適應問題在建立chart
圖表的時候,要是你圖表的寬度設置爲自適應模式,切頁面爲欄柵佈局的時候,以下:vue
const chart = new G2.Chart({
container: 'g1',
forceFit: true,
height: 270
})
複製代碼
將forceFit
屬性設置爲true
. 此時打開這個有圖表的頁面,會發現圖表產生樣式錯亂的狀況,好比這樣: java
解決方式爲:在vue生命週期mounted初始化圖表以後,加入如下代碼便可:canvas
const e = document.createEvent('Event')
e.initEvent('resize', true, true)
window.dispatchEvent(e)
複製代碼
好比個人項目中:瀏覽器
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)
...
}
複製代碼
此時頁面正常了: bash
如上所述, G2
中提供了forceFit
屬性使得圖表寬度能自適應,可是在實際開發中咱們可能但願圖表的高度隨父級容器的高度變化而變化.數據結構
文檔中規定高度height
屬性必需傳遞一個數字.這樣就打破了我想直接設置高度爲100%
的幻想.
既然高度必需規定爲一個數字的話,那麼咱們就能夠獲取包裹圖表的父元素的高度,而後再賦值給圖表就能夠了. 例以下面這個栗子🌰:
<template>
<div ref="element" class="element">
<div id="chart"></div>
</div>
</template>
<script>
export default {
mounted () {
const offsetHeight = this.$refs.element.offsetHeight // 獲取父級高度 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>
複製代碼
let height = this.$refs.element.offsetHeight // 220
複製代碼
let height = window.getComputedStyle(this.$refs.element).height // 200px
複製代碼
<div ref="element" class="element" style="height: 300px;"></div>
<script> let height = this.$refs.element.style.height // 300px </script>
複製代碼
不過我在項目中是將圖表封裝到了一個組件中,因此可使用$el
直接獲取這個組件的屬性.
<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>
複製代碼
該組件的高度由調用它的父級組件控制.
在使用圖表時,有時候可能須要一些特別小的圖做爲儀表盤看板的一部分.好比構建一個寬200px
,高150px
的圖表,此時圖表會出現擠壓變形的狀況.
我在最開始遇到這個問題的時候也是各類找解決方案.最終仍是在G2
的Issues
上找到了解決方案.只須要在建立圖表的時候,將padding
設置爲auto
就能夠了,以下:
const chart = new G2.Chart({
container: 'chart',
widht: 200,
height: 150,
padding: 'auto' // 爲了防止小圖時圖表變形
})
複製代碼
如果x軸字段的格式爲時間戳:
2019-09-17
2019.09.17
複製代碼
好比後臺給個人數據結構爲:
[
{
time: '2019-09-17',
amount: 100
},
{
time: '2019-09-18',
amount: 200
}
]
複製代碼
G2
中須要生成一張柱狀圖 此時,控制檯會報錯:
將 x 軸scale 配置爲 catTime 就能夠。
在建立的圖表的時候,添加上:
chart.scale('time', { // time爲你的x軸時間的字段
type:'timeCat'
})
// 如果使用options配置, 則添加:
options: {
scales: {
time: {
type: 'timeCat'
}
}
}
複製代碼
項目還在開發中,對於我來講G2
還有不少須要掌握的,後期使用上要是還遇到比較坑的點還會在此篇文章上進行更新.
不少時候解決問題的方案多是你在深夜中展轉難眠時的靈光乍現,也多是在地鐵上刷博客時的驚鴻一瞥,但願這篇文章也能成爲你的驚鴻一瞥.