質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
Nuxt.js

Nuxt.jsは、ユニバーサルなSPAが開発可能なVue.jsベースのフレームワーク。UIの描画サポートに特化しており、SSRにおけるサーバーサイドとクライアントサイドのUIレンダリングなどさまざまな機能を持ちます。

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Q&A

解決済

1回答

1269閲覧

Nuxt.jsで内部JSONファイルを読み込みたいがエラーが出る

ttkun

総合スコア30

Nuxt.js

Nuxt.jsは、ユニバーサルなSPAが開発可能なVue.jsベースのフレームワーク。UIの描画サポートに特化しており、SSRにおけるサーバーサイドとクライアントサイドのUIレンダリングなどさまざまな機能を持ちます。

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

0グッド

0クリップ

投稿2020/03/04 01:04

編集2020/03/04 13:23

Nuxt内にjsonファイルを読み込ませたい、またそのデータをいろんなところで使いたいと思い下記のリンクを参考に作成してみました。

Nuxt.js(v2)で静的なJSONファイルを読み込み、いろんな所で使う。

ほぼ書き方は同じですが
store/json.js

import jsonData from '~/assets/json/menu.json' // 状態管理 export const state = () => ({ data: jsonData, }) // getters export const getters = { getAll: (state) => { // return state.json return state.data } }

componentes/Headers.vue

<template> <pre>{{ jsonAll }}</pre> </template> <script> export default { asyncData ({ store }) { // jsonAll: store.getters['json/getAll'] const jsonAll = store.getters['json/getAll'] return { jsonAll } } } </script>

エラーが表示されます。
イメージ説明

client.js?06a0:43 [Vue warn]: Property or method "jsonAll" is not defined on the instance but referenced during render. Make sure that this property is reactive, either in the data option, or for class-based components, by initializing the property. See: https://vuejs.org/v2/guide/reactivity.html#Declaring-Reactive-Properties. found in ---> <Headders> at components/Headders.vue <VApp> <Layouts/default.vue> at layouts/default.vue <Root>

同じファイルで別の方法を試すも

<template> <pre>{{ getAll() }}</pre> </template> <script> import { mapGetters } from 'vuex' export default { methods: { ...mapGetters({ getAll: 'json/getAll' }) } } </script>

イメージ説明

unknown getter: json/getAll

pages/index.vueにdataとして保存するやりかたなどが必要なのでしょうか?
いずれもすんなり行かず。

試してみたほうがいい方法や、他に必要な情報等がありましたが追記しましすのでご回答よろしくお願いします。

環境
Nuxt + Vuetify

イメージ説明

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

2カ所ほど問題と考えられる箇所がありましたのでご確認ください。

  1. stateに定義するプロパティ名はdataなので、getAllメソッドで参照するプロパティ名はstete.dataとなります。

javascript

1import jsonData from '~/assets/json/menu.json' 2 3// 状態管理 4export const state = () => ({ 5 data: jsonData, 6}) 7 8// getters 9export const getters = { 10 getAll: (state) => { 11 // return state.json 12 return state.data 13 } 14}
  1. asyncDataメソッドで返すオブジェクトがコンポーネントデータとマージされるので、returnで返す必要があります。

javascript

1<script> 2export default { 3 asyncData ({ store }) { 4 // jsonAll: store.getters['json/getAll'] 5 const jsonAll = store.getters['json/getAll'] 6 return { jsonAll } 7 } 8} 9</script>

なお、今回の事例で言えばasyncDataメソッドを使う必要性はないと考えています。
例えば、以下の方法でvuexで管理するjsonデータを参照できます。

javascript

1<template> 2<pre>{{ getAll() }}</pre> 3</template> 4 5<script> 6import { mapGetters } from 'vuex' 7 8export default { 9 methods: { 10 ...mapGetters({ getAll: 'json/getAll' }) 11 } 12} 13</script>

2020/03/05 追記

うまくいかなかった点について

  1. asyncDataメソッドが実行されない

下記に引用した通りasyncDataメソッドはページコンポーネントでしか利用できません。

API: asyncData メソッド

asyncData はコンポーネント(ページコンポーネントに限ります)がロードされる前に毎回呼び出されます。

  1. index.jsではなくjson.js

下記に引用した通りVuexには従来のクラシックモード (廃止予定)と、モジュールモードがあります。

Vuex ストア

モジュールモード: store ディレクトリ内のすべての *.js ファイルが 名前空間付きモジュール に変換されます(index はルートモジュールとして存在します)

投稿2020/03/04 09:37

編集2020/03/05 11:57
rubytomato

総合スコア1752

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ttkun

2020/03/04 12:45

ご回答ありがとうございました。試してみた結果を追記しました。 相変わらずエラーです。他にのせておいたほうがよい情報がありましたら書き込みます。
rubytomato

2020/03/04 12:58

現時点での最新のソースコードとそのファイル名が分かるように質問内容を編集してください。 また、ソースファイルがどのディレクトリにあるのか、ディレクトリとファイルの配置(つまりプロジェクトの全体像)が分かる情報を記載ください(全体がわかるのであればスクリーンショットでも構いません)。
ttkun

2020/03/04 13:24

ソースを更新、ディレクトリからファイル名を追加しました。 ファイル構成はスクショをつけました。
rubytomato

2020/03/04 13:31

store/json.js ということですが、スクリーンショットを見るとstore/index.jsのようです。 もしそうであれば、index.jsをjson.jsにリネームしてください。
ttkun

2020/03/05 05:45

json.jsに変更したらうまくいきました。ありがとうございます。
rubytomato

2020/03/05 11:57

解決できたようでよかったです。 うまくいかなかった点について補足致しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問