ぬぬん!

やってみたこと,思ったこと

Vue.jsでTodoリストを作った

Vue.jsを勉強はじめた

近々、無限増大していくフォームを作らなきゃいけなくて
火事場感でjsのフレームワークを学び始めました

普段はLaravelで構築することが大半かつ
Laravel自身がVue.jsを推しているようなので
Vue.jsを勉強することにした

Vue.jsの優しさにふれる

なんのフレームワークをやるにしろ
公式ドキュメントを読むのが正当法で、かつ、
絶対神として崇め奉るほどに熟読必須

Vue.jsのドキュメントはなんと優しいことに
日本語がある!!!!

圧倒的感謝をしつつ
ドキュメントを一つずつ押さえていった

チュートリアルの定番:Todo

さて、ドキュメントもざっとよんだ

gomayumax.hatenablog.com

次は、慣れるためのTODOリスト作り

公式も用意している

jp.vuejs.org

でも公式はコンポーネントを分けずに処理をしているので
これは今後の実装を考えると現実的ではない

なのでコンポーネントを分け分けした実装を自分でやってみた

github.com

環境構築はvue-cliでさくっと。

qiita.com

公式には下記のように
上級者とか言われてちょっと怯んだけど
たくさんのQiitaを見て助けられた

jp.vuejs.org

コンポーネント構造

実際に作った構造は下記

  • 親: App.vue
  • 子: TodoList.vue, InputForm.vue

引っかかったPOINT

dataは関数を返す

data…あー変数ね!おkおk!ってかんじで
定義したのは下記

    data: {
        todoList: [
          {text: 'goma', done: false}
        ]
    },

↑↑これでは上手く行きません!!!!

神ドキュメントをよく読みましょう

コンポーネントを定義しているとき、同じ定義を使用して作成された多くのインスタンスがあるため、data は初期データオブジェクトを返す関数として宣言しなければなりません。

https://jp.vuejs.org/v2/api/#data

今回はコンポーネントを定義しているので関数にしなきゃいけなかったそうな
覚えておこう

正しくは下記

    data: function () {
      return {
        todoList: [
          {text: 'goma', done: false}
        ]
      }
    },

親の関数を実行する

TODOリストはなので
TODOが入力されたらTODOListを変更してあげなきゃいけない

ここで考える方法は2つ

  • 子の関数でゴニョゴニョ修正して値の自動更新に任せる
  • 親に処理してもらう(値と一緒に渡して、子としてはEND)

どっちが良いんだろう。。。。

と悩んだりもしたけど、結局は公式TODOMVCを参考にして
親に処理してもらうという形態にした

具体的には
親から「子供に使っていいよ!」って関数を渡す
@(子供で使う時の関数名)="(親の関数名)"

<template>
                    <input-form @addTodo="addTodo"></input-form>
</template>
<script>
  export default {
    methods: {
      addTodo: function (todo) {
        this.todoList.push({
          text: todo,
          done: false
        })
      }
    }
  }
</script>

子供では親から渡された関数を使う。
渡された関数を使う時の記法は
this.$emit('(関数名)', (引数))

<script>
export default {
  name: 'input-form',
  data: function () {
    return {
      newTodo: ''
    }
  },
  methods: {
    addTodo: function () {
      this.$emit('addTodo', this.newTodo)
      this.newTodo = ''
    }
  }
}
</script>

こうすることで子の変更が親に通達され変更がなされる
便利!

だけど、このやり方なっとく行っていなくて

今回は簡単なTodoだからよかったものの
どんどん機能を増やしていったら
親のmethodが増えに増えまくる

つまり、夢を詰め込むとデブの親になるわけだ
なんかスクロールが終わらないコンポーネントになる。
ヤバそう、可読性さよなら事案待ったなしだ

こういう時どうするんだろう
このあたりの質問を今度参加する勉強会で解決していきたい

まとめ

Vue.jsに慣れるために簡単なTodoリストを作った
なんとなく使える未来が見えた気がする
無限増加フォーム頑張って作るぞーーーーー