template을 사용하지 않고 render함수를 이용하여 컴포넌트를 작성 할수 있습니다. 이때 createElement 함수를 사용하여 작성합니다.
기본 구성
컴포넌트 작성시의 차이점은 template 속성을 사용 하는 대신에 render 함수를 사용한다는 차이점 뿐입니다. render함수는 return으로 VNode를 반환해주기만 하면 됩니다. VNode 생성은 createElement함수를 호출하면 반환해 줍니다(this.$createElement로도 동일하게 사용 가능).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
exportdefault { name: '', proprs: {}, created() {
}, data() { return {} }, // h를 쓰기도 하고 createElement라고 쓰기도 한다. render(h) { return h('div', ['값']); } }
createElement( // {String | Object | Function} // HTML 태그 이름(사용자가 만든 컴포넌트 태그 이름 포함), 컴포넌트 옵션 또는 함수 중 // 하나를 반환하는 함수. 필수사항 'div',
// {Object} // 컴포넌트에서 사용할 속성 값을 설정합니다. // 해당 값은 선택사항 입니다. {
},
// {String | Array} // VNode 자식들 // 하위 태그를 작성할때 사용 합니다. // createElement()를 사용하거나, 문자열을 입력 가능합니다. // 해당 값은 선택사항 입니다. [ '문자열', createElement('h1', '옵션 사용 없이 바로 문자열') ] )
1 2 3 4 5 6 7 8 9
createElement( 'div', { props }, [ '문자열' ] )
지금까지 확인결과 VNode 자식값을 사용할시에 배열로 넘기자.
데이터 객체
createElement의 두번째 파라미터로 사용 하는 데이터 객체는 컴포넌트에 속성을 정의 할때 사용하게 됩니다.
var path = require('path') // output 속성에서 사용할 노드 path 라이브러리 저장 var webpack = require('webpack') // 웹팩 플러그인에서 사용할 웹팩 라이브러리를 저장
// 아래부터가 실질적인 웹팩의 설정 내용 module.exports = { entry: './src/main.js', // 웹팩으로 빌드할 파일 지정(해당 파일의 앱의 첫 시작 파일이 되는 것) output: { // output은 build 후에 생성 될 파일들에 대한 설정 path: path.resolve(__dirname, './dist'), // 빌드후에 결과 파일 저장 될 디렉토리 publicPath: '/dist/', // 이미지 파일 같이 주소의 앞에 prefix로 붙여주어 주소에 접근 하도록 해주는 것 filename : 'build.js'// 빌드하고 난 후 결과 파일 } module: { // 지금까지는 loader를 사용하는 것 정도만 확인 했음 rules: [ { test: /\.vue$/, // 로더가 적용 될 대상 파일 지정(정규식) loader: 'vue-loader'// loader는 사용할 로더 지정 }, { test: /\.js$/ loader: 'babel-loader', exclude: /node_moules/// 해당 디렉토리에서의 탐색은 제외하겠다 } ] }, resolve: { alias: { // 해당 하는 경로를 @로 대신 사용 가능하다, 여러개 편의성있게 등록 가능하다 '@': path.resolve(__dirname, 'src/') }, extensions: ['*', '.js', '.vue', '.json'] // 해당하는 확장자들을 import하게 도와주는 역할 }, devtool: '#eval-source-map'// 웹팩으로 빌드된 파일로 웹앱 구동시에 개발자 도구에서 사용할 디버깅 방식 지정 } ``` ## 웹팩 설정 구성에 사용 되는 용어 정리 ### 1. entry
entry : 웹팩을 통해서 build를 할 대상 파일을 지정하는 속성 - 해당 파일에는 전체 애플리케이션 로직과 필요한 라이브러리를 로딩하는 로직이 들어가게 됩니다.
1 2
### 2. output
output : 웹팩으로 빌드한 결과물의 위치와 파일이름 등 세부옵션을 설정하는 속성
1 2
### 3. loader
loader : 웹팩으로 빌드할때 html, css 파일등을 자바스크립트로 변환하기 위해 필요한 설정을 정의
1 2
### 4. plugin
plugin : 웹팩으로 빌드 하고 나온 결과물에 대해 추가기능을 제공하는 속성 - 한마디로 필수옵션은 아니지만 빌드할때 혹은 결과물에 추가적인 기능을 적용하고 싶을 때 사용
1 2
### 5. resolve
resolve : 웹팩으로 빌드할때 해당 파일이 어떻게 해석되는지 정의하는 속성 - 예) 라이브러리 로딩시 버전은 어떤걸로 하고, 경로는 어디로 하고 등에 관한 것
흐름 : 부모 => actions => API => mutations => state => 자식에서 state 접근
이 방법은 vuex를 최대한 활용 하는 방법으로 데이터를 표현하는 곳에서 직접 state에 접근 하는 방법이다. 이때 데이터를 표현하는 곳에서는 actions를 호출하지 않는다. 내 생각에 actions에 대한 결합도가 높아지기 때문인듯하다(해당 컴포넌트의 범용성이 낮아진다).
2. props 활용
1
흐름 : 부모 => actions => API => mutations => state => 부모에서 state에 접근 후 props로 전달 => 자식
this.$store.disaptch('메소드명'); this.$store.disaptch('메소드명', 값); // 값은 오직 하나만 전달 가능하므로 여러개를 전달하려면 객체를 통해 전달한다.
actions에서 api통신을 한 결과를 state에 전달하여야 하는데 이때 actions 내부에서 바로 state에 접근이 불가능하다. mutations라는 것을 통해서만 가능하다. actions에 정의된 메소드의 파라미터로 context값이 넘어오는데 context의 commit 메소드를 호출하면 mutation에 전달가능하다.
1 2 3 4 5 6 7 8 9 10 11 12
var actions = { state: {}, actions: { FETCH_DATA(context, param) { // param에 dispatch를 실행할때 넘겼던 값을 받을수 있다. fetchDataList() .then(({ data }) => { context.commit('mutation메소드명', '전달할 값') }) .catch() } } }
3. mutations
actions에서 backend(api)와이 실행 결과를 state에 저장할때 사용되는 중간 연결자이다. actions에서 context.commit으로 실행될 메소드를 정의한다.
// state 값 사용 할 파일 import { mapGetters } from'vuex';
var Vue = { computed: { ...mapGetters(['value']) } }
getters는 computed와 비슷한 역할을 한다. 컴포넌트에서는 mapGetter에서 배열을 넘겨준다(이때 배열의 문자열이 vuex의 getters에 정의 된 메소드 이름을 넘겨주면 해당값을 받아온다. getters에 등록 하는 번거로움이 있지만 사용할때는 변수명이 명료해서 보기 좋다.
5. vuex의 mapGetter를 이용(mapGetters의 객체를 이용하는 방법)
vuex 파일의 사용법은 위와 동일하다.
1 2 3 4 5 6 7 8 9 10
// state 값 사용 할 파일 import { mapGetters } from'vuex';
배열을 이용할때는 변수명을 마음대로 지정이 불가능하지만 객체를 이용하면 이름을 컴포넌트에서 마음대로 지정 할수 있다.
모듈화
하나의 파일에서 모든 데이터를 관리하면 알아보기 힘들기 때문에 모듈화 작업을 한다. mutations, actions, state, getters를 따로 파일을 만들어서 관리한다. 상황에 따라 분리 할수도 있고 길지 않다면 하나의 파일에서 관리할수 있고 더 세분화로 분리할수도 있다.
데이터를 호출 시점은 여러가지가 존재한다. 대표적으로 라이프 사이클 중 하나인 created와 지금 소개할 라우터 네이게이션 가드가 존재한다. 상황에 따라 적절한 위치에서 데이터를 호출 해서 사용 하면 된다.
정의
라우터 네비게이션 가드란 vue-router가 제공하는 기능으로 주로 리다이렉션 또는 라우터 이동을 취하여서 네비게이션을 보호하는데 사용한다. 라우터 네비게이션 가드는 created보다 먼저 호출이 된다.
사용방법
라우터에서 직접 사용
1 2 3 4 5 6 7 8 9 10 11
var routed = { routes : [{ path: 'list', name: 'list', beforeEnter: (to, from, next) => { console.log('to', to); // 현재 이동하고자 하는 url 정보 console.log('from', from); // 현재 url 정보 console.log('next', next); // next함수를 호출해야 이동하고자 하는 url로 접속 가능 } }] }
params 또는 쿼리의 변경에 의해서는 가드가 실행되지 않는다.
next의 사용
1. next()
네이게이션을 승인 해준다. 라우터의 URL 이동을 허락 해준다.
2. next(false)
네이게이션을 중단한다. from 경로의 URL로 재설정된다.
3. next(‘/‘) or next({path : ‘/‘})
다른 위치로 리다이렉션 해 준다.
4. next(error)
next에 전달된 인자가 Error의 인스턴스이면 탐색 중단 및 router.onError()를 이용해 등록 된 콜백에 에러가 전달 된다.