Vue公式ガイド読解メモ-カスタムディレクティブ

今回は、

「カスタムディレクティブ」

https://jp.vuejs.org/v2/guide/custom-directive.html

基本

Vue.jsの標準のディレクティブ(v-modelとかv-showとか)に加えて、自分でディレクティブを定義できる。

  • Vue2.0でのコードの再利用性と抽象化における基本の形はコンポーネント
  • 低レベルDOMにアクセスしなけれあならないケースもあるかも、そのときはカスタムディレクティブが役立つ。

らしい。画面描画のinputフォーカスとか。

Vue.directive('focus', {
  // ひも付いている要素が DOM に挿入される時...
  inserted: function (el) {
    // 要素にフォーカスを当てる
    el.focus()
  }
})

directiveにグローバル登録できる。 ローカルなら、directiveslオプション。(コンポーネントとかと一緒)

フック関数があるんすね、第一引数がDOM要素なのね。 これはどのDOM要素だろうか。ディレクティブがついているコンポーネントのルートかな。HTML要素に指定されていたら、そのHTML要素だろうが。

フック関数

フック関数はすべて任意。

  • bind:ディレクティブが要素に紐付いたとき一度だけ実行。いつだそれは。。
  • inserted:紐付いている要素が親ノードに挿入されたときに呼ばれる。必ずしもドキュメントにあるとは限らんらしい。どういうこと。
  • update:紐付いた要素を抱合しているコンポーネントのvnodeが更新されるたびに呼ばれる。コンポーネントはv-nodeの集合(ツリー)の気がするが、どこかで更新されたら、updateが呼ばれるってことかな。このあたりの構造はよくわかってない。
  • componentUpdated:このあたりののvnodeと子コンポーネントのvnodeが更新された後に呼ばれる
  • unbind:ディレクティブが要素から取り除かれたときに1度呼ばれる。

ディレクティブって、要素に紐づく、取り除かれる、ってタイミングがあるみたい。 内部的な作りを前提にしている説明な気がする。vnodeの作られ方とか。

(やっちまった、戻ると消えるのね。。。これは致命的だ)

ディレクティブフック引数

elだけではない。(el, bindings, vnode, oldVnode)らしい。oldVnodeはupdateとcomponentUpdatedのときだけ利用できる。update前のvnode.

v-demo:foo.a.b="message" // messageはdataで定義されている変数

bindingオブジェクト。valueはディレクティブに渡される値。式なら評価結果。expressionが式の文字列表現。argは上記の例ではfoo、modifiersは、上記例では{a:true,b:true}らしい。argとmodifiersって違う概念だったのか。そりゃそう。

もしかして、ディレクティブ作れるようになると、vnodeの理解が深まるのかしら。

動的なディレクティブ引数

<p v-pin:[direction]="200">xxx</p>

bindng.arg の値をbindフック関数内で判定して、挙動を変えられる。 コンポーネント利用側から柔軟に制御できるということだな。

関数による省略記法

bindとupdateに同じ振る舞いを定義するときは、オブジェクトを渡すんじゃなくて関数を直接渡してしまう。

Vue.directive("hoge", function(el, binding) { //})

たしかに、bindとupdateで同じふるまいが普通なのかな。

オブジェクトリテラル

ディレクティブが複数の値を必要なら、JSオブジェクトリテラルを渡すことができる。 なんのこっちゃない、オブジェクトを渡せるということ。 ディレクティブは任意のJS式を取れる(覚えましょう)

今日はここまでかな。 次は「描画関数とJSX」