setup

  • 새로운 옵션
  • 컴포넌트 안에서 composition api 사용하는 진입점

호출 시점

  • 컴포넌트 instance가 생성될때 props 초기화 이후
  • beforeCreate 훅 이전에 호출
  • object 반환
  • object 속성은 컴포넌트 템플릿에서 사용된다
<template>
  <div>{{ count }} {{ object.foo }}</div>
</template>

<script>
  import { ref, reactive } from 'vue'

  export default {
    setup() {
      const count = ref(0)
      const object = reactive({ foo: 'bar' })

      // expose to template
      return {
        count,
        object
      }
    }
  }
</script>

setup을 통해서 반환되는 refs는 자동적으로 템플릿 접근 시 감싸있지 않다. 그래서 .value를 사용할 필요가 없다

  • setup은 render 함수를 반환 할 수 있음

    같은 범주에 선언되어 있는 reative state를 바로 접근 할 수 있게 해줌

import { h, ref, reactive } from 'vue'

export default {
  setup() {
    const count = ref(0)
    const object = reactive({ foo: 'bar' })

    return () => h('div', [count.value, object.foo])
  }
  • aruguments

    • props의 첫번째 인자를 함수에서 받음

        export default {
          props: {
            name: String
          },
          setup(props) {
            console.log(props.name)
          }
        }
    • props 객체는 반응성임

      watchEffect, watch로 새로운 props가 전달될 때 확인할 수 있음

        export default {
          props: {
            name: String
          },
          setup(props) {
            watchEffect(() => {
              console.log(`name is: ` + props.name)
            })
          }
        }

      props객체를 해체를 하면 반응성을 잃음

        export default {
          props: {
            name: String
          },
          setup({ name }) {
            watchEffect(() => {
              console.log(`name is: ` + name) // Will not be reactive!
            })
          }
        }

      props객체는 개발하는 동안 불변

      만약, 사용자 코드를 변경하려고 시도하면 경고함

      setup의 두번째 인자는 context 객체(vue2와 this처럼 ) 제공

        const MyComponent = {
          setup(props, context) {
            context.attrs
            context.slots
            context.emit
          }
        }

      attrs와 slots는 내부 구성요소의 proxy

      이를 통해 항상 최근 값을 노출하고 오래된 참조에 접근 하지 않고도 값을 구조화 할 수 있음

        const MyComponent = {
          setup(props, { attrs }) {
            // 최근 상테를 가져옴
            function onClick() {
              console.log(attrs.foo) // 가장 최근 참조 보장
            }
          }
        }
  • this

    setup()에서는 사용 불가

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

[vue3] Reactivity Utilities  (0) 2020.09.30
[vue3] composition API  (0) 2020.09.30
[vue3] Reactivity APIs  (0) 2020.07.02
[vue3] vue 2 > vue3  (0) 2020.07.02

사용해야하는 이유

  • 큰 컴포넌트의 가독성을 높임
  • 뷰 2는 코드 재사용시 약점 있음
  • typescript 지원 제한

가독성 문제점

vue2 문제점

  • 검색창을 만드는 경우 vue2는 같은 정보를 여러 곳에 추가해야 함
  • components, props, data, computed, methods, lifecycle methods ⇒ 6개의 옵션이 있음
  • 아주 복잡함 !!! 한번에 두면 더 읽기 쉬울 것 같음
export default{
    data() {
        // search data
        // sorting 
    }
    methods:{
        // search data
        // sorting
    }
}

vue 3 해결책

  • composition api 를 통해 새로운 구문을 만듦
  • 단, 문제점이 있음
    • setup 에 다 넣는 경우 setup이 길어 질수 있음
export default {
    setup() {
        // search data
        // sorting
    }
}
  • 해결책
export default {
    setup() {
        return { ...useSearch(), ...useSorting() }
    }
}
function useSearch() {
    // search data
}
function useSorting() {
    // sorting
}

컴포넌트 재사용의 문제점

vue 2 문제점- mixins

단점

  • 변수명 충돌 가능
  • 관계가 명확하지 않음
  • 재사용 하기 어려움
const productSearchMixin = {
    data () {
        return {
                // search data
        }
    },
    methods: {
        // search func
    }
}

const resultSortMixin = {
    data() {
        return {
            // sorting data
        }
    },
    methods: {
        // sorting func
    }
}
export default {
    mixins: [productSearchMixin, resultSortMixin]
}

vue3 해결책

  • 각각의 함수는 수정 가능한 mixins을 반환

장점

  • 재사용 용이
  • 관계가 분명해짐

단점

  • 명확한 이름을 지정해 줘야함
  • 복잡한 porperty 추가시 mixin 어떤 porperty가 보여지는지 알아야함
// mixins/factories/search.js
export default function searchMixinFactory({...}) {
    // search function
}
//  mixins/factories/sorting.js
export default function sortingMixinFactory({...}) {
    // sorting function
}
// search.vue
// 이 파일에서 위의 두개의 파일로 각각의 설정들을 보냄
import searchMixinFactory from '@mixins/factories/search'
import sortingMixinFactory from '@mixins/factories/sorting'

export default {
    mixins: [
        searchMixinFactory({
            namespace: 'productSearch'
        }),
        sortingMixinFactory({
            namespace: 'resultSorting'
        })
    ]
}

Mixins problem 해결책 - scoped slots

단점

  • 들여쓰기 증가
  • 노출된 properties 만 템플릿에서 사용가능하다
  • 한 개 대신 세 개의 컴포넌트를 사용해야함 > 약간 귀찮음
// componets/generic-sorting.vue
<script>
export default {
    props: ['input','options'],

}
</script>
<template>
    <div>
        <slot v-bind ="{options, index,output}"/>
    </div>
</template>
// componets/generic-search.vue
<script>
export default {
    props: ['getSearch']
}
</script>
<template>
    <div>
        <slot v-bind="{query, results, rum}"/>
    </div>
</template>
// search.vue
<template>
    <GenericSearch :get-results="getProducts" v-slot="productSearch">
        <GenericSorting 
            :input = "productSearch.result"
            :options=resultSortingOptions"
            v-slot="resultSorting"
        >

vue3 의 composition api

장점

  • 약간의 코드로 컴포넌트에 쉽게 넣을 수 있음
  • 친숙한 코드
  • mixins과 scoped slot 의 유연성 (함수에서만)

단점

  • 배움이 필요함
// use/search.js
export default function useSearch(getResults) {
    // search func
}
// use/sorting.js
export default function useSorting({input, options}) {
    // sorting func
}
// search.vue
import useSearch form '@use/search'
import useSorting from '@use/sorting'
export default {
    setup() {
        const productSearch = useSearch(~)
        const resultSorting = useSorting({~~})

        return {productSearch, resultSorting}
    }
}

언제 composition api 사용하는가

  • 컴포넌트가 너무 커지고 구조화를 원할때
  • 컴포넌트 재사용 높임
  • typescript support

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

[vue3] Reactivity Utilities  (0) 2020.09.30
[vue3] composition API  (0) 2020.09.30
[vue3] Reactivity APIs  (0) 2020.07.02
[vue3] setup  (0) 2020.07.02

초기세팅

  1. git repository 생성
  2. 내 컴퓨터에서 directory 생성 수 git repository clone
$git clone ~~~~~

cf ) git repository 와 내가 생성한 dir 명이 다른 경우 매번 파일을 옮겨야 하는 불편함이 생김

