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

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

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

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

0回答

1333閲覧

【Vue.js】サーバーから取得したデータを子コンポーネントに反映させたい

smilax

総合スコア23

Vue.js

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2020/10/19 04:59

サーバーから取得したデータを子コンポーネントにpropsで渡してデータを表示したいのですが、サーバーからデータを取得する前に描写されてしまうため、値が反映されません。

解決策として、 refs属性を使って親から子のメソッドを実行するようにしたのですが、うまく機能しません。
この方法でなくてもいいので、何かあれば教えていただきたいです。

Birthdayが該当のコンポーネントです

親コンポーネント

vue.js

1<template lang="pug"> 2 .application 3 .contents-application.contents-box 4 h1.title-application.txt.txt-headline {{ talentName }} 5 ValidationObserver( ref="form") 6 form.form-app(@submit.prevent="onSubmit") 7 h1.medium-title-application.txt.txt-medium 申込者の情報 8 Birthday( 9 ref="birthday" 10 :maxAge="70" 11 :minAge="12" 12 @year="putBirthdayYear" 13 @month="putBirthdayMonth" 14 @day="putBirthdayDay" 15 :inputedYear="birthdayYear" 16 :inputedMonth="birthMonth" 17 :inputedDay="birthday" 18 ) 19</template> 20 21<script lang="ts"> 22import Vue from "vue"; 23import Header from "@/components/Header.vue"; 24import Footer from "@/components/Footer.vue"; 25import TextInput from "@/components/TextInput.vue"; 26import RoundRectButton from "@/components/RoundRectButton.vue"; 27import Gender from "./components/Gender.vue"; 28import Birthday from "./components/Birthday.vue"; 29export type DataType = { 30 birthdayYear: number; 31 birthdayMonth: number; 32 birthdayDay: number; 33}; 34export default Vue.extend({ 35 name: "Application", 36 components: { 37 Header, 38 Footer, 39 TextInput, 40 Gender, 41 Birthday, 42 RoundRectButton, 43 ValidationObserver, 44 ValidationProvider, 45 }, 46 data(): DataType { 47 return { 48 birthdayYear: 0, 49 birthdayMonth: 0, 50 birthdayDay: 0, 51 52 }; 53 }, 54 // ビルド時に前回の入力値が入るようにgetRequestを呼び出す。 55 created() { 56 this.getRequest(); 57 this.refs.birthday.setBirthday(); 58 }, 59 computed: { 60 // TypeScriptだと読み込めないため実行 61 refs(): any { 62 return this.$refs; 63 }, 64 }, 65 methods: { 66 async getRequest() { 67 const r = await this.$repositories.RequestDraftRepository.getRequestDraft(); 68 this.birthdayYear = r.birthdayYear; 69 this.birthdayMonth = r.birthdayMonth; 70 this.birthdayDay = r.birthdayDay; 71 72 }, 73 }, 74}); 75</script> 76
<template lang="pug"> .birthday .title-birthday.txt 生年月日 .box-birthday ValidationProvider(name="year" rules="required|validateBirthday:@month,@day" v-slot="{ errors }") select.year-box(v-model="year" @change="$emit('year', year)") option(v-for="y in getYears" :value="y") {{ y }} p.error {{ errors[0] }} .year-birthday.txt.txt-detail 年 ValidationProvider.vali(name="month" rules="required" v-slot="{ errors }") select.month-box(name="month" v-model="month" @change="$emit('month', month)" key="input-eamli") option(disabled value='') -- option(v-for="m in getMonths" :value="m") {{ m }} //- option {{ selectMonth }} .month-birthday.txt.txt-detail 月 ValidationProvider(name="day" rules="required" v-slot="{ errors }") select.day-box(name="day" v-model="day" @change="$emit('day', day)") option(disabled value='') -- option(v-for="d in getDays" :value="d") {{ d }} .day-birthday.txt.txt-detail 日 //- p.error(v-if="errors[0]") 正しく入力してください </template> <script lang="ts"> import Vue, { PropType } from "vue"; import { extend, ValidationProvider } from "vee-validate"; import { required } from "vee-validate/dist/rules"; extend("required", required); const birthdayRule = { params: ["month", "day"], message: "生年月日が正しく入力されていません", validate(value: string, { month, day }: any) { if (value != "" && month != "" && day != "") { return true; } return false; }, }; extend("validateBirthday", birthdayRule); export type DataType = { year: number; month: string | number; day: string | number; msg: string; }; export default Vue.extend({ name: "Birthday", data(): DataType { return { year: 1980, month: "", day: "", msg: "", }; }, components: { ValidationProvider, }, methods: { setBirthday() { console.log("しっぱい"); this.year = this.inputedYear; this.month = this.inputedMonth; this.day = this.inputedDay; console.log(this.day); }, }, props: { maxAge: { type: Number as PropType<number>, required: true, }, minAge: { type: Number as PropType<number>, required: true, }, inputedYear: { type: Number as PropType<number>, required: true, }, inputedMonth: { type: Number as PropType<number>, required: true, }, inputedDay: { type: Number as PropType<number>, required: true, }, }, }); </script>

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

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

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

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問