プログラミングマガジン

プログラミングを中心にIT技術をできるだけわかりやすくまとめます。

  • ホーム
  • Vue.js
  • 【Vue.js】「カスタムディレクティブ」について
 
 
     
  • サーバー言語  
    • Python
    • Ruby
    • PHP
    • SQL
  •  
  • インフラ  
       
    • AWS
    •  
    • 基本
    • Git
  • Web
       
    • Web開発
    • JavaScript
    • Vue.js
    • React
  •  
  • 設計  
       
    • 実装設計
    • DB設計
  • 問い合わせ
  

【Vue.js】「カスタムディレクティブ」について

06.07

  • miyabisan2
  • コメントを書く

この記事は2分で読めます

カスタムディレクティブとは?

自分でvから始まるVue.jsのディレクティブを作る事ができる機能です。Vue.jsの標準のディレクティブではDOM操作等を自分で記述することはほぼなかったのですが、このカスタムディレクティブではガンガン低レベルのDOM操作メソッド等を自分で扱ったりすることになります。

メリット

ソースコードを抽象化して再利用できるようにしたい場合に効果的です。

フック関数

ディレクティブの中には5つのフック関数を配置する事ができます。その中でも重要な関数はbindとupdateです。なぜなら初期化されないディレクティブはないですし、何かデータを変化させるためにディレクティブを用意する必要があるためです。

関数名 説明
bind ディレクティブが初めて対象の要素に初めて紐づいた時に呼ばれる。例えば、ディレクティブをタグに記述して初めて呼ばれた際に1度だけ呼ばれます。Vueインスタンスでいうcreatedです。
inserted 親のVNodeのDOMに実際に挿入された時。Vueインスタンスでいうmountedです。
update 親のコンポーネントが少しでも更新された場合(子コンポーネントはまだ影響なし)
componentUpdate 子コンポーネントのデータも含めて変更があった場合
unbind コンポーネントで言うところのdestroy

書き方

main.jsに下記のように記述します。その中でも必ず記述することになるのはbindとupdateなのでそれ以外は一旦消しておくと良いでしょう。

1
2
3
4
5
6
7
8
9
10
11
12
Vue.directive("ディレクティブ名", {
  bind(el, binding, vnode) {
  },
  inserted(el, binding, vnode) {
  },
  update(el, binding, vnode, oldVnode) {
  },
  componentUpdate(el, binding, vnode, oldVnode) {
  },
  unbind(el, binding, vnode) {
  }
})

省略記法

下記のように引数にオブジェクトではなく関数を取る記述法にもする事ができこの方がむしろ一般的な書き方です。(関数の引数はelとbinding以外はあまり使わないので省略しています。)

1
2
Vue.directive("border", function (el, binding) {
})

el

そのカスタムディレクティブが紐づく要素のことを指しています。例えばdivタグでカスタムディレクティブを使っていた場合はdivタグを示すことになります。

例

例えば、要素にborderをつけるディレクティブを作る場合は下記のようにします。下記の例はJavaScriptでDOMを直接操作しています。

1
2
3
Vue.directive("border", function (el) {
  el.style.border = "solid blue 1px";
})

下記は呼び出す側です。

1
<img v-border alt="Vue logo" src="./assets/logo.png">

binding

例

DOMに対して枠線の色を設定する場合は下記のように記述します。

1
2
3
4
Vue.directive("border", function (el, binding) {
  el.style.border = "solid black 2px";
  el.style.borderColor = binding.value;
})

渡す側は下記のようにします。

1
    <img v-border="'red'" alt="Vue logo" src="./assets/logo.png">

複数データを渡す場合は下記のようにします。

1
2
3
4
5
Vue.directive("border", function (el, binding) {
  el.style.border = "solid black 2px";
  el.style.borderWidth = binding.value.width;
  el.style.borderColor = binding.value.color;
})

上記のようにオブジェクトに複数項目を設定すれば複数項目を渡す事が可能です。

1
<img v-border="{color: 'red',width: '6px'}" alt="Vue logo" src="./assets/logo.png">

引数を渡す

