Nuxtのcontextとは. contextへアクセスを実験

Nuxtのcontext(コンテキスト)について解説 / 実験していきます。

細かく・正確な解説はNuxtの公式サイトを確認頂けたらと思います。
が、
実際にcontextを呼び出して中身を確認しつつ、アクセス方法を実験していきたいと思います。

Q. Nuxtのcontext(コンテキスト)とは

Vueオブジェクトのプロパティ、メソッドへアクセス、操作可能な変数です。
特定のライフサイクル内でのみ利用可能です。
(極端に解釈すると、特定の場所から呼び出せるグローバルなNuxt(Vue)情報を含んだ変数です。)

context内には様々な情報を含んでいます。 様々なキー

注意 「Nuxtのcontext」と「Vuexのcontext」は別物なので混合しないようにしてください。

Q. Nuxtのcontextを呼び出す場所

context は、Nuxt から Vue コンポーネントに追加のオブジェクト/パラメータを提供し、asyncData 、fetch 、plugins 、middleware そして nuxtServerInit のような特別な Nuxt ライフサイクル内で使用できます。

https://develop365.gitlab.io/nuxtjs-2.8.X-doc/ja/api/context/

上記あるように「asyncData 、fetch 、plugins 、middleware 、nuxtServerInit」からcontextを呼び出すことが出来る。

Q. Nuxtのcontextを呼び出す方法

では、実際にcontextを呼び出してみます。

上記のライフサイクルのみで呼び出し可能です。

A, fetchから呼び出す。Component内(ページ、レイアウトカラム内でも)
<script>
export default {
  // 省略
  fetch(context) {
    console.log(context);
  },
  // 省略
}
</script>

下記のような結果が取得出来ました。
インストールしているライブラリなどによってもcontextで取得できる内容は変わります。

$axiosƒ wrap()
$config: {_app: {…}}
$vuetify: {…}
app: {head: {…}, store: Store, router: VueRouter, nuxt: {…}, render: ƒ, …}
base: "/"
env: {}
errorƒ ()
from: {name: 'index', meta: Array(1), path: '/', hash: '', query: {…}, …}
isDev: true
isHMR: false
isStatic: false
nextƒ ()
nuxtState: {config: {…}}
params: {}
payload: undefined
query: {}
redirectƒ (status, path, query)
route: {name: 'index', meta: Array(1), path: '/', hash: '', query: {…}, …}
store: Store {_committing: false, _actions: {…}, _actionSubscribers: Array(1), _mutations: {…}, _wrappedGetters: {…}, …}
_errored: false
_redirected: false
A, middlewearから呼び出す。
app/middleware/test.js
export default function(context){
  console.log(context);
}
app/layouts/default.vue

layoutのmiddlewearにtest.jsを適用

<script>
  export default {
//省略
  middleware: ['test'],
//省略
</script>

同じ結果が取得出来ました。

Q. 指定のライフサイクル以外で取得は不可?

出来ません。mountedから呼び出してみます。

<script>
export default {
  // 省略
  mounted(context) {
    console.log(context);
  },
  // 省略
}
</script>

結果は undefined が返ってきます。

Q. contextデータ大きすぎて、使いづらい?

分割代入を利用することで、必要なデータのみを取得することが可能です。

例えば、context内に存在する、appオブジェクトのみを取得したい場合には、下記のように分割代入で取得

A, fetchから呼び出す。Component内(ページ、レイアウトカラム内でも)
<script>
export default {
  // 省略
  fetch({app}) {
    console.log(app);
  },
  // 省略
}
</script>

下記のようなappの中身のみ取得

{head: {…}, store: Store, router: VueRouter, nuxt: {…}, render: ƒ, …}
$axiosƒ wrap()
$config: {_app: {…}}
beforeCreateƒ beforeCreate()
components: {NuxtLoading: {…}}
computed: {isOffline: ƒ, isFetching: ƒ}
context: {isStatic: false, isDev: true, isHMR: false, app: {…}, store: Store, …}
createdƒ created()
dataƒ data()
head: {title: 'app', htmlAttrs: {…}, meta: Array(4), link: Array(3), style: Array(0), …}
methods: {refreshOnlineStatus: ƒ, refresh: ƒ, errorChanged: ƒ, setLayout: ƒ, loadLayout: ƒ}
mountedƒ mounted()
nuxt: {…}
renderƒ render(h, props)
router: VueRouter {app: Vue, apps: Array(1), options: {…}, beforeHooks: Array(2), resolveHooks: Array(0), …}
store: Store {_committing: false, _actions: {…}, _actionSubscribers: Array(1), _mutations: {…}, _wrappedGetters: {…}, …}
vuetify: Vuetify {framework: {…}, installed: Array(7), preset: {…}, userPreset: {…}}
watch: {nuxt.err: 'errorChanged'}
[[Prototype]]: Object

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です