次の作品を作る前に、Vue.jsを勉強する必要があったため
しばらくインプットにいそしむことに。

Vue.js学習の動機

今、ウェブカツでプログラミング学習をしていまして
その中でJavaScriptのフレームワークがいくつか出てくるんですよね。
出てくるのは良いんですが

毛根が死滅しそうな難易度

・・いやマジで。
私元々JavaScript自体にもの凄く苦手感があるというか

この20年のうちに2度JS独学で学習しようとして挫折し
去年作りたい物が出来たところで
3度目の挫折をしそうになったのでウェブカツに入った

という経緯があってかるーくトラウマじみたものがあるんです。

それでも何とかフレームワークの講義まではたどり着いたのですが
まぁ見事に

Backbone.jsで禿げ上がるほど悩み
Reactは分かったような分からないような気分で通り過ぎ

Reactのreduxとやらで毛根が瞬殺された

・・一体何だったんだあれは・・( ゚д゚)
まさに「何を言っているんだこれは・・」状態でしたorz

んで、まぁそんな中で唯一
「こ、これなら何か理解できそうな気がする!」となった
Vue.jsを、初めてのJSフレームワークとして学習することにしたのです。

学習に使った教材

  • ウェブカツのJS部上級に出てたコード
    動画は流し見で、結局コードを印刷してメモりつつ実際に動かして終了
  • 基礎から学ぶVue.js
    ねこさんが可愛いVue.jsの入門書。6章まで読了
    7章以降は実際にSPAとやらが必要になったら読もうかと

取りあえず上記2つを使って2日でざっくりインプット終了。
後は作りながら理解した方が早いはず、ということで。

Vue.jsでTodoアプリを作ってみた

基礎を確認する意味で、簡単なTodoアプリを作りました。
機能としては

  • 新規todoリスト作成
  • リスト削除
  • 実行済み、未実行をクリックで切り替える
  • 部分一致によるリスト検索
  • 削除時にアニメーションを入れる

詰まったところと解決策

実行済みと未実行の切り替えができねぇ!

・・何のことは無い、要素の指定方法がおかしかった。
リストのデータは配列で置き、その中にチェックされてるかどうかを判断するための
「isChecked」という要素をぶっ込んだんですね。

  data:  {  

      items: [  

        { id: 1, text: "sample todo1", isChecked: false },  

        { id: 2, text: "sample todo2", isChecked: true }  

      ],  

  },

で、この「isCheckedを使ってmethodでtrueとfalse切り替えりゃいける!」と
リストの方はこんな感じで

* 
              __  
 {{ item.text }}

            

切り替え用のmethodはこんな風に書いてみたら

methods: {  

    changeStatus(item) {  

      isChecked = isChecked ? false : true;  

    },  

}

・・押しても動かねぇ・・orz
devtoolで見たらv-onはちゃんと動いてるのに全く反映されねぇ・・

ここで詰まること2時間。
原因は

配列の中に入ってる要素なので、単に「isChecked」じゃなくて
配列名の「item」付けて「item.isChecked」にせな動かんわなそら!!

大体v-bind: keyのところでちゃんとitem.idって書いてるのに何故気づかなかった・・
そこを直すだけで動きました。
いやぁ思い込みって怖いですねぇホント(´・ω・`)

検索機能

まずはここを参考にして検索機能を付けてみました。
こういうときにcomputedを使うのね・・勉強になりました。

https://orizuru.io/blog/vue-js/search-function/

・・が、ここに書かれた方法を使うと
完全一致じゃないと上手いこといかない。
一部だけ一致で表示するってどうやって実装したらええんじゃー!

てことで「javascript 検索機能 一部一致」でググって出てきたのが

var text  = 'sampletext';  

var keyword = 'ple';  

if(text.indexOf(keyword) > -1){  

  // 部分一致のときの処理  

}

indexOf()を使うと、一致しなかったときに-1を返す、一致すると0以上の整数を返す。
なるほどこれが使えるな!
そしてこの機能は部分一致って言えばいいんだな!!←そこじゃない

これで部分一致になりました。

動作確認

#ウェブカツ 復習
Vue.jsでtodoアプリ出来上がり。取りあえずコンポーネント化しなければ動作することは確認。明日はコンポーネントにしてみてどうなるかチェックして、問題無ければ一つポートフォリオ用に作品作ります。 pic.twitter.com/hoITkbpWM1

— RIE🇲🇾KLゆるゆる生活 (@saika00) May 21, 2019

これはコンポーネント化前のやつですが
コンポーネントにしてもちゃんと動いていました。

出来上がったやつのコード

もっと良い書き方があるんじゃないかと思いつつも
取りあえずこれで動いたので上げておきます。(CSSは省略)

コンポーネントとやらを使ってみたかったので
取りあえず全部一つのコンポーネントに放り込んでみたけど
これで良かったのか・・?

# TODOS


      


        

      


    



    
  




import Vue from "vue";  

  

Vue.component("todo-item", {  

  data: function() {  

    return {  

      items: [  

        { id: 1, text: "sample todo1", isChecked: false },  

        { id: 2, text: "sample todo2", isChecked: true }  

      ],  

      nextID: 3,  

      todoItem: "",  

      searchWord: ""  

    };  

  },  

  computed: {  

    filteredItems() {  

      return this.searchItem(this.items, this.searchWord);  

    }  

  },  

  methods: {  

    addItem() {  

      this.items.push({  

        id: this.nextID++,  

        text: this.todoItem,  

        isChecked: false  

      }),  

        (this.todoItem = "");  

    },  

    doRemove(index) {  

      this.items.splice(index, 1);  

    },  

    changeStatus(item) {  

      item.isChecked = item.isChecked ? false : true;  

    },  

    searchItem(list, key) {  

      return list.filter(function(item) {  

        return item.text.indexOf(key) !== -1 || key === "";  

      });  

    }  

  },  

  template: `  

  


         


          


            
          


        



        


          __  

        



        


          
            
    * 
                  __  
     {{ item.text }}  
    
                  __  
    

             

        




`  

});  

  

new Vue({  

  el: "#appTodo",  

  data: {},  

  computed: {},  

  methods: {}  

});