Vue.js入門 基礎から実践アプリケーション開発まで Chapter3
Chapter3 コンポーネントの基礎
3.1 コンポーネントとは何か
3.1.1 すべてはコンポーネントから構成される
3.1.2 コンポーネント化のメリットと注意点
メリット
ただし、何も考えずにテキトーにコンポーネント化して
メリットを享受できるほど甘くはない
3.1.3 Vue.jsのコンポーネントシステム
だいたいVueインスタンスとおなじ
ちがうとこ
- コンポーネント名を指定する
- ケバブケースにしたものもカスタムタグ名になる
- 使いまわすので、dataにはオブジェクト実体ではなく、
オブジェクトを返す関数を渡す (3.2.6) - props: 親から子へのデータ受け渡し
3.2 Vueコンポーネントの定義
定義してからVueインスタンスをマウントすること
しゅるい
定義方法
カスタムタグ方式
- Vue.component()
コンストラクタ方式
- Vue.extend()
3.2.1 グローバルコンポーネントの定義
グローバルコンポーネントをカスタムタグで定義する方法
Vue.component(tagName, options);
optionsは
new Vue(options);
に渡すやつとだいたいおなじ
tagName
を例えば'myComponent'
とすると、
カスタムタグとしては<my-component>
として利用することになる- css classは引き継がれる
3.2.2 コンストラクタベースの定義
3.2.1では実はこいつが暗黙的に呼ばれている
var MyComponent = Vue.extend({ /* いつものoptions */ }); // 要素を指定してmountできる (new MyComponent()).$mount('#hoge'); // カスタムタグ定義の第二引数にも渡せる Vue.component('my-component', MyComponent);
3.2.3 ローカルコンポーネントの定義
Vueインスタンス内・Vueコンポーネント内に、コンポーネント定義を閉じる
new Vue({ components: { `my-component`: { /* いつもの */ } } })
3.2.4 テンプレートを構築するその他の手段
text/x-template
<script>
データブロックを使う
- 記述をHTML側に分割できるのが有能
- ブラウザが認識しないmimeタイプはx-をつけることになっている
- optionsのtemplateには
<script>
のidを#付きで渡す
インラインテンプレート
これまで使ってきたやつ
描画関数
options.render
に描画関数を記述する
render: function (createElement) { /* createElement関数を使ってなんやかんやする */ }
createElement
をh
と書き、さらにアロー関数を使ってこう書かれることが多いそうな
render: h => {/* ... */}
JSX
SFC: Single File Component
第六章にて
3.3 コンポーネント間の通信
3.3.1 親->子
propsをつかう
props: { type: String|Object|..., default: デフォルト値, required: 必須(true)か否(false)か, validator: バリデーション用関数 - 引数: 渡されたprop - return: true(valid)/false(invalid) }
- props定義は各コンポーネントインスタンスで使いまわせるので、
一品物のオブジェクトを渡す- cf. dataはデータの実体であり、使いまわせないので、オブジェクトを返す関数を渡す
attr-name="..."
でprops.attrName
に渡す- リアクティブシステム対象外なので注意
3.3.2 子->親
イベントをつかう
- listen
component.$on(eventName, callback)
v-on
- trigger
component.$emit(eventName, ...args)
- 引数は可変個
3.4 コンポーネントの設計
Atomic Design とか
3.4.3 スロットコンテンツ
- カスタムタグの中身を入れられる
- named-slotとそうでないのがいる
- 他にもいる気がするけど他章
- named-slotはnameを指定しないと入らない
<slot>
タグ自体が置換される
コラム コンポーネント単位のテスト
- Karma
- mocha
あたりを使っていい感じに