Dev

[ Vue3 ] Vue3 바뀐 점 정리

_cpdm_ 2021. 9. 10. 10:35
반응형

Vue 3


핵심요약

  • Composition API가 들어오면서 데이터 선언, 함수 선언, 상태 관리 등의 변화
  • 컴포넌트 내에서 데이터, 함수, 상태를 호출하는 방식도 변화

 

 

템플릿 생성 방식의 변화

여러 개의 루트 엘리먼트

  • Vue2의 템플릿은 하나의 루트 엘리먼트만 허용하였지만,  Vue3 부터는 여러 개의 루트 엘리먼트를 갖는 컴포넌트를 지원한다. ( 불필요한 wrapper div(단지 감싸주기용의 div..같은..)가 필요없어질 것 같다. )
  • 하지만, 여러 개의 루트 엘리먼트를 사용하는 것을 권장하지는 않는다.

템플릿에서 데이터 호출 방식

  • 기존에는 props나 method 등을 구분없이 이름만으로 호출할 수 있었는데, 이제는 분리가 가능해졌다.
    <template>
    	<div>
    		{{state.xx}}
        </div>
    </template>​

 

Data, Method 작성 방식의 변화

setup 등장

  • Vue3의 가장 큰 변화라고 볼 수 있다.
  • 기존의 data, method 등의 선언이 전부 setup이라는 메소드 안으로 편입되었다.Vue 2. x Vue 3
    export default {
    props: {
    title: String
    },
    data () {
    return {
    username: '',
    password: ''
    }
    },
    methods: {
    login () {
    // login method
    }
    }
    }
    export default {
    props: {
    title: String
    },
    setup () {
    const state = reactive({
    username: '',
    password: ''
    })
    const login = () => {
    // login method
    }
    return {
    login,
    state
    }
    }
    }
    - props, data, methods 가 같은 계층에 있음 - props, setup이 같은 계층이 있음
    - data → state로 methods들은
    각각의 함수로 작성되어 한방에
    반환되도록 변화
    - state의 경우, vue reactive를 사용
    - Reactive는 Vue가 반응현 시스템을
    유지하기 위해서 사용하는 간단한 js객체
  • Vue2에서 data나 method, computed 등을 선언하게 되면 자동으로 reactive객체를 생성해주었었지만, 이 과정이 묵시적이었고 User들은 과정을 알 필요가 없었다.
  • Vue3에서 타입스크립트의 지원이나 state로의 명칭 변경, 명시적 reactive 사용 등을 보았을 때, 명시적인 선언을 지향하는 방향으로 변화한 것으로 보인다.



Lifecycle hook 호출의 변화

setup 내부에서의 lifecycle hook을 선언한다.

  • 기존에 존재하던 라이플사이클 훅의 종류는 거의 그대로 유지된다.
    import { onBeforeMount, onMounted, onBeforeUpdate, onUpdated, onBeforeUnmount, 
    onUnmounted, onActivated, onDeactivated, onErrorCaptured } from 'vue'
        
        export default {
          setup() {
            onBeforeMount(() => {
              // ... 
            })
            onMounted(() => {
              // ... 
            })
            onBeforeUpdate(() => {
              // ... 
            })
            onUpdated(() => {
              // ... 
            })
            onBeforeUnmount(() => {
              // ... 
            })
            onUnmounted(() => {
              // ... 
            })
            onActivated(() => {
              // ... 
            })
            onDeactivated(() => {
              // ... 
            })
            onErrorCaptured(() => {
              // ... 
            })
          }
        }​
  • 라이프사이클 훅은 리턴할 필요가 없다.



Computed 속성 사용의 변화

