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

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

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

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

Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Vuex

Vuexは、Vue.js アプリケーションのための状態管理ライブラリです。アプリケーション内で使用するコンポーネントのための集中データストアを提供。コンポーネント同士でデータをやり取りし、処理のフローを一貫させたり、データの見通しを良くすることができます。

Vue CLI

Vue CLIは、Vue.jsでアプリケーション開発を行うためのコマンドラインインタフェース(CLI)に基づいた開発ツールです。インタラクティブなプロジェクトの雛形や設定なしで使用できるプロトタイプの作成など、さまざまな機能が用意されています。

MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

Q&A

解決済

1回答

1115閲覧

Vuexで動的にコンポーネントを追加する方法

kawataku

総合スコア3

Vue.js

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

Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Vuex

Vuexは、Vue.js アプリケーションのための状態管理ライブラリです。アプリケーション内で使用するコンポーネントのための集中データストアを提供。コンポーネント同士でデータをやり取りし、処理のフローを一貫させたり、データの見通しを良くすることができます。

Vue CLI

Vue CLIは、Vue.jsでアプリケーション開発を行うためのコマンドラインインタフェース(CLI)に基づいた開発ツールです。インタラクティブなプロジェクトの雛形や設定なしで使用できるプロトタイプの作成など、さまざまな機能が用意されています。

MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

0グッド

0クリップ

投稿2021/06/17 04:31

前提・実現したいこと

VuexとDjangoによる旅行の日程を作成するプログラムを作成しています。
観光地を追加のボタンをクリックしたら、観光地と移動手段の入力欄が追加されるようにしたいです。

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

importしてきた子のコンポーネントをクリックされるたびに追加できるようにしたいのですが、その方法がわからない状態です。

該当のソースコード

Vue

1<template> 2 <div class="container-fluid"> 3 <div class="row d-flex justify-content-center mt-5"> 4 <div class="col-md-8 col-xl-6"> 5 <div class="row mb-5"> 6 <trip-detail v-for="item in trips" v-bind:key="item.id" v-bind="item"></trip-detail> 7 <transport v-for="tran in trans" v-bind:key="tran.id" v-bind="tran"></transport> 8 <trip-detail v-for="item in trips" v-bind:key="item.id" v-bind="item"></trip-detail> 9 </div> 10 <button class="btn btn-outline-success" type="button">観光地を追加</button> 11 </div> 12 </div> 13 </div> 14</template> 15 16<script> 17import TripDetail from '../components/TripDetail.vue' 18import Transport from '../components/Trans.vue' 19 20export default { 21 data(){ 22 return { 23 trips: [ 24 {id: 1, name: 'spot', placeholder: '観光地'}, 25 {id: 2, name: 'hours', placeholder: '滞在時間'}, 26 {id: 3, name: 'money', placeholder: '料金'}, 27 ], 28 trans: [ 29 {id: 1, name: 'howTo', placeholder: '移動手段'}, 30 {id: 2, name: 'howLong', placeholder: '所要時間'}, 31 {id: 3, name: 'fee', placeholder: '料金'}, 32 ], 33 } 34 }, 35 components: { 36 'trip-detail': TripDetail, 37 'transport': Transport, 38 }, 39} 40</script>

Vue

1<template> 2 <div class="col-4"> 3 <input type="text" class="form-control" v-bind:name="name" v-bind:placeholder="placeholder"> 4 </div> 5</template> 6 7<script> 8 9export default { 10 props: { 11 'name': String, 12 'placeholder': String, 13 }, 14} 15</script>

Vue

1<template> 2 <div class="col-3 mt-3 mb-3"> 3 <input type="text" class="form-control" v-bind:name="name" v-bind:placeholder="placeholder"> 4 </div> 5</template> 6 7<script> 8export default { 9 props: { 10 'name': String, 11 'placeholder': String, 12 } 13} 14</script>

試したこと

buttonにv-onを記述して、methodsなどで追加するのが良いのかと思っておりますが、この方法もやり方がわからない状態です。

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

以下のような追加の方法を行いたいです。
イメージ説明

vue.js 2.x
vue/cli 4.5.13
Visual Studio Code v1.53.2
MacOS Darwin x64 20.3.0

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

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

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

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

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

guest

回答1

0

自己解決

なんとかボタンをクリックしたら、importしてきたコンポーネントを追加する方法を知ることができました。
StackOverFlowのDynamically adding different components in Vueに書いてあったのを使わせてもらいました。

StackOverFlowの方では複数回ボタンをクリックしてもコンポーネントを追加できるのですが、自分の方では一回しかコンポーネントを追加することができませんでした。

一応こちらにやり方を載せておきたいと思います。

Vue

1<template> 2 <div class="container-fluid"> 3 <div class="row d-flex justify-content-center mt-5"> 4 <div class="col-md-8 col-xl-6"> 5 <div class="row mb-5"> 6 <trip-detail v-for="item in trips" v-bind:key="item.id" v-bind="item"></trip-detail> 7 <transport v-for="tran in trans" v-bind:key="tran.id" v-bind="tran"></transport> 8 <component v-for="field in fields" v-bind:is="field.type" v-bind:key="field.id"></component> 9 </div> 10 <button class="btn btn-outline-success" v-on:click="addTransport()" type="button">観光地を追加</button> 11 </div> 12 </div> 13 </div> 14</template> 15 16<script> 17import TripDetail from '../components/TripDetail.vue' 18import Transport from '../components/Trans.vue' 19 20export default { 21 data(){ 22 return { 23 trips: [ 24 {id: 1, name: 'spot', placeholder: '観光地'}, 25 {id: 2, name: 'hours', placeholder: '滞在時間'}, 26 {id: 3, name: 'money', placeholder: '料金'}, 27 ], 28 fileds: [], 29 count: 0, 30 } 31 }, 32 components: { 33 'trip-detail': TripDetail, 34 'transport': Transport, 35 }, 36 methods: { 37 addTransport: function(type){ 38 this.fileds.push({ 39 type: type, 40 id: this.count++ 41 }) 42 } 43 } 44} 45</script>

TripDetail

1<template> 2 <div class="col-4"> 3 <input type="text" class="form-control" v-bind:name="name" v-bind:placeholder="placeholder"> 4 </div> 5</template> 6 7<script> 8 9export default { 10 props: { 11 'name': String, 12 'placeholder': String, 13 }, 14} 15</script>

Trans

1<template> 2 div class="row"> 3 <div class="col-3 mt-3 mb-3"> 4 <input type="text" class="form-control" name="howTo" placeholder='移動手段'> 5 </div> 6 <div class="col-3 mt-3 mb-3"> 7 <input type="text" class="form-control" name="howLong" placeholder='所要時間'> 8 </div> 9 <div class="col-3 mt-3 mb-3"> 10 <input type="text" class="form-control" name="fee" placeholder='料金'> 11 </div> 12 </div> 13 <div class="row"> 14 <div class="col-4"> 15 <input type="text" class="form-control" name="spot" placeholder='観光地'> 16 </div> 17 <div class="col-4"> 18 <input type="text" class="form-control" name="hours" placeholder='滞在時間'> 19 </div> 20 <div class="col-4"> 21 <input type="text" class="form-control" name="money" placeholder='料金'> 22 </div> 23 </div> 24</template>

投稿2021/06/24 06:08

kawataku

総合スコア3

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問