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

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

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

Vue.jsは、Webアプリケーションのインターフェースを構築するためのオープンソースJavaScriptフレームワークです。

参照

参照は、プログラミングにおいて変数や関数といったメモリ空間上での所在を指示するデータのことを指します。その中にはデータ自体は含まれず、他の場所にある情報を間接的に指示するプログラムです。

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

1回答

629閲覧

【Vue×Rails】data()内にAとBの2つの変数がある時、BからAを参照できるようにしたい

nomu_lui

総合スコア11

Vue.js

Vue.jsは、Webアプリケーションのインターフェースを構築するためのオープンソースJavaScriptフレームワークです。

参照

参照は、プログラミングにおいて変数や関数といったメモリ空間上での所在を指示するデータのことを指します。その中にはデータ自体は含まれず、他の場所にある情報を間接的に指示するプログラムです。

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2021/05/20 22:03

前提・実現したいこと

(B)answersの配列の中で、(A)questionnaireに格納された値を参照したいです。

questionnaire格納されている値は下記の画像の通りで、answersにはquestionnaire_choicesを入れたいです。

なにかご存知の方がいらっしゃいましたら、アドバイスを頂けますと幸いです。
宜しくお願いいたします。

Vue

1data() { 2 return { 3 questionnaire: "", 4 answers: [ 5 {}, 6 {}, 7 {} 8 ] 9 } 10}

イメージ説明

発生している問題・エラーメッセージ

questionnaire_choicesが定義されていない

Error in data(): "TypeError: Cannot read property 'questionnaire_choices' of undefined"

該当のソースコード

Vue

1 data() { 2 return { 3 questionnaire: "", 4 options: { 5 answers: [ 6 { 7 value: this.questionnaire.questionnaire_choices[0].id, 8 text: this.questionnaire.questionnaire_choices[0].choice, 9 votes: this.questionnaire.questionnaire_choices[0].answers_count, 10 }, 11 { 12 value: this.questionnaire.questionnaire_choices[1].id, 13 text: this.questionnaire.questionnaire_choices[1].choice, 14 votes: this.questionnaire.questionnaire_choices[1].answers_count, 15 }, 16 { 17 value: this.questionnaire.questionnaire_choices[2].id, 18 text: this.questionnaire.questionnaire_choices[2].choice, 19 votes: this.questionnaire.questionnaire_choices[2].answers_count, 20 }, 21 ] 22 } 23 }; 24 },

試したこと

同じdata内だとthisで取ってこようとするのがいけないのか?と思い、thisを抜いてみましたが、参照できませんでした。

また、template内では、下記のようにすることで正しくquestionnaire内の値を参照できています。

Vue

1<template> 2 性別:{{ questionnaire.gender }} 3</template>

補足情報(FW/ツールのバージョンなど)

questionnaireにはaxiosでRailsから取ってきたデータを格納しています。

this.$axios .get(`http://localhost:3000/api/v1/questionnaires/${this.$route.params.id}`) .then((res) => { this.$data.questionnaire = res.data; })

Rails 6.0.3.6
Vue 2.6.12

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

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

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

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

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

guest

回答1

0

ベストアンサー

Vueの記述ルール上、そこは変数定義部分なので、thisは使えません(thisはあくまでdata()で定義した変数を外側に返すためのものです)。

なので、最初に変数に値を突っ込みたい場合はライフサイクルフックで値を代入して準備すればどうでしょうか。

この場合はDOM生成後前で問題ないと思うのでcreatedプロパティが妥当でしょう。

動くかは確かめてません

vue

1data(){ 2 return{ 3 answers:[ 4 {value:'',text:'',votes:''} 5 ], 6 questionnarie: //省略 7 } 8}, 9created:function(){ 10 let answers = this.answers 11 let questionnarie = this.questionnarie 12 for(let i = 0, i < questionnarie.length; i++){ 13 answers[i].value = questionnaire.questionnaire_choices[i].id 14 answers[i].text = questionnaire.questionnaire_choices[i].choice 15 answers[i].votes = questionnaire.questionnaire_choices[i].answers_count, 16 } 17 this.answers = answers //代入した値を返す 18 },

こんな感じで値を準備していきます。

投稿2021/05/21 05:33

編集2021/05/21 05:44
FKM

総合スコア3647

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

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

nomu_lui

2021/05/22 04:27 編集

ご回答いただきありがとうございます! ``` data() { return { questionnaire: "", options: { question: "", answers: [ {value:'',text:'',votes:''} ] } }; }, created() { let answers = this.options.answers; let questionnarie = this.questionnarie; for(let i = 0; i < 2; i++){ answers[i].value = this.questionnaire.questionnaire_choices[i].id, answers[i].text = this.questionnaire.questionnaire_choices[i].choice, answers[i].votes = this.questionnaire.questionnaire_choices[i].answers_count } }, ``` こうすると、下記のようにquestionnaire_choicesの下の階層を読み込んでくれない(インデックスの指定ができない)のですが、なにかお分かりになりますでしょうか? `Error in created hook: "TypeError: Cannot read property '0' of undefined"`
FKM

2021/05/23 00:06

一度 letで代入した後thisは不要です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問