그러니 repository 와 dir 을 같게 하는게 편함

  1. 내 컴퓨터에서 git repository clone 한 dir 에서 .git 파일을 찾음
$ls -al 
  1. vue 초기 세팅 설치
$vue init webpack <project-name>
  • webpack 을 이용한 vue-cli 초기 세팅

  • 예시 ) 해당 값들은 package.json 에서 변경 가능

  1. vue-cli을 이용한 내 컴퓨터의 초기 프로젝트 세팅을 git에 올림
# add
# . 은 현재 stage에 있는 모든 파일 올림
$ git add . 

# commit 
$ git commit -m '~~~~커밋할 메시지~~~'

# push
# 처음 push할때는 git 계정 물어봄
# 만약 게정을 물어보지 않으면 권한 문제가 있어 github에서 따로 설정해줘야함
$ git push

# status
# 현재 내 브랜치에서 깃 상태 보기위한 명령어
$ git status

Vue 파일 실행 원리

vue 는 웹팩을 통해 웹에서 읽을 수 있는 html 형태로 바꿔줌

  1. index.html

    • 처음 읽히는 파일 여기에서 App.vue를 불름
  2. App.vue

    • 찐으로 뷰가 처음 시작되는 부분
  3. main.js 를 처음 읽음

  4. main.js 안에 http import

  5. import 시킨 http관련 파일(http/index.js) 를 처음 읽음 여기에서 라우터 사용하면서 페이지 불러옴

  • main.js
    • 용도 - router, vuex 와 같은 plugins import 관련만 사용
    • 주의 - 로직은 안들어가는게 좋음
      • 왜? 유지보수 때문에, 문제가 생기면 언제 main.js를 다 까봄..?
      • 다른 js파일로 뺄것 예를 들면 http/index.js , store.js , etc
  • config
    • 어떤 포트로 띄우며 url 가 뭐고 이런거 설정되어있음
    • 서버에 따라서 설정을 다르게 하려면 파일을 나누면됨
    • config/env.js
      • 포트번호, url과 같은 환경 설정 파일
      • 서버 프로필 어디를 물로 실행 하는지에 관한 설정파일
  • http/index.js
    • .config 에서 설정한 환경 설정을 불러다가 씀
    • axios 관련
