Chartjsを使わないで線グラフを作ってみる

いや、Chartjs使いたいんだけども。
いろんなエラーが出て、Stackoverflowとかに投げても誰も回答してくれなかったので、いっそ1から自分で作っちゃおうと。
とても効率の悪い決断に辿り着きました。

CSSの勉強にもなるし。やってみよう!!

2023/01/04 10:34

CSSの使い方を何も知らないのでかなりカッコ悪い実装になりそう(調べろ)

遭遇したエラー

Property or method "chartData" is not defined on the instance but referenced during render. Make sure that this property is reactive, either in the data option, or for class-based components, by initializing the property. See: https://v2.vuejs.org/v2/guide/reactivity.html#Declaring-Reactive-Properties.

解決法:単なるスペルミス修正
export default {
name: 'LineChart',
data() { //→ datas() { になってた

.chart_back:nth-child {
適応されない?position:absoluteになってる??

解決法:時間ないので全部. chart_back * { で済ませた。

14:44

全く汎用性のないグラフができた。
90度から-90度の揺れを表示するグラフ。

<template>
    <div :chartData="chartData">
      <div class="unit_text">({{ chartData.unit }})</div>
      <div style="position: relative;">
        <div class="chart_back">
          <div>90</div>
          <div>45</div>
          <div>0</div>
          <div>45</div>
          <div style="margin-bottom: 0px">-90</div>
        </div>
        <div class="chart">
          <canvas width="500" height="400" :id=chartData.id></canvas>
        </div>
      </div>
      <br>
    </div>
</template>

<script>

export default {
    name: 'LineChart',
    props: {
      chartData: {},
      chartName: ""
    },
    mounted: async function() {
      this.drawimage()
    },
    updated() {
      this.drawimage()
    },
    methods: {
      drawimage() {
        console.log('drawimage',this.chartData.datas)
        if (this.chartData.datas == undefined) {
          return
        }
        var canvasElem = document.getElementById(this.chartData.id)
        
        var displayWidth = 2400;
        var displayHeight = 800;
        canvasElem.style.width = '70vw';
        canvasElem.style.height = '24vw';
        canvasElem.width = displayWidth;
        canvasElem.height = displayHeight;
        console.log('canvasElem',
        canvasElem.width,canvasElem.height)
        
        var yPos = displayHeight/200
        var centerY = displayHeight/2
        var ctx = canvasElem.getContext('2d')
        ctx.strokeStyle = 'rgb(73, 174, 224)';
        ctx.lineWidth = 6;
        var x = displayWidth/24
        ctx.moveTo(x, centerY)
        var gridW = (canvasElem.width-x*2)/this.chartData.datas.length
        console.log("gridW",gridW)
        for (var idx in this.chartData.datas) {
          var y = (this.chartData.datas[idx]*yPos+centerY)
          console.log('gridWgridW',this.chartData.datas[idx],y)
          ctx.lineTo(x, y);
          ctx.stroke();
          x += gridW
        }
      }
    },
  }
</script>

<style>
.chart {
  margin: 0;
  position: absolute;
  left: 50%;
  top: 50%;
  transform: translate(-50%, -50%);
  width: 100%;
  font-weight: 800;
  border: none;
}
.chart_back {
  margin-left: 5%;
  width: 70vw;
  height: 24vw;
  background-color: rgba(255, 255, 255, 0.245);
}
.chart_back * {
  margin-bottom: calc(6vw - 1px);
  width: 100%;
  height: 1px;
  background-color: rgb(220, 226, 230);
  text-align: left;
  font-size: 12px;
}
.unit_text {
  margin-left: 4vw;
  margin-bottom: 1vw;
  font-weight: 600;
  font-size: 11px;
  width: fit-content;
  color: gray;
}
</style>

次はこれを応用して利用できるようにしたい。


実装中に遭遇したエラー

vue.runtime.esm.js?2b0e:4605 [Vue warn]: Invalid prop type: "[object Object]" is not a constructor

解決法:
props: {
 chartData: {}, // chartData: { type: {} } とか、typeに変なこと書いてると怒る


この記事が気に入ったらサポートをしてみませんか?