Vue.jsでのカスタムディレクティブの作成とユースケース

Vue.jsではカスタムディレクティブを使用して、DOM操作や共通の動作を再利用可能にできます。本記事では、カスタムディレクティブの作成方法から実用的なユースケースまでを詳しく解説します。
目次
カスタムディレクティブとは
Vue.jsに標準で備わっていない独自のディレクティブを定義し、DOM操作をカスタマイズできます。
カスタムディレクティブの基本構文
基本的なカスタムディレクティブの構文を示します。
app.directive('focus', {
mounted(el) {
el.focus();
}
});
カスタムディレクティブの登録
ディレクティブをVueアプリに登録します。
import { createApp } from 'vue';
import App from './App.vue';
const app = createApp(App);
app.directive('focus', {
mounted(el) {
el.focus();
}
});
app.mount('#app');
ディレクティブの引数を使う
引数を受け取って動作を変えるカスタムディレクティブ。
app.directive('color', {
mounted(el, binding) {
el.style.color = binding.value;
}
});
修飾子の使用
ディレクティブに修飾子を追加して動作を拡張します。
app.directive('resize', {
mounted(el, binding) {
if (binding.modifiers.debounce) {
let timer;
window.addEventListener('resize', () => {
clearTimeout(timer);
timer = setTimeout(() => binding.value(), 300);
});
}
}
});
ライフサイクルフック
カスタムディレクティブには、さまざまなライフサイクルフックがあります。
app.directive('example', {
beforeMount(el) {
console.log('beforeMount');
},
mounted(el) {
console.log('mounted');
},
updated(el) {
console.log('updated');
},
unmounted(el) {
console.log('unmounted');
}
});
実用例1: 自動フォーカスディレクティブ
特定の要素に自動的にフォーカスを当てるディレクティブ。
app.directive('auto-focus', {
mounted(el) {
el.focus();
}
});
実用例2: クリック外イベント
要素外のクリックを検出するカスタムディレクティブ。
app.directive('click-outside', {
mounted(el, binding) {
el.clickOutsideEvent = (event) => {
if (!(el === event.target || el.contains(event.target))) {
binding.value(event);
}
};
document.addEventListener('click', el.clickOutsideEvent);
},
unmounted(el) {
document.removeEventListener('click', el.clickOutsideEvent);
}
});
実用例3: ツールチップディレクティブ
シンプルなツールチップを表示するカスタムディレクティブ。
app.directive('tooltip', {
mounted(el, binding) {
el.setAttribute('title', binding.value);
}
});
グローバル vs ローカルディレクティブ
グローバルディレクティブとローカルディレクティブの違いと使い分け。
ディレクティブのテスト
ディレクティブの動作をテストする方法。
カスタムディレクティブの注意点
パフォーマンスやバグ回避のための注意点。
まとめ
カスタムディレクティブは、Vue.jsアプリケーションでDOM操作やUIの振る舞いを効率的に管理する強力なツールです。実用的な例を通じて活用し、コードの再利用性と保守性を向上させましょう。
-
前の記事
gmail メールにスターを付けるショートカットキー 2025.03.11
-
次の記事
PHPのエラー『Notice: Constant Redefined in Script』の解決方法 2025.03.12
コメントを書く