🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Vue.js

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

Q&A

解決済

1回答

574閲覧

【Vue.js3】コンポーネントの使用方法

oden141

総合スコア2

Vue.js

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

0グッド

0クリップ

投稿2021/03/07 10:40

編集2021/03/07 10:46

質問内容

Vue.js3の勉強をしていて、サンプルコードでわからないことがあったので質問させてください。

propsで用意した配列の要素を、テンプレートにはめ込んで、
コンポーネントとして使用するサンプルなのですが、

htmlで、作成したコンポーネントを複数使用する場合、

<div>で括らないと、1つ目のコンポーネントしか表示されなくなります。 <div>で括ると、複数のコンポーネントが読み込まれ、表示できるのですが、 なぜこのような差が出るのかがわからないです。

propsに入れるときに、コンポーネントで指定した引数が配列に入っていると考えると、
htmlにコンポーネントを記載する度に上書きされて、

<div>で括らずとも、問題なく表示できそうな気がするのですが、、
  • app.component() が実行されるタイミング?
  • <div>で括ることで、別のタグとして判断できるようになる?
  • コンポーネントは連続で使用できない?

等のルールがあるのか、と思い調べてみたのですが、わかりませんでした。
なぜ<div>で括らないとコンポーネントを複数使用できないのか、
ご存知の方がいたらご教授願いたいです。

よろしくお願いいたします。

該当のソースコード

<index.html>

html

1<!DOCTYPE html> 2<html> 3 <head> 4 <meta charset="utf-8"/> 5 <title>My first Vue app</title> 6 <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/css/bootstrap.min.css" > 7 <script src="https://code.jquery.com/jquery-3.5.1.slim.min.js"></script> 8 <script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.0/dist/umd/popper.min.js"></script> 9 <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/js/bootstrap.min.js"></script> 10 <script src="https://unpkg.com/vue@next"></script> 11 </head> 12 13 <body> 14 <h1 class="bg-secondary text-white display-4 px-3">Vue3</h1> 15 16 <div id="app" class="container"> 17 <p>{{ message }}</p> 18 <div> 19 <hello name="Taro" /> 20 </div> 21 <div> 22 <hello name="Hanako" /> 23 </div> 24 </div> 25 26 <script> 27 const appData = { 28 data() { 29 return { 30 message: '※コンポーネントを表示する。' 31 } 32 } 33 } 34 35 let app = Vue.createApp(appData) 36 37 app.component('hello', { 38 props: ['name'], 39 data() { 40 return { 41 message: 'これは新しいメッセージです。' 42 } 43 }, 44 template: '<p class="alert alert-primary"> Hello, {{ name }}! </p>' 45 }) 46 47 app.mount('#app') 48 </script> 49 </body> 50</html>

発生している問題

html

1<div id="app" class="container"> 2 <p>{{ message }}</p> 3 <hello name="Taro" /> 4 <hello name="Hanako" /> 5</div>

このようにコードを直した場合、Taroしか表示されません。
なぜ<div>で括らないと複数使用できないのかが、わからないです。

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

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

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

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

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

guest

回答1

0

ベストアンサー

<div>で括らないと、1つ目のコンポーネントしか表示されなくなります。

多分エラーに出力されていると思うんですが(たぶん Component template should contain exactly one root element と。)

この言葉が指し示す通りルート(一番上)には1つの要素しか置けません。
まずはエラーログを確認しましょう(ブラウザのコンソール、エディタIDEの画面、ターミナル等)

投稿2021/03/07 11:01

mikkame

総合スコア5036

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

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

oden141

2021/03/07 12:54

@mikkameさん ご確認いただきありがとうございました。 教えてくださったエラーを調べたところ、 「コンポーネントにはHTML親要素が必要」というルールがあるのだと理解できました。 検証ツールを使用しConsoleを確認していたのですが、 特にエラーも出ていなかったので気がつけませんでした。。 Finderからindex.htmlを開いていたから、 コンソールにも特にエラーが出なかったのかな…と思いました。 早急に教えてくださり、ありがとうございました!
oden141

2021/03/07 13:16 編集

<まとめ> 「コンポーネントにはHTML親要素が必要」 「ルート(一番上)には1つの要素しか置けない」 -> コンポーネントが一つの時は、そのまま書いても問題ない。 -> 複数存在する場合は、HTML要素を使用し一つにまとめなければならない。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問