Nuxt3パブリックベータ版時点の情報となります。
Nuxt3のsetup内ではthisが参照できない
Nuxt3のsetup
内ではthis
が参照できません。
<script setup lang="ts">
console.log(this)
</script>
<!-- console -->
undefined
その代わりに、useNuxtApp()
を使用してNuxtインスタンスにアクセスします。
<script setup lang="ts">
const nuxtApp = useNuxtApp()
console.log(nuxtApp)
</script>
<!-- console -->
callHook: ƒ ()
globalName: "nuxt"
hook: ƒ ()
hooks: Hookable {_hooks: {…}, _deprecatedHooks: {…}, hook: ƒ, callHook: ƒ, callHookWith: ƒ}
isHydrating: false
payload: Proxy {data: {…}, state: {…}, _errors: {…}, serverRendered: true, config: {…}}
provide: (name, value) => {…}
vueApp: {_uid: 0, _component: {…}, _props: null, _container: div#__nuxt, _context: {…}, …}
$config: (...)
$router: (...)
...
useNuxtApp()とは
Nuxtインスタンスにアクセスするための関数です。Nuxt2のコンテキストと同等の扱いです。
コンポーザブル、コンポーネント、プラグイン内のランタイムアプリコンテキストにアクセスできます。useNuxtApp(サーバーサイド)は、setup、Nuxtプラグインまたはライフサイクル Hooks内部でのみ機能します。
引用: Nuxt 3 - NuxtApp
useNuxtApp()
を使用すればprovide
で登録した値を呼び出すことができます。
const nuxtApp = useNuxtApp()
nuxtApp.provide('hello', (name) => `Hello ${name}!`)
console.log(nuxtApp.$hello('name')) // Prints "Hello name!"
provideとは
provide
はコンポーネントのインスタンスに任意の値を設定できるVue3の機能です。
Vue3では、provide
で登録した値はinject
を使用して呼び出します。
Nuxt3の場合は、
useNuxtApp().provide('呼出キー', <値 or 関数 or クラス>)
で登録し、useNuxtApp().$<呼出キー>
で参照します。
provide
をプラグインファイルで使用する際の書き方はこの記事が参考になります。
provideでページを跨いだ値の参照
provide
を使用してNuxtインスタンスに登録すれば、ページを跨いだ値の参照も可能です。
pages/index.vue
<!-- pages/index.vue -->
<script setup lang="ts">
// Nuxtインスタンスに登録
useNuxtApp().provide('hoge', 'Hello')
</script>
<!-- pages/test.vue -->
<script setup lang="ts">
// Nuxtインスタンスから呼び出し
console.log(useNuxtApp().$hoge)
</script>
<!-- console -->
Hello
Nuxt2ではinject関数を使用して上記機能を実現していました。
Nuxt2のinjectで登録したクラスをNuxt3で参照する
例えばECサイトのShopifyを扱うnuxt-shopify
モジュールは、Nuxt2のinject
を使用し、インスタンスにクラスを登録しています。
node_modules/nuxt-shopify/lib/plugin.js
// Inject shopify to the context as $shopify
export default (ctx, inject) => {
ctx.$shopify = client;
inject('shopify', client);
});
Nuxt2のinject参照方法
inject
を使用して登録したクラスは、Nuxtコンテキストやthis
からそのクラスを参照できます。
asyncData
// Nuxtコンテキストから参照
async asyncData({ $shopify, params }) {
const product = await $shopify.product.fetch(params.id);
return { product };
}
methods/ created/ mounted/ etc
// thisから参照
methods: {
async fetchProduct(productId) {
this.product = await this.$shopify.product.fetch(productId);
}
}
Nuxt3のinject参照方法
Nuxt3ではuseNuxtApp()
を使用してinject
で登録したクラス関数にアクセスします。
<script setup lang="ts">
const nuxtApp = useNuxtApp()
const products = await nuxtApp.$shopify.product.fetchAll()
</script>
← Prev
Next →
あなたの力になれること
私自身が独学でプログラミングを勉強してきたので、一人で学び続ける苦しみは痛いほど分かります。そこで、当時の私がこんなのあったら良いのにな、と思っていたサービスを立ち上げました。周りに質問できる人がいない、答えの調べ方が分からない、ここを聞きたいだけなのにスクールは高額すぎる。そんな方に向けた単発・短期間メンターサービスを行っています。
独学プログラマのサービス
Nuxt3の投稿
1
Nuxt3 Betaをブラウザに立ち上げる【Nuxt3 × VSCodeセットアップ】
2
Nuxt3のsetup内ではthisの代わりにuseNuxtApp()を使用する
3
Nuxt3でレイアウトファイルを使用するには<NuxtLayout>を使う
4
Nuxt3で動的ルーティングを生成するには[id].vueを作成する
5
Nuxt3のmiddlewareの登録と呼び出し&Beta版のバグとその回避策
6
Nuxt3betaのServerMiddlewareで特定ルートのみ発火させる方法は動かない
7
importする自作プラグインはserver/apiには置けない
8
Nuxt3でinjectみたいに自作クラスを登録するにはprovideを使う
9
Nuxt3のuseFetch()で2回目以降のapiがスルーされる問題
1
Nuxt3を使ってShopifyの商品一覧を取得しよう
2
Nuxt3をNetlifyCLIとnetlify.tomlを使ってNetlifyにデプロイしよう
3
Nuxt3のserver/apiとuseFetchを使用してShopifyへサーバーAPIリクエストを実装
4
Nuxt3でShopifyのCheckoutIDが付与されたURLにリダレクト処理を行う
5
【Nuxt3×Shopify】Piniaを導入した商品取得のベストプラクティス