LoginSignup
1
3

More than 3 years have passed since last update.

vue.js コンポーネントの書き方

Last updated at Posted at 2020-09-08

Vue cliを使わないcdn版でのコンポーネントの書き方です。
いくつか書き方があり迷うので自分メモ的に投稿致します。
大きくわけてグローバル登録とローカル登録があります。

コンポーネントの書き方(グローバル登録)

コンポーネント名はHTMLタグになるもの
テンプレート名は直接HTMLタグを書くか、HTML内に記述したx-templateの対応するidを設定

//コンポーネント1
Vue.component('コンポーネント名A', {
    template: 'HTMLタグを記述、もしくはテンプレートのid',
    data: function() {
        return {
            number: 12
        }
    }
})

//コンポーネント2
Vue.component('コンポーネント名B', {
    template: 'HTMLタグを記述、もしくはテンプレートのid',
    data: function() {
        return {
            msg: 'hello!'
        }
    }
})

//HTML内で表示したいブロック
new Vue({ el: '#app' })

new Vue({ el: '#app2' })

グローバルなので#app、#app2どちらのブロックでもすべてのコンポーネント名がHTMLタグとして使用できます。

  <div id="app">
    <コンポーネント名A></コンポーネント名A>
  </div>
  <div id="app2">
    <コンポーネント名A></コンポーネント名A>
    <コンポーネント名B></コンポーネント名B>
  </div>

コンポーネントの書き方(ローカル登録) 推奨

定義したコンポーネントの定数名を、new Vue内で使いたいel:に使いたいタグ名で登録する

//コンポーネントを定義
const 定数名 = {
    template: 'HTMLタグを記述、もしくはテンプレートのid',
    data: function() {
      return {
        msg: 'キーワードを入力してください',
      }
    }
  }

new Vue({
  el: 'HTML内の使いたいブロックをCSSセレクタで記述',
  components: {
//上のelでマウントしたHTML内のブロックに
//下の 'HTMLタグ名':定数名 を使います宣言
    'search-component': Search
  }
})

[Vue warn]: Unknown custom element: - did you register the component correctly? For recursive components, make sure to provide the "name" option. - did you register the component correctly? For recursive components, make sure to provide the "name" option.

というエラーを吐かれたときはコンポート名が間違っていないか確認してください。

まとめ

基本的にローカル登録を推奨

多くの場合、グローバル登録は理想的ではありません。例えば Webpack のようなビルドシステムを利用しているときに、グローバルに登録した全てのコンポーネントは、たとえ使用しなくなっても、依然として最終ビルドに含まれてしまうことでしょう。これは、ユーザがダウンロードしなくてはならない JavaScript のファイルサイズを不要に増加させてしまいます。
このような場合に、コンポーネントを素の JavaScript オブジェクトとして定義することができます。

ローカル登録手順まとめ

  • constでコンポーネントを定義
  • templateを作成(HTML内にx-templateかコンポーネントのtemplate:に直接記述)
    ※vue cli で使える.vueファイルだとファイル毎にコンポーネントをまとめて書くやり方が使える
  • template:でテンプレートを定義(直接記述でない場合x-templateのidを指定する)
  • data、methodsなどオプションを定義
    ※dataはコンポーネント側に記述する(new Vueの方にdataを記述した場合反映されない感じ?)
  • new Vue で使いたいブロックをel:に、使いたいコンポーネントをcomponents:に
  • el:複数登録不可、components:は複数登録可能
  • components:に登録したコンポーネントだけがそのel:内で使える
1
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
3