ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Vue.js 문법 - Provide / Inject
    Vue/Vue.js 문법 2021. 7. 18. 20:04

     

    예제 코드

     

    App.vue

    <template>
      <Parent :msg="message" />
    </template>
    <script>
    import Parent from '~/components/Parent'
    
    export default {
      components: {
        Parent
      },
      data() {
        return {
          message: 'Hello world!'
        }
      }
    }
    </script>

     

    Parent.vue

    <template>
      <Child :msg="msg" />
    </template>
    <script>
    import Child from '~/components/Child'
    export default {
    	components: {
    		Child,
    	},
    	props: {
    		msg: {
    			type: String,
    			default: ''
    		}
    	}
    }
    </script>

     

    Child.vue

    <template>
      <div>
        {{ msg }}
      </div>
    </template>
    <script>
    export default {
      props: {
        msg: {
          type: String,
          default: ''
        }
      }
    }
    </script>

     

    결과

     

    코드 이해하기

    - App.vue 파일 data() 부분 message 문자 데이터를 정의

    - 정의된 내용을 Parent.vue 파일을 거쳐서 Child.vue 에서 출력

    - props 를 이용해서 데이터를 한 단계씩 내려주고 있다

    - 이 경우에 두 컴포넌트 사이의 모든 컴포넌트에 props를 전달해야하므로 효율적이지 못하다

     

    Provide / Inject

     

    - 이러한 경우에 Provide / Inject 를 사용

    - 모든 자식에 대한 종속성 제공자 역활을 함

    - 부모 컴포넌트는 데이터 제공을 위해 Provide 옵션을 사용

    - 자식 컴포넌트는 데이터 사용을 위해 Inject 옵션을 사용

     

    App.vue

    <template>
      <Parent />
    </template>
    <script>
    import Parent from '~/components/Parent'
    
    export default {
      components: {
        Parent
      },
      data() {
        return {
          message: 'Hello world!'
        }
      },
      provide() {
        return {
          msg: this.message
        }
      }
    }
    </script>

     

    Parent.vue

    <template>
      <Child />
    </template>
    <script>
    import Child from '~/components/Child'
    export default {
    	components: {
    		Child,
    	}
    }
    </script>

     

    Child.vue

    <template>
      <div>
        {{ msg }}
      </div>
    </template>
    <script>
    export default {
      inject: ['msg']
    }
    </script>

     

    코드 이해하기

    - parent.vue 에서 데이터를 거치지 않음

    - child.vue 에서 inject 옵션을 통해서 App.vue 에 명시된 msg 데이터를 사용

     

    주의사항

    - Provide 를 사용할때는 반응성을 제공할 수 없다

    - 그렇기 때문에 간단하게 데이터를 전달해서 한번 출력하게 만들거나

    - 반응성을 유지하기 위해 추가 작업을 해야 한다

     

    provide 반응성 유지를 위한 추가 작업

     

    App.vue

    import { computed } from 'vue'
    
    /* .... 생략 .... */
    provide() {
        return {
          msg: computed(() => {
            return this.message
          })
        }
      }

     

    Child.vue

    <template>
      <div>
        Child: {{ msg.value }}
      </div>
    </template>

    'Vue > Vue.js 문법' 카테고리의 다른 글

    Vue.js 문법 - Refs  (0) 2021.07.18
    Vue.js 문법 - 컴포넌트 Slot  (0) 2021.07.18
    Vue.js 문법 - 컴포넌트 Emit  (0) 2021.07.16
    Vue.js 문법 - 컴포넌트 속성 상속  (0) 2021.07.16
    Vue.js 문법 - 컴포넌트 기초  (0) 2021.07.16

    댓글

Designed by Tistory.