Vue.js入門 Vol.2 ～jQueryとの対比編～

こんにちは！
LIFULLエンジニアの吉永です。
本日も最近あまり関わらなくなったのであまりキャッチアップできていなかったフロントエンド開発技術についてインプットした内容を備忘録として記載していきます。

## 本記事の概要

前回の[記事](https://qiita.com/YoshinagaYuta/items/278a0d6223952ecc7e29#%E6%9C%AC%E8%A8%98%E4%BA%8B%E3%81%AE%E6%A6%82%E8%A6%81)をご参照ください。
本記事は前記事の続きになります。

## 双方向データバインディング v-model

<p class="codepen" data-height="1000" data-theme-id="dark" data-default-tab="js,result" data-user="yuta-yoshinaga" data-slug-hash="xxqgQmo" style="height: 1000px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="双方向データバインディング v-model">
  <span>See the Pen <a href="https://codepen.io/yuta-yoshinaga/pen/xxqgQmo">
  双方向データバインディング v-model</a> by Yuta Yoshinaga (<a href="https://codepen.io/yuta-yoshinaga">@yuta-yoshinaga</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

Text1及びText2に入力されたテキストをもう片方にも反映しており、Resetを押すとテキストをクリア、Reverseを押すと入力されたテキストの内容を反転させる例。
双方向データバインディングとは、モデルの状態とビューの状態を同期させる仕組み。
[前記事のv-bind](https://qiita.com/YoshinagaYuta/items/278a0d6223952ecc7e29#%E3%83%87%E3%83%BC%E3%82%BF%E3%83%90%E3%82%A4%E3%83%B3%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0-v-bind)はモデルの状態をビューに反映し、ビュー上での変更に対してモデルは追従しない、片方向のデータバインディング。
用途に応じて使い分けることで、柔軟に対応できそうですね。
ここまで来るとjQueryはイベントハンドラだらけになり、かつ、同期させるべき項目が増えれば増えただけコードが肥大化して煩雑になっていきそうな予兆を既に示しています。
※いや、もっとスマートに書けるだろっていうご意見もありそうな気はしますが・・・
※あと、「jQueryいけてないよね」って貶めるような意図は一切ございません！

## コンポーネント

<p class="codepen" data-height="500" data-theme-id="dark" data-default-tab="js,result" data-user="yuta-yoshinaga" data-slug-hash="bGqgOPz" style="height: 500px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="コンポーネント">
  <span>See the Pen <a href="https://codepen.io/yuta-yoshinaga/pen/bGqgOPz">
  コンポーネント</a> by Yuta Yoshinaga (<a href="https://codepen.io/yuta-yoshinaga">@yuta-yoshinaga</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

続いてコンポーネントです。
予めHTML上で使いまわすタグ構造などをコンポーネントとしてモデルに定義しておき、HTML側ではそのコンポーネントタグを記述することで展開することが可能になります。
このようにしておくことでビュー側のコードがすっきりすることと、ビューのパーツをコンポーネント化しておくことで再利用しやすく、かつ保守性も高くすることが可能になります。

## CSS Class切り替え

<p class="codepen" data-height="500" data-theme-id="dark" data-default-tab="js,result" data-user="yuta-yoshinaga" data-slug-hash="vYxgbmz" style="height: 500px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="CSS Class切り替え">
  <span>See the Pen <a href="https://codepen.io/yuta-yoshinaga/pen/vYxgbmz">
  CSS Class切り替え</a> by Yuta Yoshinaga (<a href="https://codepen.io/yuta-yoshinaga">@yuta-yoshinaga</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

続いてエレメントのClass属性を変更する際の例です。
ラジオボタンの選択状態に応じて表示しているテキストのカラーが切り替わるようになっており、ラジオボタンのバリューにCSSで定義したクラス名を設定してあり、ラジオボタンの選択が変更されるたびに、置き換えるようになっています。
v-modelでラジオボタンの選択値を共有して、Class属性にはv-bindで片方向だけのデータバインディングを行ってクラスを切り替えています。

## 最後に

いかがでしたでしょうか？
Vue.jsの基本的な部分に関しては前回の記事と今回の記事で、概ね網羅できたのではないかと思います。
次のステップとしてはこれらを組み合わせ応用していくことで、より複雑なフロントエンド開発ができるようにちょっとした家計簿アプリケーションのようなものを作成してみようと思います。
次回も引き続きVue.jsとjQueryのコード比較を行いながら実装していく予定です！

それではまた次の記事でお会いしましょう！