state 선언문 내에 선언 구문을 추가하는 방식

  • 기존의 Computed 속성
    export default {
          // .. 
          computed: {
            lowerCaseUsername () {
              return this.username.toLowerCase()
            }
          }
        }​
  • Vue3의 Computed 속성
    import { reactive, computed } from 'vue'
        
        export default {
          props: {
            title: String
          },
          setup () {
            const state = reactive({
              username: '',
              password: '',
              lowerCaseUsername: computed(() => state.username.toLowerCase())
            })
        
            // ...
          }



Composition API의 이해

composition API

  • 기존의 Vue는 Options API라는 것을 사용하였다(data, computed, methods 등을 사용). 이는 굉장히 직관적이지만 컴포넌트의 크기가 커졌을 때 유지보수가 굉장히 어려워지는 문제가 있었다.
  • 이런 유지보수 측면의 해결방안으로 나온 것으로 생각할 수 있다.

composition API 예제

  • 예제
    import { reactive, computed } from 'vue'
        
        export default {
          props: {
            title: String
          },
          setup () {
            const state = reactive({
              username: '',
              password: '',
              lowerCaseUsername: computed(() => state.username.toLowerCase())
            })
        
        		const changeName = (name) => {
        			state.username = name
        		}
          }​
  • Vue의 핵심 기능들을 전부 임포트하는 대신 직접 선택해서 임포트 할 수 있도록 해준다.
    import { reactive, computed } from 'vue'
  • setup 메소드는 Composition API의 핵심으로, 컴포넌트의 기능들을 조립하는 역할을 한다.
  • setup 안에 라이프사이클 훅을 걸거나 반응형 데이터 바인딩, computed 사용 등을 할 수 있다.
    export default{
        setup () {
    	}
    }​
  • 컴포넌트 내부에서 사용하기 위한 상태 값으로 data대신에 state를 선언하고 reactive obj로 초기화 한다. 
    const state = reactive({
              username: '',
              password: '',
              lowerCaseUsername: computed(() => state.username.toLowerCase())
            })​
  • 함수의 선언은 다음과 같이하며, state등을 호출할 때 this 바인딩이 필요하지 않다.
    const changeName = (name) => {
        	state.username = name
        }​
  • 마지막에 setup의 return에 포함시켜준다. return { state, changeName };
    return { 
        	state, 
        	changeName
        };

composition API의 장점

  • API로 생성한 reactive 데이터들은 템플릿에만 꼭 쓰지 않아도 되는 장점이 있다.
  • 컴포넌트와 별개로 사용할 수 있는 반응성 데이터를 생성할 수 있다.
  • 컴포넌트 옵션 속성이 존재하기 전에 setup API가 실행되므로 this로 컴포넌트를 접근할 수 없다.(대신 context를 사용한다)
    setup(props, context){
    	context.attrs
    	context.slots
    	context.parent
    	context.root
    	context.emit
    }



props와 this 바인딩의 분리

props에 접근하는 방법

  • 기존의 방법 → this.title이 props? data? methos? 모호하다.
    mounted () {
            console.log('title: ' + this.title)
        }​
  • 새로운 방법 → props를 attribute로 받아서 사용한다. 
    setup (props) {
            // ...
            onMounted(() => {
              console.log('title: ' + props.title)
            })
            // ...
        }



emit과 this 바인딩의 분리

emit 사용의 변화

  • 기존의 방법
    login () {
              this.$emit('login', {
                username: this.username,
                password: this.password
              })
         }
  • 새로운 방법
    setup (props, { emit }) {
            // ...
        
            const login = () => {
              emit('login', {
                username: state.username,
                password: state.password
              })
            }
        
            // ...
        }​

참고링크

 

Vue 3 변경점 정리: 무엇이 바뀌나요?

해당 글은 레퍼런스에 작성된 몇 개의 원문에서 중요한 내용들을 바탕으로 작성한 글입니다. Vue3 의 베타버전으로 어플리케이션을 제작해 보고 싶은 경우, 튜토리얼에 소개된 셋업을 따라 시작

velog.io


 

 

CPDM

 

choppadontbiteme.tistory.com

 

반응형