Vue.js - Unknown custom element (vue-cli 単一ファイルコンポーネント)

18 Mar 2017

Unknown custom element

Problem

Vue.js を試してみようと、vue-cli を使って Single File Components 方式で始めてみました。

ところが、コンポーネントを入れ子にしたタイミングでエラー発生。

Unknown custom element: <Hello> - did you register the component correctly? For recursive components, make sure to provide the “name” option.

未知のカスタム要素: <Hello> ― 正しくコンポーネントを登録しましたか? 再帰的なコンポーネントの利用においては “name” オプションが提供されていることを確認してください。

もしあなたが再帰的なコンポーネントのような難しいことをしようとしていないならば、 エラーの原因は些細な記述ミスである可能性が高いです。

従来方式のおさらい

コンポーネントを *.js ファイルに記述する従来の方式であれば、下記のようにしてコンポーネントを登録します。

Vue.component(SomeCompo.name, SomeCompo);
Vue.component(AnotherCompo.name, AnotherCompo);

単一ファイルコンポーネント方式でのコンポーネント登録方法

単一ファイルコンポーネント とは SomeComponent.vue のように *.vue 拡張子のファイルで表現したコンポーネントを指します。

こちらは公式から引用した Single File Components のサンプルです。components:の箇所を改めてよく見てみると、配列ではなくオブジェクト になっているじゃありませんか。

  components: {
    OtherComponent
  }

従来のJavaScriptを知っている方なら、これはシンタックスエラーと勘違いするかもしれません。ですが、ES2015 からショートハンドで上記のように書けるようになりました。 言い換えれば、以下の通り書いたときと同じ意味になります。

  components: {
    OtherComponent: OtherComponent
  }

つまり “OtherComponent” という名前のコンポーネントとして OtherComponent を登録しています。 パスカルケース (PascalCase)で登録 したコンポーネント OtherComponent は、ケバブケース (kebab-case) other-component でテンプレート内に記述して利用します。 なので <other-component>...</other-component> とマークアップすることでコンポーネントを配置できます。

上の画像 Hello.vue のテンプレート内を見てみると other-component と書いてあり、コンポーネントを利用していることがわかります。 さらにテンプレートは Jade (現Pug) で簡潔に書ける例を提示しているため <x> </x> の形式を簡略化しています。


さて、問題は解決できたでしょうか。

お困りの際はこちらからどうぞ。暇してたらサポートします。