음악, 삶, 개발

컴포넌트 instance 를 런타임에서 추가 또는 제거하기 : v-for 와 데이터 본문

개발 Web/Vue.js 공부방

컴포넌트 instance 를 런타임에서 추가 또는 제거하기 : v-for 와 데이터

Lee_____ 2020. 11. 30. 00:32

Vue 에서 개발할때는 언제나 데이터 중심으로 사고하여야한다.

DOM 을 직접적으로 컨트롤할 생각을 하는게 아니라,

데이터가 변경되면 DOM 을 Vue 가 랜더링해주기때문이다.

따라서 데이터를 추가하거나, 제거하고,

v-for 를 이용해, 현재 데이터를 랜더링하는쪽으로 코드를 짜야한다.


< 예제 >

<!-- Child.vue -->

<template>
    
    <li>{{Math.random()}}</li>

</template>
<!-- App.vue -->

<template>
  
  <button @mousedown="add">add</button>
  <button @mousedown="remove">remove</button>

  <Child

    v-for ="i in childAmount" 
    :key  ="i"

  />

</template>

<script>

  import Child from './Child.vue'
  import { ref } from 'vue'

  export default {
    
    setup() {

      const childAmount = ref(1)

      function add()    { childAmount.value++ }
      function remove() { if (childAmount.value > 1) childAmount.value-- }

      return { Child, childAmount, add, remove }

    }

  }

</script>


< 예제 w Vuex >

 

/* store.js */

import { createStore } from 'vuex'

const state = {

    childAmount : 0

}

const mutations = {

    add(state)       { state.childAmount++ },
    remove(state)    { if (state.childAmount > 0) state.childAmount-- }

}

const store = createStore({ 
    
    state : state,
    mutations : mutations

})

export default store
/* main.js */

import { createApp } from 'vue'
import store from './store/store.js'
import App from './components/App.vue'

const app = createApp(App)

app.use(store)
app.mount('#app')
<!-- Child.vue -->

<template>
    
    <li>{{Math.random()}}</li>

</template>
<!-- App.vue -->

<template>
  
  <button @mousedown="store.commit('add')">add</button>
  <button @mousedown="store.commit('remove')">remove</button>

  <Child

    v-for ="i in store.state.childAmount" 
    :key  ="i"

  />

</template>

<script>

  import { useStore } from 'vuex'
  import Child from './Child.vue'

  export default {
    
    setup() {

      const store = useStore()

      return { Child, store }

    }

  }

</script>