1
2
3
Vue.directive("border", function (el, binding) {
  console.log(binding.arg)
})

下記のように「:引数」として渡します。(例ではabcと言う文字を渡しています。)

1
    <img v-border:abc="{color: 'red',width: '6px'}" alt="Vue logo" src="./assets/logo.png">

修飾子を使う

任意の修飾子を追加する事ができます。下記の例ではfgcと言う値が修飾子になります。

1
    <img v-border:abc.fgc="{color: 'red',width: '6px'}" alt="Vue logo" src="./assets/logo.png">

ディレクティブの処理側では修飾子のチェックをする事ができます。修飾子として指定されていればtrueが返ります。

1
2
3
Vue.directive("border", function (el, binding) {
  console.log(binding.modifiers.fgc);
})

ローカル登録

今まではグローバル登録をして全てのコンポーネントで共通して使えるカスタムディレクティブを登録する方法を記述してきましたが、下記のようにすればそのコンポーネント内のみで使えるローカルのカスタムディレクティブとして使用できるようになります。

1
2
3
4
5
6
7
8
9
<script>
export default {
  directives: {
    関数名(el,binding) {
      el.style.border = "solid black 2px";
    }
  }
}
</script>

ただ、注意点としてはコンポーネントのローカルで使用したからといってthisによりコンポーネントのデータにアクセスすることはできませんので注意です。

スポンサーリンク
  • 2020 06.07
  • miyabisan2
  • コメントを書く
  • Vue.js
  • Tweets Twitter
  • このエントリーをはてなブックマークに追加
  • LINEで送る

関連記事

  1. 2020 06.12

    【Vue.js】テストコードを書くには?(Vue Test Utilsなど)

  2. 2020 04.05

    【Vue.js】「SFC(Single File Components、単一ファイルコンポーネント)」とは?

  3. 2020 04.11

    【Vue.js】コンポーネント実装の際の注意点(elやdata等)

  4. 2018 07.15

    【Vue.js】「Vue CLI」の基礎知識

  5. 2018 07.17

    【Vue.js】「Vue Router」の基本、「Vuex」と連携してルーティング情報を一元管理

  6. 2020 04.05

    【Vue.js】「v-if」、「v-show」ディレクティブについて

  • コメント ( 0 )
  • トラックバック ( 0 )
  1. この記事へのコメントはありません。

  1. この記事へのトラックバックはありません。

返信をキャンセルする。

【Vue.js】「動的コンポーネント」について

【AWS】VPC「ルートテーブル」や「インターネットゲ…

RETURN TOP

著者プロフィール

エンジニア歴10年で過去に業務系、Webデザイン、インフラ系なども経験あります。現在はWeb系でフロントエンド開発中心です。

詳細なプロフィールはこちら

スポンサーリンク

カテゴリー

  • Android
  • AngularJS
  • API
  • AWS
  • C++
  • CSS
  • cursor
  • C言語
  • DDD
  • DevOps
  • Django
  • Docker
  • Figma
  • Git
  • GitLab
  • GraphQL
  • gRPC
  • Hasura
  • Java
  • JavaScript
  • Kubernetes
  • Laravel
  • linux
  • MySQL
  • Next.js
  • nginx
  • Node.js
  • NoSQL
  • Nuxt.js
  • Oracle
  • PHP
  • Python
  • React
  • Redux
  • Rspec
  • Ruby
  • Ruby on Rails
  • Sass
  • Spring Framework
  • SQL
  • TypeScript
  • Unity
  • Vue.js
  • Webサービス開発
  • Webデザイン
  • Web技術
  • インフラ
  • オブジェクト指向
  • システム開発
  • セキュリティ
  • その他
  • データベース
  • デザインパターン
  • テスト
  • ネットワーク
  • プログラミング全般
  • マイクロサービス
  • マイクロソフト系技術
  • マルチメディア
  • リファクタリング
  • 副業
  • 未分類
  • 業務知識
  • 生成AI
  • 設計
  • 関数型言語
RETURN TOP

Copyright ©  プログラミングマガジン | プライバシーポリシー