Vueでお絵かきアプリ作成2(canvas使用)

#趣向
vueでお絵かき機能を作成する機会があったため作ってみました！
![スクリーンショット 2021-08-15 17.37.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/843952/9ffc5175-6583-9e15-6d03-252324b66008.png)

#1の続き
[前回の1はこちら](https://qiita.com/ryotaro_tech/items/dceb282ec62f092c1481)
このページではペン機能と消しゴム機能をわけ、ペンの太さと色を変更できるようにしたいと思います。

まずはhtml。画面を整えていきます。


```HAML:html
<div id="app">
    <main>
        <div>
            <canvas id="myCanvas" ref="myCanvas" style="border:1px solid #aaa" @mousedown="dragStart"  @mouseup="dragEnd" @mouseout="dragEnd" @mousemove="draw"></canvas>
        </div>
    </main>
    <aside>
        <div class="contentBlock">
            <h2><i class="fas fa-calendar"></i>お絵かきツール</h2>
            <dd>
                <div class="canvas-controller">
                    <div class="controller">
                        <label for="color">色：</label>
                        <input id="color" type="color" v-model="color"/>
                    </div>
                    <div class="controller weight">
                        <label>線の太さ：</label>
                        <div class="weight-box">
                            <span class="icon_cout js-count" @click="weightDown">-</span>
                            <input type="number" min="1" max="10" id="weight" v-model.number="weightNum" data-initial="5">
                            <span class="icon_cout js-count" @click="weightUp">+</span>
                        </div>
                    </div>
                    <div class="controller tool">
                        <label>ツール：</label>
                        <div class="tool-box" v-bind:class="pen_bg_color" @click="pen">
                            <i class="fas fa-pen"></i>
                        </div>
                        <div class="tool-box" v-bind:class="move_bg_color" @click="eraser">
                            <i class="fas fa-eraser"></i>
                        </div>
                    </div>
                </div>
            </dd>
        </div>
    </aside>
</div>
```

次にvue
watchでペンの太さ、色を監視。またペンモードであるかも監視。
ペンメソッド。消しゴムメソッド、線太さUP,DOWNメソッドを作成します。


```JavaScript:JavaScript
new Vue({
  el: '#app',
  data() {
    return {
      pen_bg_color: "gray",
      move_bg_color: "",
      weightNum: 5,
      canvas: null,
      color: "black",
      context: null,
      canvasMode: 'pen',
    }
  },
  mounted () {
    // カンバス作成
    this.canvas = document.querySelector('#myCanvas')
    this.context = this.canvas.getContext('2d')
    this.context.lineCap = 'round'
    this.context.lineCap = 'round'
    this.canvas.width = 700
    this.canvas.height = 600
    this.context.lineWidth = this.weightNum
    this.context.strokeStyle = this.color
  },
  watch: {
    // 文字の太さwatch
    weightNum(val) {
      this.context.lineWidth = val;
    },
    // 文字の色watch
    color(val) {
      this.context.strokeStyle = val;
    },
    // ペンの活性をwatch
    isDrawingMode(val) {
      this.canvas.isDrawingMode = val;
    },
  },
  methods: {
    // 描画
    draw :function(e) {
      let x = e.layerX
      let y = e.layerY
      if(!this.isDrag) return;
      this.context.lineTo(x, y);
      this.context.stroke();
    },
    // 描画開始（mousedown）
    dragStart:function(e) {
      let x = e.layerX
      let y = e.layerY
      this.context.beginPath();
      this.context.lineTo(x, y);
      this.context.stroke();
      this.isDrag = true;
    },
    // 描画終了（mouseup, mouseout）
    dragEnd: function() {
      this.context.closePath();
      this.isDrag = false;
    },
    // ペンモード
    pen: function(){
      // カーソル変更
      this.canvasMode = 'pen'
      // 色変更
      this.pen_bg_color =  "gray"
      this.move_bg_color = ""
      // 描画設定
      this.context.lineCap = 'round';
      this.context.lineJoin = 'round';
      this.context.lineWidth = this.weightNum
      this.context.strokeStyle = this.color
    },
    // 消しゴムモード
    eraser: function() {
      // カーソル変更
      this.canvasMode = 'eraser'
      // 色変更
      this.pen_bg_color =  ""
      this.move_bg_color = "gray"
      // 描画設定
      this.context.lineCap = 'square';
      this.context.lineJoin = 'square';
      this.context.lineWidth = this.weightNum
      this.context.strokeStyle = '#FFFFFF';
    },
    // 線の太さUP
    weightUp: function() {
      if (this.weightNum + 1 < 10) {
        this.weightNum += 1;
      }
    },
    // 線の太さDOWN
    weightDown: function() {
      if (this.weightNum - 1 > 0) {
        this.weightNum -= 1;
      }
    },
  },
});
```

簡単に色、太さの変更、ペンの活性が実装できました。🙌
次回は「前に戻る」「次に進む」を実装したいと思います。


![スクリーンショット 2021-08-21 15.11.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/843952/7bd40e82-02fb-c335-e99e-30aa103f4b88.png)