LoginSignup
3
2

More than 5 years have passed since last update.

Vue.jsのコンポーネントがわからなかったからこう理解した

Posted at

Abstract

Vue.jsの公式ドキュメントは非常にわかりやすいのですが、それでもコンポーネントの理解ができなかったので自分なりにこう理解したというメモです。

そしてこの記事を書いている時には理解ができているので
なんでこんな事で悩んだんだろうという気持ちです。

公式の説明

公式ドキュメントより

<div id="app-7">
  <ol>
    <!-- 
      各 todo-item の内容を表す todo オブジェクトを与えます。
      これにより内容は動的に変化します。
      また後述する "key" を各コンポーネントに提供する必要があります。
    -->
    <todo-item v-for="item in groceryList" v-bind:todo="item"></todo-item>
  </ol>
</div>
Vue.component('todo-item', {
  props: ['todo'],
  template: '<li>{{ todo.text }}</li>'
})

var app7 = new Vue({
  el: '#app-7',
  data: {
    groceryList: [
      { id: 0, text: 'Vegetables' },
      { id: 1, text: 'Cheese' },
      { id: 2, text: 'Whatever else humans are supposed to eat' }
    ]
  }
})

何がわからなかったか

    <todo-item v-for="item in groceryList" v-bind:todo="item"></todo-item>

この一文です。

v-for:item in groceryList

これを書けばループになるので

v-bind:todo="item"

は不要なのではと思ったのです。
今考えるとほんと何なのか。

こう考えた

こういう流れで分解されているのではと考えました

1

最初の状態

<div id="app-7">
  <ol>
    <todo-item v-bind:todo="item" v-for="item in groceryList"></todo-item>
  </ol>
</div>

2

まずtodo-itemが指定したtemplateの中身に置換される

<div id="app-7">
  <ol>
    // v-bind:todo="item" v-for="item in groceryList"
    <li>{{ todo.text }}</li>
  </ol>
</div>

3

残ったプロパティのループが上にきて
その下にtodoにitemをバインドする
ループも閉じられている

<div id="app-7">
  <ol>
    // v-for="item in groceryList"
    // v-bind:todo="item"
    <li>{{ todo.text }}</li>
    // end for
  </ol>
</div>

4

完成

<div id="app">
  <ol>
    <li>Vegetables</li>
    <li>Cheese</li>
    <li>Whatever else humans are supposed to eat</li>
  </ol>
</div>

理解できた気がする

この先さらにこのポーネントを活用していく事になると思いますが
この度の考え方を利用して、精進していこうと思います。

3
2
2

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
3
2