異なるコンポーネントから共通で利用できる関数を定義したかったので、試してみました。
以前の記事ではmixinを使って実現しましたが、この方法では asyncData や fetch 内で共通の関数を利用できませんでした。
そのため、今回はinjectを使って実現しています。
この方法では、 asyncData や fetch 等のSSR時も関数を利用できるため、こちらの方が良いかもしれません。
共通の関数を定義する
plugins/ 内に utils.js というファイルを作成し、ここに関数を定義していきます。
今回は例として hoge() と fuga() という、2つの関数を定義するものとします。
使用する際は this.$huga() のように記述します。
const hoge = () => {
return "hoge";
}
const fuga = () => {
return "fuga";
}
export default ({}, inject) => {
inject('hoge', hoge);
inject('fuga', fuga);
}
nuxt.config.jsに設定を追加
nuxt.config.js に設定を追加します。
plugins: [
'@/plugins/utils'
],
コンポーネントからの利用
<template> 内での利用は、関数名の前に $ を付けて呼び出します。
<template>
<button @click="$hoge()">hogeを実行</button>
</template>
<script> 内の asyncData や fetch 内で使用したい場合は、 context から呼び出します。
こちらも関数名の前に $ が付きます。
<script>
export default {
asyncData(context){
context.app.$hoge(); // ここで呼び出し
}
}
</script>
SSR時以外は、 this.$hoge() のように呼び出します。
<script>
export default {
methods: {
hoge() {
return this.$hoge(); // ここで呼び出し
}
}
}
</script>
便利!
TypeScriptでも同じように利用したい場合は、こちらを参考にしてください。
参考: Nuxt.js + TypeScript で injectを利用した関数の呼び出しを定義する