테스트 사이트 - 개발 중인 베타 버전입니다

vue.js v-for와 컴포넌트

· 6년 전 · 3040


v-for와 컴포넌트

 

v-for를 사용자 정의 컴포넌트에 직접 사용할 수 있습니다.
<my-compent v-for="item in items" :key="item.id"></my-compent>

2.2.0이상에서 v-for는 key가 필수 입니다.
그러나 컴포넌트에는 자체 범위가 분리되어 있기 때문에 컴포넌트에 데이터를 자동으로 
전달하지는 않습니다. 
반복할 데이터를 컴포넌트로 전달하려면 props도 사용해야 합니다.

<my-compoent
    v-for="(item, index) in items" 
    v-bind:item="item" 
    v-bind:index="index"
    v-bind:key="item.id"
></my-compent>

컴포넌트에 item을 자동으로 주입하지 않는 이유는 컴포넌트가 v-for의 작동방식과 밀접하게
결합되기 때문입니다. 데이터의 출처가 명확히 하면 다른 상황에서 컴포넌트를 재사용할 수 있습니다.

간단한 할일 목록 전체 예제입니다.
HTML부분
<div id="todo-list-example">
    <input 
        v-model="newTodoText" 
        v-on:keyup.enter="addNewTodo"
        placeholder="Add a todo"
    >
    <ul>
        <li 
        v-for="(todo, index) in todos" 
        v-bind:key="todo.id" 
        v-bind:title="todo.title"
        v-on:remove="todos.splice(index,1)"
        ></li>
    </ul>
</div>

is="todo-item" 속성을 보면 <li>엘리먼트는 <ul>안에서만 유효합니다.
<todo-item>과 같은 일을 하지만 잠재적인 브라우저의 구문분석 오류를 해결합니다.

JS부분
Vue.component('todo-item', {
  template: '\
    <li>\
      {{ title }}\
      <button v-on:click="$emit(\'remove\')">X</button>\
    </li>\
  ',
  props: ['title']
})

new Vue({
    el: '#todo-list-example', 
    data:{
Vue.component('todo-item', {
  template: '\
    <li>\
      {{ title }}\
      <button v-on:click="$emit(\'remove\')">X</button>\
    </li>\
  ',
  props: ['title']
})

new Vue({
  el: '#todo-list-example',
  data: {
    newTodoText: '',
    todos: [
      {
        id: 1,
        title: 'Do the dishes',
      },
      {
        id: 2,
        title: 'Take out the trash',
      },
      {
        id: 3,
        title: 'Mow the lawn'
      }
    ],
    nextTodoId: 4
    }, 
    methods:{
        addNewTodo: function(){
            this.todos.push({
                id: this.nextTodo++, 
                title: this.newTodoText
            })
            this.newTodoText = ''
        }
    }
})
 

댓글 작성

댓글을 작성하시려면 로그인이 필요합니다.

로그인하기

게시글 목록

번호 제목
3293
3292
3291
3290
3289
3288
3286
3285
3284
3282
3281
3280
3279
3278
3277
3276
3275
3274
3273
3272
3271
3270
3269
3268
3267
3266
3265
3263
3262
3261