// index.js 파일 내용
// BASE_URL 은 .config 에서 설정해놓은거 불러다가 http 요청할거다라고 명시
axios.defaults.baseURL = process.env.BASE_URL

cf ) main.js , index.js 관계는 무엇?

  • index.js - 뭣도 없는 html 뷰
  • main.js - 라우터 등등 javascript, 포트.. 등등

cf ) 파일 구조 잡을 때 주의

  • views dir - 실제 그려지는 뷰
  • component dir - 페이지에서 공통으로 쓰는 것들
    • ex ) 뷰 타이알로그를 여러곳에서 쓰는데 이걸 커스터마이징 하고 싶을 때 여기에 넣음# 1주차 (2020-06-11)

초기세팅

  1. git repository 생성

  2. 내 컴퓨터에서 directory 생성 수 git repository clone


$git clone

~\\~

cf ) git repository 와 내가 생성한 dir 명이 다른 경우 매번 파일을 옮겨야 하는 불편함이 생김

그러니 repository 와 dir 을 같게 하는게 편함

  1. 내 컴퓨터에서 git repository clone 한 dir 에서 .git 파일을 찾음

$ls -al
  1. vue 초기 세팅 설치

$vue init webpack <project-name>
  • webpack 을 이용한 vue-cli 초기 세팅

  • 웹펙이란?

프로젝트 세팅 방법

  • 예시 ) 해당 값들은 package.json 에서 변경 가능

![1%202020%2006%2011%20bcfcec2f4dfa4a758ba34a5b88da46bd/_2020-06-11__5.52.54.png](1%202020%2006%2011%20bcfcec2f4dfa4a758ba34a5b88da46bd/_2020-06-11__5.52.54.png)

  1. vue-cli을 이용한 내 컴퓨터의 초기 프로젝트 세팅을 git에 올림

# add .

# . 은 현재 stage에 있는 모든 파일 올림

$ git add .

# commit

$ git commit -m '~

~커밋할 메시지~

'

# push

# 처음 push할때는 git 계정 물어봄

# 만약 게정을 물어보지 않으면 권한 문제가 있어 github에서 따로 설정해줘야함

$ git push

# status

# 현재 내 브랜치에서 깃 상태 보기위한 명령어

$ git status
  • cf ) windows 에서 계정이 엉켰을때 참고 한 사이트

https://yunseul-light.blogspot.com/2017/08/github-windows-git.html

Vue 파일 실행 원리

vue 는 웹팩을 통해 웹에서 읽을 수 있는 html 형태로 바꿔줌

  1. index.html
  • 처음 읽히는 파일 여기에서 App.vue를 불름
  1. App.vue
  • 찐으로 뷰가 처음 시작되는 부분

    1. main.js 를 처음 읽음

    2. main.js 안에 http import

    3. import 시킨 http관련 파일(http/index.js) 를 처음 읽음 여기에서 라우터 사용하면서 페이지 불러옴

  • main.js

    • 용도 - router, vuex 와 같은 plugins import 관련만 사용

    • 주의 - 로직은 안들어가는게 좋음

    • 왜? 유지보수 때문에, 문제가 생기면 언제 main.js를 다 까봄..?

    • 다른 js파일로 뺄것 예를 들면 http/index.js , store.js , etc

  • config

    • 어떤 포트로 띄우며 url 가 뭐고 이런거 설정되어있음

    • 서버에 따라서 설정을 다르게 하려면 파일을 나누면됨

  • config/env.js

    • 포트번호, url과 같은 환경 설정 파일

    • 서버 프로필 어디를 물로 실행 하는지에 관한 설정파일

  • http/index.js

    • .config 에서 설정한 환경 설정을 불러다가 씀

    • axios 관련


// index.js 파일 내용

// BASE\_URL 은 .config 에서 설정해놓은거 불러다가 http 요청할거다라고 명시

axios.defaults.baseURL = process.env.BASE\_URL

cf ) main.js , index.js 관계는 무엇?

  • index.js - 뭣도 없는 html 뷰

  • main.js - 라우터 등등 javascript, 포트.. 등등

cf ) 파일 구조 잡을 때 주의

  • views dir - 실제 그려지는 뷰

  • component dir - 페이지에서 공통으로 쓰는 것들

  • ex ) 뷰 타이알로그를 여러곳에서 쓰는데 이걸 커스터마이징 하고 싶을 때 여기에 넣음

+ Recent posts