質問するログイン新規登録
Vue.js

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

Q&A

解決済

2回答

2565閲覧

Vue.jsでcomponentを使用したtemplateの切り替え方法

esp_horizon

総合スコア1

Vue.js

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

0グッド

0クリップ

投稿2020/10/14 09:00

0

0

前提・実現したいこと

Vue.jsを始めたばかりです。
Vue.jsでコンポーネントでのテンプレートの切り替えを動的にしたいと考えています。
初期表示では親コンポーネントには子コンポーネント1が表示されており、ボタンを押す事で子コンポーネント2を表示したいと思っていますが、これはどのように行えば実装できますか?
子コンポーネント1でボタンを押下し、alertの関数までは出来ており、propsを使う事で解決しような気はするのですが、そこからどのようにしていいかわからないので質問させて頂きました。

該当のソースコード

Vue.js ・parent.vue(基となる親コンポーネント) <template> <component :is="componentView"></component> </template> <script> import component1 from '@/components/component1'; export default { components: { component1 }, data() { return { componentView: 'component1' } } }; </script> ・component1.vue(初期表示で表示されている子コンポーネント1) <template> <h1>コンポーネント1</h1> <button v-on:click="changeView()">test</button> </template> <script> import component2 from '@/components/component2'; export default { components: { component2 }, methods: { changeView: function() { alert('click'); } } }; </script> ・component2.vue(子コンポーネント1のbuttonを押下したchangeViewメソッドでこのコンポーネント2に切り替えをしたい) <template> <h1>コンポーネント2</h1> </template>

試したこと

子コンポーネント1に props:を使ってみたが上手くいかなかった

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

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

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

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

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

guest

回答2

0

ベストアンサー

1

propsのデータの流れは単方向なのです。
参考

codepen

2

propsのデータの流れは複雑すぎるの際、vuexを使うの方がいいと思います。

投稿2020/10/14 12:00

wyq2020

総合スコア67

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

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

esp_horizon

2020/10/15 08:19

ご返信ありがとうございます。 component1のmethod内でthis.$emit('update:componentName', 'component2')でcomponent2の画面に更新していると思うのですが、これを他のファイルで行う場合にはどうすればいいでしょうか? というのも単一ファイルコンポーネントで別々のファイルになってまして、基のapp.vueにcomponentsというフォルダ配下にあるcomponent1からcomponent2を渡したいと思っています。 ですので、this.$emit('update:componentName', 'component2')だと渡せていない状態になります。 試しにconsole.logでcomponent2を出力したらオブジェクトが表示されておりましたので、後は渡すだけと思っております。 頂いた回答を元にしてこのようになっております。 また:component-name.syncとはどのように使うのでしょうか? ・App.vue <template> <div id="app"> <div> <component :is="componentName" :component-name.sync="componentName"/> </div> </div> </template> <script> import component1 from '@/components/component1'; export default { components: { component1 }, data() { return { componentView: 'component1' } } }; </script> ・components/component1.vue <template> <h1>コンポーネント1</h1> <button v-on:click="changeView()">test</button> </template> <script> import component2 from '@/components/component2'; export default { props: ['componentName'], components: { component2 }, methods: { changeView() { this.$emit('update:componentName', 'component2') console.log(component2); } } }; </script> ・components/component2.vue <template> <h1>コンポーネント2</h1> </template>
guest

0

下記の実装でいけるかと思います。
お試しください。

vue

1<template> 2 <component :is='componentView' /> 3 <button @click='changeView'>change</button> 4</template> 5 6<script> 7 import component1 from '@/components/component1'; 8 import component2 from '@/components/component2'; 9 10 export default { 11 components: { 12 component1, 13 component2, 14 }, 15 data: () => ({ 16 componentView: component1, 17 }), 18 methods: { 19 changeView () { 20 this.componentView = component2 21 } 22 } 23 } 24</script>

投稿2020/10/14 11:53

stakizawa

総合スコア117

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.30%

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

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

質問する

関連した質問