slide: https://hackmd.io/@tyshgc/kamakura-mokmok-vue-react-handson/
Vue.js?
Vue.jsはWebフロントエンドの
フレームワークの一つ
簡単に言うと…
データの表示と入力を
うまいことやってくれるもの
Webアプリケーションなので
HTMLの所定のDOM内にアプリケーションを
構築していきます。
<div id="app"> <!-- ここにアプリを構築する --> </div>
Vueインスタンスを作成
new Vue({ el: "#app", //HTMLのどこに表示するか data() { // メッセージのデータ return { message: "御用でしょうか?" }; }, methods: { // 入力処理 onCancel() { this.message = "かしこまりー!!"; } }, template: ` <div> <p>{{message}}</p> <button @click="onCancel">用はない</button> </div> ` });
しかし…
templateにアプリケーションの構造を全部書くのはツライ…
template: ` <div> <p>{{message}}</p> <button @click="onCancel">用はない</button> </div> `
コンポーネントとは?
👉アプリを構成する部品
🧩御用聞きのメッセージ
<p>{{message}}</p>
🧩返事をするボタン
<button @click="onCancel">用はない</button>
それぞれ部品 = コンポーネントとして扱えばいい
🧩御用聞きのメッセージ Servant.vue を作成
<template> <p>{{message}}</p> </template> <script> export default { name: "Servant", // コンポーネント名 props: { // このコンポーネントに渡すことが可能な値 message: String } } </script>
Vueインスタンスにコンポーネントを登録する
import Servant from "./Servant.vue" new Vue({ el: "#app", //HTMLのどこに表示するか //...<同じなので省略>... components: { //コンポーネントを登録 Servant }, template: ` <div> <servant :message="message" /> <button @click="onCancel">用はないよ</button> </div> ` });
🧩キャンセルボタン CancelButton.vue を作成
<template> <button @click="onCommand">用はないよ</button> </template> <script> export default { name: "CancelButton", methods: { onCommand() { // $emitで呼び出し元のイベントを登録して // ここで発火できる this.$emit("do-command"); } } }; </script>
Vueインスタンスにコンポーネントを登録する
//...<同じなので省略>... import CancelButton from "./CancelButton.vue" new Vue({ el: "#app", //HTMLのどこに表示するか //...<同じなので省略>... components: { //コンポーネントを登録 Servant, CancelButton }, template: ` <div> <servant :message="message" /> <cancel-button @do-command="onCancel" /> </div> ` });
御用聞きが文章だけだと寂しい…
絵文字で工夫してみましょう!
御用聞きのシーンごとに
絵文字をコンポーネントにする
|シーン|絵文字|
|–-|–-|–-|
|用件をたずねる時|💁♀️|
|承知した時|🙆♀️|
Emoji.vue
<template> <i v-if="isAsk">💁♀️</i> <i v-else>🙆♀️</i> </template> <script> export default { name: "Ask", props: { isAsk: Boolean, isOk: Boolean } }; </script>
ディレクティブ | 役割 |
---|---|
v-if | 値の真偽を見て条件を満たした場合DOMを表示 |
v-else | ifの条件を満たさなかった場合にDOMを表示 |
v-else-if | 別の条件の場合 |
v-for | 繰り返し |
詳しくは公式ドキュメントを読もう
御用聞きのメッセージに絵文字を
差し込めるようにします。
new Vue({ el: "#app", //HTMLのどこに表示するか data() { return { message: "御用でしょうか?", isAsk: true //用件をたずねているか? }; }, methods: { // 入力処理 onCancel() { this.message = "かしこまりー!!"; this.isAsk = false; } }, components: { //コンポーネントを登録 //...<同じなので省略>... Emoji, }, template: ` <div> <servant :message="message"> <emoji :is-ask="isAsk" /> </servant> <cancel-button @do-command="onCancel" /> </div> ` });
コンポーネントを入れ子にすると…
<servant><Component></servant>
このままではエラーになる
Servant.vueをこうする
<template> <p> <slot /> <span>{{message}}</span> </p> </template>
Pure JavascriptではEnum使えないので…
ぽいものをつくってみる
export const SERVANT_MODE = { ASK: Symbol(), OK: Symbol() };
それを踏まえてなやんかんやいじって…
状態(=State)を一箇所に集中させて管理
さっきのコードをVuexにしてみる
この規模だと逆に冗長的になので本当は使わない
簡単なストップウォッチアプリを作ります。
基礎の基礎のさらにつっこんだ基礎の部分や状態管理Vuexまでできればがんばりましょう!