├── LICENSE ├── README.md └── handson.html /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2017 Shohei Okada 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Vue.js からはじめる JS フレームワーク 2 | 3 | この資料は 2017/04/24 開催の勉強会「Vue.js からはじめる JS フレームワーク」用の資料です。 4 | 5 | 6 | ## イベント詳細 7 | 8 | [【勉強会】Vue.js からはじめる JS フレームワーク(ハンズオン形式) - サポーターズCoLab](https://supporterzcolab.com/event/8/) 9 | 10 | 11 | ## 進め方 12 | 13 | handson.html というファイルがあるので、このファイルをダウンロードし下記お題に沿って追記していってください。 14 | 15 | ## ハンズオン 16 | 17 | ### Hello World 18 | 19 | ` 32 | ``` 33 | 34 | HTML 側で `{{ }}` を用いることで変数を展開できます。 35 | 36 | ```html 37 |
38 | {{ message }} 39 |
40 | ``` 41 | 42 | ブラウザで handson.html を開き、 'Hello World' と表示されている事を確認してください。 43 | 44 | なお、コンソールから Vue インスタンスのプロパティを書き換えると、表示内容も更新されます。 45 | 46 | ```js 47 | vm.message = 'Hello Vue' 48 | ``` 49 | 50 | ### 配列の要素の描画 51 | 52 | `v-for` ディレクティブを使うことで配列の要素を描画することができます。 53 | 54 | ```html 55 | 67 | ``` 68 | 69 | ```html 70 |
71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 |
Name
{{ user.name }}
83 |
84 | ``` 85 | 86 | ### 画面上で要素の追加入力 87 | 88 | 配列の内容を変更すると連動して表の内容も再描画されます。 89 | 90 | 上記の状態でブラウザのコンソールから配列に要素を追加してみましょう。 91 | 92 | ```js 93 | vm.users.push({name: 'Dave'}); 94 | ``` 95 | 96 | これを利用して入力フォームから要素を追加入力できるようにします。 97 | 98 | #### v-model ディレクティブ 99 | 100 | Vue インスタンスのプロパティと `` 要素の入力内容を結びつけるには `v-model` ディレクティブを使用します。 101 | 102 | まず、`data` プロパティに下記を追加します。 103 | 104 | ```html 105 | 117 | ``` 118 | 119 | そして、HTML 側に `` 要素を追加します。 120 | 121 | ```html 122 |
123 | 124 |         125 |
126 |     127 | 128 |
129 | ``` 130 | 131 | この状態で、試しに何か入力した状態でコンソールから `newUserName` プロパティの値を確認してみてください。 132 | 133 | ```js 134 | vm.newUserName 135 | ``` 136 | 137 | また、`newUserName` プロパティを別の値で上書きすると `` 要素の内容も連動することを確認してみてください。 138 | 139 | ```js 140 | vm.newUserName = 'Dave' 141 | ``` 142 | 143 | #### methods プロパティ 144 | 145 | 次に、入力内容を配列に追加するメソッドを作成します。 146 | 147 | Vue インスタンスの `methods` プロパティに関数を記述することで、メソッドを作成できます。 148 | 149 | このとき、Vue インスタンス自身には `this` でアクセスすることができます。 150 | 151 | ```html 152 | 163 | ``` 164 | 165 | #### v-on ディレクティブ 166 | 167 | 最後に、Enter キーの keyup イベントをハンドリングして、 作成した `append` メソッドが呼び出されるようにします。 168 | 169 | イベントハンドリングを行うには `v-on` ディレクティブを使用します。 170 | 171 | `` 要素を次のように書き換えてください。 172 | 173 | ```html 174 |     175 | ``` 176 | 177 | これで、入力後に Enter キーを押すことで要素が追加されるようになります。 178 | 179 | なお `v-on:` は省略記法として `@` で代用することができます。 180 | 181 | ```html 182 |     183 | ``` 184 | 185 | ### [応用] 要素の削除 186 | 187 | ここまでの内容を応用して、クリックすると要素を削除するボタンを作成してみましょう。 188 | 189 | HTML 部分を次のように変えると、各行に「×」マークが表示されます。 190 | 191 | ```html 192 |
193 | 194 | 195 | 196 | 197 | 198 | 199 | 200 | 201 | 202 | 203 | 204 | 205 | 206 |
Name
{{ user.name }}
207 | 208 |
209 | ``` 210 | 211 | 「×」マークをクリックした際に該当行が削除されるようにしてみましょう。 212 | 213 | 214 | Hint 1: `v-for="(user, index) in users'` とすることで、ループ中の要素番号(0開始)に `index` でアクセスすることができます 215 | 216 | Hint 2: 例えば 3 番目の要素を削除するとき、コンソール上では次のようにします 217 | 218 | ```js 219 | vm.users.splice(2, 1); 220 | ``` 221 | 222 | Hint 3: `v-on` ディレクティブで呼び出すメソッドには `v-on:click="remove(index)"` のようにして引数を渡すことができます 223 | 224 | ### コンポーネント 225 | 226 | Vue.js では「コンポーネント」を利用することでコードをカプセル化し、再利用しやすい形にすることができます。 227 | 228 | コンポーネント指向とは Vue.js 固有ではなく一般的な概念です。 229 | 230 | 詳細な解説は割愛しますが(私もたいして理解していない)、Vue.js においてはとりあえず下記を認識しておいてください。 231 | 232 | * コンポーネントは親子関係を持たせられる 233 | * 子から親のデータを直接参照できない 234 | * 親はプロパティを介して子にデータを伝達できる 235 | * 子はイベントを発火することで親に情報を知らせる 236 | 237 | Vue.js におけるコンポーネントの詳細については公式ドキュメントを参考にしてください。 238 | 239 | [コンポーネント - Vue.js # コンポーネントの構成](https://jp.vuejs.org/v2/guide/components.html#コンポーネントの構成) 240 | 241 | 例として `user` をコンポーネント化してみましょう。 242 | 243 | コンポーネントを作成するには次のように記述します。 244 | 245 | ```js 246 | Vue.component('user', { 247 | props: ['name'], 248 | template: 249 | '\ 250 | {{ name }}\ 251 | \ 252 | ', 253 | methods: { 254 | remove: function (index) { 255 | this.$emit('remove'); 256 | } 257 | } 258 | }); 259 | ``` 260 | 261 | `props` は親コンポーネントから渡されるプロパティです。 262 | 263 | 親コンポーネントからは直接値を指定する方法と、 `v-bind` ディレクティブを利用してデータを動的に結びつける方法があります。 264 | 265 | 今回のハンズオンでは後者のみを利用します(後ほど説明)。 266 | 267 | `template` は文字通りコンポーネントのテンプレートです。 268 | 269 | テンプレート内ではプロパティの値を参照できます。 270 | 271 | また、コンポーネントも `methods` を持つことができます。 272 | 273 | ただし、`remove` メソッドは要素の削除を行っていないことに留意してください。 274 | 275 | `$emit` を用いると任意の名前のイベントを発火することができます。 276 | 277 | ここでは remove という名前のイベントを発火しているだけに留まり、親コンポーネントでそのイベントをハンドリングします。 278 | 279 | 280 | 上記だけではわかりにくいので全体のコードを見てましょう。 281 | 282 | ```html 283 | 321 | ``` 322 | 323 | 親コンポーネントとなる Vue インスタンスには変更はありません。 324 | 325 | ```html 326 |
327 | 328 | 329 | 330 | 331 | 332 | 333 | 334 | 335 | 341 | 342 |
Name
343 | 344 |
345 | ``` 346 | 347 | `` の中身がコンポーネントによってカプセル化されています。 348 | 349 | `is` 属性によってコンポーネントを指定しています。 350 | 351 | また、`v-bind` ディレクティブを用いて `user.name` を子コンポーネントのプロパティ `name` に結びつけています。 352 | 353 | なお `v-bind:` は省略記法として `:` で代用することができます。 354 | 355 | `:name="user.name"` 356 | 357 | 更に、`@`(`v-on:` の省略記法)を使って `remove` イベントをハンドリングしています。 358 | 359 | 子コンポーネントから `remove` イベントが送出されると、該当する要素を削除(自身の `remove` メソッドを呼び出し)するようになっています。 360 | 361 | 以上でこれまでに作ってきたものをコンポーネント化することができました。 362 | 363 | コンポーネント化により親と子が疎結合になり、再利用しやすくなっていることがわかると思います。 364 | -------------------------------------------------------------------------------- /handson.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 |
17 | 18 | 20 | 21 | 22 | 23 | --------------------------------------------------------------------------------