Do it Vue.js 입문 정리5

Posted by HULIA(휴리아)
2018. 4. 15. 02:01 프론트엔드/자바스크립트

vue 템플릿은 

HTML, CSS 등의 마크업 속성과 vue 인스턴스에서 정의한 데이터 및 로직들을 연결하여 사용자가 브라우저에서 볼수 있는 형태의 HTML로 변환해 주는 속성입니다


템플릿 속성을 사용하는 방법은 두가지

-ES5에서 vue 인스턴스 template 속성 활용

-싱글 파일 컴포넌트 체계의 <template> 코드를 활용하는 방법


ES5에서 template 속성

  <script>

      new Vue({

             template:'<p>HELLO{{message}}</p>'

      });

    </script>



template 속성에 대해 한가지 알아둘 특징

사용자가 볼수 없지만 라이브러리 내부적으로 template 속성에서 정의한 마크업+ vue 데이터를 가상 돔 기반의 render()함수로 변환합니다

변환된 render()함수는 최종적으로 사용자가 볼 수 있게 화면을 그리는 역할을 합니다

그리고 변환 과정에서 뷰의 반응성이 화면에 더해집니다


render()함수에 익숙하다면 직접 구현해도 됩니다

JSX기반의 render()함수에 더 익숙한 리액트 개발자라면 template속성을 이용하지 않고 render() 함수를 사용해 화면 요소를 동일하게 구현할 수 있습니다

하지만 vue 프레임워크 특징 자체가 JSX나 render()함수를 모르는 사람들도 쉽게 HTML를 이용하여 개발할 수 있게 하는 것을 목표로 하기 때문에 template 속성을 사용하도록 권하고 있습니다

추후에 뷰의 반응성과 가상 돔에 대해 충분히 이해하고 나면 render()함수를 직접 구현할 수 있습니다

그러면 화면 요소의 동작 하나에 직접 관여할 수 있기 때문에 더 빠르게 화면을 렌더링할 수 있을 것입니다


ES6 싱글 파일 컴포넌트 체계

<template>

      <p>HELLO {{message}} </p>

</template>


template에서 사용하는 vue의 속성과 문법은 다음과 같습니다

-데이터 바인딩

-자바스크립트 표현식

-디렉티브

-이벤트 처리

-고급 템플릿 기법


데이터 바인딩

:HTML 화면 요소를 vue 인스턴스의 데이터와 연결하는 것을 의미

주요 문법으로는 {{}}문법과 v-bind속성이 있습니다


{{}}는 vue 인스턴스의 데이터를 HTML태그에 연결하는 가장 기본적인 텍스트 삽입 방식입니다

vue 뿐만 아니라 다른 언어나 프레임워크에서도 자주 사용되는 템플릿 문법입니다


v-bind

아이디, 클래스, 스타일 등의 HTML속성값에 vue 데이터 값을 연결할 때 사용하는 데이터 연결 방식입니다

형식은 v-bind속성으로 지정할 HTML속성이나 props속성 앞에 접두사로 붙여줍니다.


   <div id="app">

      <p v-bind:id="idA">아이디 바인딩</p>

      <p v-bind:class="classA">클래스 바인딩</p>

      <p v-bind:style="styleA">스타일 바인딩</p>

    </div>

    <script src="https://cdn.jsdelivr.net/npm/vue@2.5.2/dist/vue.js"></script>

    <script>

      new Vue({

        el: '#app',

        data: {

          idA: 10,

          classA: 'container',

          styleA: 'color: blue'

        }

      });

    </script>



vue 템플릿에서도 자바스크립트 표현식 쓸수 있습니다

   <div id="app">

      <p>{{ message }}</p>

      <p>{{ message + "!!!" }}</p>

      <p>{{ message.split('').reverse().join('') }}</p>

    </div>


    <script src="https://cdn.jsdelivr.net/npm/vue@2.5.2/dist/vue.js"></script>

    <script>

      new Vue({

        el: '#app',

        data: {

          message: 'Hello Vue.js!'

        }

      });

    </script>



자바스크립트 표현식에서 주의할 점

첫째, 자바스크립트의 선언문과 분기 구문은 사용할 수 없습니다

둘째, 복잡한 연산은 인스턴스 안에서 처리하고 화면에는 간단한 연산결과만 표시해야 합니다.

    <div id="app">

      <!-- 1. -->

      {{ var a = 10; }} <!-- X, 선언문은 사용 불가능 -->

      {{ if (true) {return 100} }} <!-- X, 분기 구문은 사용 불가능 -->

      {{ true ? 100 : 0 }} <!-- O, 삼항 연산자로 표현 가능 -->


      <!-- 2. -->

      {{ message.split('').reverse().join('') }} <!-- X, 복잡한 연산은 인스턴스 안에서 수행 -->

      {{ reversedMessage }} <!-- O, 스크립트에서 computed 속성으로 계산 후 최종 값만 표현 -->

    </div>


    <script src="https://cdn.jsdelivr.net/npm/vue@2.5.2/dist/vue.js"></script>

    <script>

      new Vue({

        el: '#app',

        data: {

          message: 'Hello Vue.js!'

        },

        computed: {

          reversedMessage: function() {

            return this.message.split('').reverse().join('');

          }

        }

      });

    </script>


또한 반복적인 연산에 대해서는 미리 계산하여 저장해 놓고, 필요할 때 바로 불러오는 캐싱효과를 얻을 수 있습니다



디렉티브

:vue 디렉티브란 HTML 태그 안에 v-접두사를 가지는 모든 속성들을 의미합니다.

앞에서 배운 v-bind속성도 디렉티브에 해당합니다.


디렉티브 형식은 다음과 같습니다

<a v-if="flag">두잇 vue.js</a>


디렉티브는 화면의 요소를 더 쉽게 조작하기 위해 사용하는 기능

vue의 데이터 값이 변경되었을때 화면의 요소들이 리액티브하게 반응하여 변경된 데이터 값에 따라 갱신됩니다

이런식으로 화면의 요소를 직접 제어할 필요없이 뷰의 디렉티브를 활용하여 화면 요소들을 조작할 수 있습니다



동적인 웹 앱을 구현할때 자주 사용하는 주요 디렉티브

v-if

: 지정한 뷰 데이터의 값의 참, 거짓 여부에 따라 해당 HTML태그를 화면에 표시하거나 표시하지 않습니다


v-for

:지정한 뷰 데이터의 개수만큼 해당 HTML태그를 반복 출력합니다


v-show

:v-if와 유사하게 데이터의 진위 여부에 따라 해당 HTML 태그를 화면에 표시하거나 표시하지 않습니다

다만 v-if는 해당 태그를 완전히 삭제하지만 v-show는 css 효과만 display:none으로 주어 실제 태그는 남아있고 화면상으로만 보이지 않습니다


v-bind

:HTML태그의 기본 속성과 vue 데이터 속성을 연결합니다


v-on

:화면 요소의 이벤트를 감지하여 처리할 때 사용합니다. 예를 들어 v-on:click은 해당 태그의 클릭 이벤트를 감지하여 특정 메소드를 실행 할 수 있습니다


v-model

:폼(form)에서 주로 사용되는 속성입니다. 폼에 입력한 값을 vue 인스턴스의 데이터와 즉시 동기화합니다. 화면에 입력된 값을 저장하여 서버에 보내거나 watch와 같은 고급 속성을 이용하여 추가 로직을 수행할 수 있습니다. <input>, <select>, <textarea> 태그에만 사용할 수 있습니다


디렉티브 예제

   <div id="app">

      <a v-if="flag">두잇 Vue.js</a>

      <ul>

        <li v-for="system in systems">{{ system }}</li>

      </ul>

      <p v-show="flag">두잇 Vue.js</p>

      <h5 v-bind:id="uid">뷰 입문서</h5>

      <button v-on:click="popupAlert">경고 창 버튼</button>

    </div>


    <script src="https://cdn.jsdelivr.net/npm/vue@2.5.2/dist/vue.js"></script>

    <script>

      new Vue({

        el: '#app',

        data: {

          flag: true,

          systems: ['android', 'ios', 'window'],

          uid: 10

        },

        methods: {

          popupAlert: function() {

            return alert('경고 창 표시');

          }

        }

      });

    </script>




앵귤러 디렉티브와 vue 디렉티브

앵귤러에서 사용하는 디렉티브 역시 vue의 디렉티브와 비슷한 역할을 합니다

개발자가 돔 요소를 직접 제어하지 않고 프레임워크에 돔 요소 제어 권한을 위임하는 것

물론 필요에 따라 앵귤러나 뷰 모두 개발자가 직접 돔 요소에 접근할 수 있지만 프레임워크에서 권하지 않습니다.

또한 앵귤러와 vue 모두 형식과 기느을 직접 제작해서 사용할 수 있습니다.



이벤트처리

:v-on디렉티브와 methods속성을 활용

제이쿼리 못지않게 vue도 이벤트 처리가 매우 간단합니다

    <div id="app">

      <button v-on:click="clickBtn">클릭</button>

</div>


    <script src="https://cdn.jsdelivr.net/npm/vue@2.5.2/dist/vue.js"></script>

    <script>

      new Vue({

        el: '#app',

        methods: {

          clickBtn: function() {

            alert('clicked');

          }

        }

      });

    </script>



v-on 디렉티브로 메스드를 호출할때 인자값을 넘기는 방법

    <div id="app">

      <button v-on:click="clickBtn(10)">클릭</button>

</div>


    <script src="https://cdn.jsdelivr.net/npm/vue@2.5.2/dist/vue.js"></script>

    <script>

      new Vue({

        el: '#app',

        methods: {

          clickBtn: function(num) {

            alert('clicked ' + num + ' times');

          }

        }

      });

    </script>



event 인자를 이용해 화면 요소의 돔 이벤트에 접근

   <div id="app">

      <button v-on:click="clickBtn">클릭</button>

    </div>


    <script src="https://cdn.jsdelivr.net/npm/vue@2.5.2/dist/vue.js"></script>

    <script>

      new Vue({

        el: '#app',

        methods: {

          clickBtn: function(event) {

            console.log(event);

          }

        }

      });

    </script>



고급 템플릿 기법

고급 템플릿 기법은 실제 애플리케이션을 개발할때 유용한 속성

데이터 바인딩, 디렉티브와 같은 기본적인 문법과 함께 사용


computed 속성

데이터를 가공하는 등의 복잡한 연산은 vue 인스턴스 안에서 하고 

최종적으로 HTML에는 데이터를 표현만 해야 함

computed 속성은 이러한 데이터 연산들을 정의하는 영역임


computed 속성의 첫번째 장점

data 속성 값의 변화에 따라 자동으로 다시 연산한다는 점


computed의 속성의 두번째 장점

캐싱(동일한 연산을 반복해서 하지 않기 위해 연산의 결과 값을 미리 저장하고 있다가 필요할 때 불러오는 동작)



computed속성과 methods 속성의 차이점

methods속성은 호출할때만 해당 로직이 수행되고, 

computed속성은 대상 데이터의 값이 변경되면 자동적으로 수행된다는 것

다시 말해 수동적으로 데이터를 갱신하느냐, 능동적으로 데이터를 갱신하느냐의 차이점

methods는 캐싱을 하지 않고 computed는 캐싱을 함

따라서 복잡한 연산을 반복 수행해서 화면에 나타내야 한다면 computed 속성을 이용하는 것이 methods 속성을 이용하는 것보다 성능면에서 효율적임


<div id="app">

      <p>{{ message }}</p>

      <button v-on:click="reverseMsg">문자열 역순</button>

    </div>


    <script src="https://cdn.jsdelivr.net/npm/vue@2.5.2/dist/vue.js"></script>

    <script>

      new Vue({

        el: '#app',

        data: {

          message: 'Hello Vue.js!'

        },

        methods: {

          reverseMsg: function() {

            this.message = this.message.split('').reverse().join('');

            return this.message;

          }

        }

      });

    </script>




watch 속성

데이터 변화를 감지하여 자동으로 특정 로직을 수행합니다

computed속성과 유사하지만 computed 속성은 내장 API를 활용한 간단한 연산 정도로 적합한 반면에

watch 속성은 데이터 호출과 같이 시간이 상대적으로 더 많이 소모되는 비동기 처리에 적합


비동기처리란?

웹 앱에서 데이터를 호출할때 일반적으로는 서버에 http 요청을 보냅니다

그런데 자바스크립트 코드가 실행되는 시점에서는 서버에 보낸 요청이 언제 응답이 올지 알수 없습니다

따라서 다른 자바스크립트 연산에 영향을 주지 못하도록 별도의 영역에서 해당 데이터를 요청하고 응답을 기다립니다.

이를 자바스크립트 비동기 처리 로직이라고 합니다


인풋박스의 입력값을 v-model 디렉티브로 연결하여 입력 값에 변화가 있을때 마다 watch속성에서 변화된 값을 로그로 출력합니다

 <div id="app">

      <input v-model="message">

    </div>


    <script src="https://cdn.jsdelivr.net/npm/vue@2.5.2/dist/vue.js"></script>

    <script>

      new Vue({

        el: '#app',

        data: {

          message: 'Hello Vue.js!'

        },

        watch: {

          message: function(data) {

            console.log("message의 값이 바뀝니다 : ", data);

          }

        }

      });

    </script>


v-model 디렉티브는 앵귤러의 양방향 데이터 바인딩을 본따 만든 vue의 기능

앵귤러와 동일한 방식으로 화면단의 데이터를 스크립트단의 특정 데이터와 일치시켜 줍니다




싱글 파일 컴포넌트 체계

.vue 파일로 프로젝트 구조를 구성하는 방식

확장자 .vue 파일 1개는 vue 애플리케이션을 구성하는 1개의 컴포넌트와 동일


.vue 파일의 기본구조

<template>

//HTML 태그 내용 - 화면에 표시할 요소들을 정의하는 영역(html+vue 데이터 바인딩)

</template>


<script>

export default{

//자바스크립트 내용 - vue 컴포넌트의 내용을 정의하는 영역(template, data, methods 등)

}

</script>


<style>

//css 스타일 내용 - 템플릿에 추가한 HTML태그의 CSS 스타일을 정의하는 영역

</style>


***export default{} 코드는 ES6의 자바스크립트 모듈화와 관련된 문법



앞에서 배운 싱글 파일 컴포넌트 체계를 사용하기 위해서는 .vue파일을 웹 브라우저가 인식할 수 있는 형태의 파일로 변환해 주는 웹팩이나 브라우저파이와 같은 도구가 필요합니다


웹팩은 웹 앱의 자원(HTML, CSS, 이미지)들을 자바스크립트 모듈로 변환해 하나로 묶어 웹 성능을 향상시켜 주는 자바스크립트 모듈 번들러입니다

브라우저리파이도 웹팩과 유사한 성격의 모듈 번들러이지만 웹팩과 다르게 웹 자원 압축이나 빌드 자동화 같은 기능이 없습니다


웹팩 한글 강의

https://www.infleran.com/course/webpack-웹팩-강좌/


vue 개발자들이 편하게 프로젝트를 구성할 수 있도록 CLI도구(NODEJS가 설치되어 있어야함)를 제공


CLI 설치

npm install vue-cli -global


vue CLI 명령어 템플릿

-vue init webpack

고급 웹팩 기능을 활용한 프로젝트 구성 방식, 테스팅, 문법 검사등을 지원


-vue init webpack-simple

웹팩 최소 기능을 활용한 프로젝트 구성 방식, 빠른 화면 프로토타이핑용


-vue init browserify

고급 브라우저리파이 기능을 활용한 프로젝트 구성 방식, 테스팅, 문법 검사등을 지원


-vue init browserify-simple

브라우저리파이 최소 기능을 활용한 프로젝트 구성 방식, 바른 화면 프로토타이핑용


-vue init simple

최소 vue 기능만 들어간 HTML 파일 1개 생성


-vue init pwa

웹팩 기반의 프로그레시브 웹 앱 기능을 지원하는 vue 프로젝트



vue CLI 명령어 템플릿들의 공통점

첫째, 웹팩이나 브라우저리파이 같은 모듈 번들러를 프로젝트 자체에 포함하여 바로 사용할 수 있습니다

둘째, .vue 파일을 HTML, CSS, 자바스크립트 파일로 변환해 주기 위한 vue 로더를 포함하고 있습니다.

결론적으로 .vue 파일 방식으로 애플리케이션을 개발하려면 vue 로더와 이를 지원하는 웹팩, 브라우저리파이 같은 모듈 번들러가 필요하다는 것을 알 수 있습니다


언급한 템플릿 중 웹팩과 기타 기능에 신경쓰지 않고 vue 프레임워크 자체에 가장 집중할 수 있는 템플릿은 webpack-simple

webpack 템플릿은 웹팩의 여러가지 기능과 함께 테스팅 라이브러리, 문법 검사 라이브러리를 모두 포함하고 있기 때문에 프로젝트 구성방식을 파악하는데 상당한 시간이 소요

그리고 까다로운 문법 검사로 인해 화면을 빠르게 구현하기 어려움

반면에 webpack-simple 템플릿은 vue로 개발하기 위한 웹팩의 최소 기능들만 있어 프로젝트 구성 자체가 간단합니다


vue-cli로 프로젝트 만들고 웹페이지 띄우기

0)vue-cli 설치

1)vue init 템플릿

2)npm install

3)npm run dev


vue 로더는 웹팩에서 지원하는 라이브러리입니다.

vue 로더는 싱글 파일 컴포넌트 체계에서 사용하는 .vue파일의 내용을 브라우저에서 실행 가능한 웹 페이지의 형태로 변환해 줍니다


웹팩 설정 파일의 vue 로더 속성 확인

weback.config.js파일

test는 로더가 적용될 대상파일 지정

loader는 적용할 로더의 종류를 지정


프로젝트 폴더내에서 .vue확장자를 가진 파일을 모두 선택하여 vue 로더를 적용하는 코드

그리고 .vue 파일을 선택하기 위해 자바스크립트 정규 표현식을 사용



Do it Vue.js 입문 정리4

Posted by HULIA(휴리아)
2018. 4. 12. 01:55 프론트엔드/자바스크립트

웹 앱 HTTP 통신의 대표적인 사례로는 제이쿼리의 ajax가 있습니다

ajax는 서버에서 받아온 데이터를 표시할때 화면 전체를 갱신하지 않고도 화면의 일부분만 변경할수 있게 하는 자바스크립트 기법


vue에서도 ajax를 지원하기 위한 라이브러리를 제공합니다

vue 프레임워크의 필수 라이브러리로 관리하던 vue 리소스와 요즘 가장 많이 사용하는 액시오스(axios)이다


vue리소스는 초기에 코어 팀에서 공식적으로 권하는 라이브러리였으나 2016년 말에 에반이 공식적인 지원을 중단하기로 결정하면서 다시 기존에 관리했던 pageKit 팀의 라이브러리로 돌아감

그 이유는 HTTP 통신 라이브러리는 vue 라우팅, 상태 관리와 같은 라이브러리와는 다르게 프레임워크에 필수적인 기능이 아니라고 판단했기 때문



액시오스는 현재 vue 커뮤니티에서 가장 많이 사용되는 HTTP 통신 라이브러리입니다.

에반도 vue 리소스 라이브러리를 공식 라이브러리에서 제외하면서 액시오스를 언급


액시오스는 promise기반의 api 형식이 다양하게 제공되어 별도의 로직을 구현할 필요 없이 주어진 API만으로도 간편하게 원하는 로직을 구현할 수 있습니다


promise 기반의 API 형식이란 무엇일까요?

promise란 서버에 데이터를 요청하여 받아오는 동작과 같은 비동기 로직 처리에 유용한 자바스크립트 객체입니다

자바스크립트는 단일 스레드로 코드를 처리하기 때문에 특정 로직의 처리가 끝날때까지 기다려주지 않습니다.

따라서 데이터를 요청하고 받을때까지 기다렸다가 화면에 나타내는 로직을 실행해야 할 때 주로 promise를 활용합니다

그리고 데이터를 받아왔을때 promise로 데이터를 화면에 표시하거나 연산을 수행하는 등 특정로직을 수행합니다


데이터 통신과 관련한 여러 라이브러리 대부분에서 promise를 활용하고 있으며, 액시오스에서도 promise기반의 API를 지원함


액시오스 공식 리포지토리

https://github.com/axios/axios

예제와 안내 잘 되어 있음


엑시오스 설치 CDN

<script src="https://unpkg.com/axios/dist/axios.min.js"></script>


엑시오스 설치 NPM(ES6)

https://github.com/axios/axios#installing



//HTTP GET 요청

axios.get('url주소').then().catch();

--> 해당 url주소에 대해 HTTP GET 요청을 보냅니다.

서버에서 보낸 데이터를 정상적으로 받아오면 then()안에 정의한 로직이 실행되고,

데이터를 받아올때 오류가 발생하면 catch()에 정의한 로직이 수행됩니다


//HTTP POST 요청

axios.post('url주소').then().catch();

--> 해당 url주소에 대해 HTTP POST 요청을 보냅니다. then()과 catch()의 동작은 위에서 살펴본 내용과 동일합니다


//HTTP 요청에 대한 옵션 속성 정의

axios({

    method:'get',

    url:'url주소',

    ...

});

-->HTTP 요청에 대한 자세한 속성들을 직접 정의하여 보낼수 있습니다. 데이터 요청을 보낼때 URL, HTTP요청방식, 보내는 데이터유형, 기타 등등


더 많은 형식은

https://github.com/axios/axios#axios-api


예제

<div id="app">

<button v-on:click="getData">프레임워크 목록 가져오기</button>

</div>


<script src="https://cdn.jsdelivr.net/npm/vue@2.5.2/dist/vue.js"></script>

<script src="https://unpkg.com/axios/dist/axios.min.js"></script>

<script>

new Vue({

el: '#app',

methods: {

getData: function() {

axios.get('https://raw.githubusercontent.com/joshua1988/doit-vuejs/master/data/demo.json')

.then(function(response) {

console.log(response);

});

}

}

});

</script>



'프론트엔드 > 자바스크립트' 카테고리의 다른 글

앱)자바스크립트 자릿수 체크하는 로직  (0) 2018.06.04
Do it Vue.js 입문 정리5  (0) 2018.04.15
Do it Vue.js 입문 정리3  (0) 2018.04.04
Do it Vue.js 입문 정리2  (0) 2018.04.01
Do it Vue.js 입문 정리  (0) 2018.03.31

Do it Vue.js 입문 정리3

Posted by HULIA(휴리아)
2018. 4. 4. 00:06 프론트엔드/자바스크립트

라우팅이란

웹페이지간의 이동방법을 말함


라우팅은 현대 웹 앱 형태 중 하나인 싱글 페이지 애플리케이션에서 주로 사용하고 있습니다

브라우저에서 웹페이지를 요청하면 서버에서 응답을 받아 웹페이지를 다시 사용자에게 보여주는 준비를 하는 시간동안 깜박이는데 라우팅으로 처리하면 깜빡거림 없이 화면을 전환할 수 있을뿐 아니라 더 빠르게 화면을 조작할 수 있음


싱글 페이지 애플리케이션:

페이지를 이동할때마다 서버에 웹페이지를 요청하여 새로 갱신하는 것이 아니라 미리 해당 페이지들을 받아 놓고 페이지 이동시에 클라이언트의 라우팅을 이용하여 화면을 갱신하는 패턴을 적용한 애플리케이션


Vue뿐만 아니라 리액트나 앵귤러 모두 라우팅을 이용하여 화면을 전환하고 있음


프런트엔드 프레임워크를 사용하지 않고 일반 HTML 파일들로도 라우팅 자바스크립트 라이브러리를 이용하여 라우팅 방식의 페이지 이동을 구현할 수 있음

대표적인 라우팅 라이브러리

router.js와 navigo.js가 있음



vue라우터

vue 라우터는 vue에서 라우팅 기능을 구현할 수 있도록 지원하는 공식 라이브러리

vue 라우터를 이용하여 vue로 만든 페이지 간에 자유롭게 이동가능


vue 라우터 태그와 기능

<router-link to="URL값"> : 페이지 이동 태그, 화면에서는 <a>로 표시되며 클릭하면 to에 지정한 url로 이동합니다

<router-view> : 페이지 표시 태그, 변경되는 url에 따라 해당 컴포넌트를 뿌려주는 영역입니다


===기본 vue 라우터 예시===

    <div id="app">

      <h1>뷰 라우터 예제</h1>

      <p>

        <router-link to="/main">Main 컴포넌트로 이동</router-link>

        <router-link to="/login">Login 컴포넌트로 이동</router-link>

      </p>

      <router-view></router-view>

    </div>


    <script src="https://cdn.jsdelivr.net/npm/vue@2.5.2/dist/vue.js"></script>

    <script src="https://unpkg.com/vue-router@3.0.1/dist/vue-router.js"></script>

    <script>

      // 3. Main. Login 컴포넌트 내용 정의

      var Main = { template: '<div>main</div>' };

      var Login = { template: '<div>login</div>' };


      // 4. 각 url에 해당하는 컴포넌트 등록

      var routes = [

        { path: '/main', component: Main },

        { path: '/login', component: Login }

      ];


      // 5. 뷰 라우터 정의

      var router = new VueRouter({

        routes

      });


      // 6. 뷰 라우터를 인스턴스에 등록

      var app = new Vue({

        router

      }).$mount('#app');

    </script>




$mount() API는 el속성과 동일하게 인스턴스를 화면에 붙이는 역할을 합니다.

인스턴스를 생성할때 el속성을 넣지 않았더라도 생성하고 나서 $mount()를 이용하면 강제로 인스턴스를 화면에 붙일 수가 있습니다.

참고로, 뷰 라우터의 공식 문서는 모두 인스턴스 안에 el를 지정하지 않고 라우터만 지정하여 생성한 다음 생성된 인스턴스를 $mount()를 이용해 붙이는 식으로 안내하고 있습니다.



라우터 URL의 해시값을 없애는 방법

vue 라우터의 기본 url 형식은 해시값을 사용합니다

만약index.html/login과 같이 해시값을 없애고 싶으면 오른쪽처럼 히스토리 모드(history mode)를 활용하면 됩니다

var router = new VueRouter({

     mode:'history',

     routes

});




네스티드 라우터

   <div id="app">

      <router-view></router-view>

    </div>



 <script src="https://cdn.jsdelivr.net/npm/vue@2.5.2/dist/vue.js"></script>

    <script src="https://unpkg.com/vue-router@3.0.1/dist/vue-router.js"></script>

    <script>

      var User = {

        template: `

          <div>

            User Component

            <router-view></router-view>

          </div>

        `

      };

      var UserProfile = { template: '<p>User Profile Component</p>' };

      var UserPost = { template: '<p>User Post Component</p>' };


      var routes = [

        {

          path: '/user',

          component: User,

          children: [

            {

              path: 'posts',

              component: UserPost

            },

            {

              path: 'profile',

              component: UserProfile

            },

          ]

        }

      ];


      var router = new VueRouter({

        routes

      });


      var app = new Vue({

        router

      }).$mount('#app');

    </script>





네임드 뷰(특정 페이지로 이동했을 때 해당 URL에 맞추어 여러개의 컴포넌트를 한번에 표시가능)

    <div id="app">

      <router-view name="header"></router-view>

      <router-view></router-view>

      <router-view name="footer"></router-view>

    </div>



    <script src="https://cdn.jsdelivr.net/npm/vue@2.5.2/dist/vue.js"></script>

    <script src="https://unpkg.com/vue-router@3.0.1/dist/vue-router.js"></script>

    <script>

      var Body = { template: '<div>This is Body</div>' };

      var Header = { template: '<div>This is Header</div>' };

      var Footer = { template: '<div>This is Footer</div>' };


      var router = new VueRouter({

        routes: [

          {

            path: '/',

            components: {

              default: Body,

              header: Header,

              footer: Footer

            }

          }

        ]

      })


      var app = new Vue({

        router

      }).$mount('#app');

    </script>




<router-view>에서 사용한 name속성은 예약어가 아니라 사용자가 임의로 정의할 수 있는 값

위에서 사용한 header, footer 값 모두 appHeader, appFooter라고 이름을 변경해도 동일하게 동작함

예외적으로 name속성을 지정하지 않았을때의 기본 컴포넌트는 default로 접근함



'프론트엔드 > 자바스크립트' 카테고리의 다른 글

Do it Vue.js 입문 정리5  (0) 2018.04.15
Do it Vue.js 입문 정리4  (1) 2018.04.12
Do it Vue.js 입문 정리2  (0) 2018.04.01
Do it Vue.js 입문 정리  (0) 2018.03.31
클린코드 자바 스크립트  (0) 2018.03.01

Do it Vue.js 입문 정리2

Posted by HULIA(휴리아)
2018. 4. 1. 22:58 프론트엔드/자바스크립트

Vue 인스턴스

:Vue로 화면을 개발하기 위해 필수적으로 생성해야 하는 기본 단위


ex)Vue 인스턴스 예시

 new Vue({

       

      });


Vue 인스턴스 옵션 속성

-data

-el

-template(화면에서 표시할 HTML, CSS 등의 마크업 요소를 정의하는 속성. Vue의 데이터 및 기타 속성들도 함께 화면에 그릴 수 있음)

-methods(화면 로직 제어와 관계된 메소드를 정의하는 속성. 마우스 클릭 이벤트 처리와 같이 화면의 전반적인 이벤트와 화면동작과 관련된 로직을 추가할 수 있음)

-created(vue instance가 생성되자마자 실행할 로직을 정의할 수 있는 속성)


Vue 인스턴스의 유효범위

Vue 인스턴스를 생성하면 HTML의 특정 범위 안에서만 옵션 속성이 적용되어 나타남

인스턴스의 유효범위는 el 속성과 밀접한 관계가 있음



Vue 인스턴스 라이프 사이클

-생성

-화면에 부착

-내용 갱신

-소멸


<<<<<<<<<사진>>>>>>>>>>>>>






Vue 컴포넌트

:조합하여 화면을 구성할수 있는 블록(화면의 특정 영역)을 의미

컴포넌트를 활용하면 화면을 빠르게 구조화하여 일괄적인 패턴으로 개발 가능


Vue에서는 웹 화면을 구성할 때 흔히 사용하는 내비게이션 바, 테이블, 리스트, 인풋 박스 등과 같은 화면 구성 요스들을 잘게 쪼개어 컴포넌트로 관리합니다


ex) 웹 화면 예시

Header

Content -> Aside, List

Footer


컴포넌트 등록 방식

-전역

-지역


전역 컴포넌트 등록

Vue.component('컴포넌트이름',{

  //컴포넌트 내용

  //template

  //data

  //methods

});


컴포넌트이름은 케밥기법(변수가 단어의 조합으로 이루어져있을때, 단어와 단어 사이를 -로 잇는 변수 명명방식)으로 하게되며 

컴포넌트 이름은 template속성에서 사용한 HTML 사용자 정의 태그 이름을 의미함


ex)

Vue.component('my-component', {

        template: '<div>전역 컴포넌트가 등록되었습니다!</div>'

      });



지역 컴포넌트 등록

new Vue({        

        components: {

          '컴포넌트이름': 컴포넌트 내용

        }

      });


컴포넌트 이름은 전역 컴포넌트와 마찬가지로 HTML에 등록하 사용자 정의 태그를 의미하고,

컴포넌트 내용은 컴포넌트 태그가 실제 화면 요소로 변환될 때의 내용을 의미합니다


ex)

new Vue({

        el: '#app',

        components: {

          'my-local-component': cmp

        }

      });




Vue 컴포넌트 통신

컴포넌트는 각각 고유한 유효 범위를 가지고 있기 때문에 직접 다른 컴포넌트의 값을 참조할 수 없음

따라서 Vue 프레임워크 자체에서 정의한 컴포넌트 데이터전달 방법을 따라야 함


상위 하위는 트리구조임


상위 컴포넌트->하위 컴포넌트 : props로 전달

하위 컴포넌트->상위 컴포넌트 : 이벤트 발생

이벤트 발생후 이벤트 수신을 하는 개념을 이용한다

//이벤트 발생 

this.$emit('이벤트명');

//이벤트 수신

<child-component v-on:이벤트명="상위 컴포넌트의 메소드 명"></child-component>



ex)상위컴포넌트가 하위컴포넌트로 보낼때 

   <div id="app">

      <!-- 팁 : 오른쪽에서 왼쪽으로 속성을 읽으면 더 수월합니다. -->

      <child-component v-bind:propsdata="message"></child-component>

    </div>


상위 컴포넌트는 div태그

하위 컴포넌트는 child-component임


    Vue.component('child-component', {

        props: ['propsdata'],

        template: '<p>{{ propsdata }}</p>',

      });


      new Vue({

        el: '#app',

        data: {

          message: 'Hello Vue! passed from Parent Component'

        }

      });



ex)하위컴포넌트가 상위 컴포넌트로 이벤트 발생후 수신되는 될때

    <div id="app">

      <child-component v-on:show-log="printText"></child-component>

    </div>


     Vue.component('child-component', {

        template: '<button v-on:click="showLog">show</button>',

        methods: {

          showLog: function() {

            this.$emit('show-log');

          }

        }

      });


      new Vue({

        el: '#app',

        data: {

          message: 'Hello Vue! passed from Parent Component'

        },

        methods: {

          printText: function() {

            console.log("received an event");

          }

        }

      });



관계없는 컴포넌트 간 통신 - 이벤트 버스

컴포넌트 통신은 항상 상위-하위 구조를 유지해야만 데이터를 주고 받을 수 있었지만 이벤트 버스는 상위 하위 구조를 가지지 않고도 데이터를 한 컴포넌트에서 다른 컴포넌트로 전달할 수 있음



이벤트 버스 형식

//이벤트 버스를 위한 추가 인스턴스 1개 생성

var eventBus = new Vue();


//이벤트를 보내는 컴포넌트

methods:{

        메소드명 : function(){

                eventBus.$emit('이벤트명',데이터);

         }

}


//이벤트를 받는 컴포넌트

methods:{

    created: function(){

           eventBus.$on('이벤트명', function(데이터){

                        내용들

           });

     }

}



ex)

    <div id="app">

      <child-component></child-component>

    </div>



  var eventBus = new Vue();

      Vue.component('child-component', {

        template: '<div>하위 컴포넌트 영역입니다.<button v-on:click="showLog">show</button></div>',

        methods: {

          showLog: function() {

            eventBus.$emit('triggerEventBus', 100);

          }

        }

      });


      var app = new Vue({

        el: '#app',

        created: function() {

          eventBus.$on('triggerEventBus', function(value){

            console.log("이벤트를 전달 받음. 전달 받은 값 : ", value);

          });

        }

      });



이벤트 버스를 활용하면 props속성을 이용하지 않고도 원하는 컴포넌트 간에 직접적으로 데이터를 전달할 수 있어 편리하지만 컴포넌트가 많아지면 어디로 보냈는지 관리가 되지 않는 문제가 발생합니다

이 문제를 해결하려면 뷰엑스란느 상태관리도구가 필요합니다.


vuex : 컴포넌트간의 데이터 관리를 효율적으로 하는 라이브러리



Do it Vue.js 입문 정리

Posted by HULIA(휴리아)
2018. 3. 31. 13:59 프론트엔드/자바스크립트

장기효

jangkeehyo@gmail.com


기술 블로그 : https://joshua1988.github.io

깃허브 : https://github.com/joshua1988



Vue.js의 초점은 더 많은 사람들이 쉡게 웹 앱을 만들 수 있도록 도와주는데 있다

-에반유(Vue.js 창시자)



프론트엔드 개발 실무자의 입장에서 Vue.js의 전망이 밝아 보이는 가장 큰 이유는 진입 장벽이 낮다는 것. 배우기도 쉽고 성능까지 우수



예제 다운로드

https://github.com/joshua1988/doit-vuejs

exam:예제코드

quiz:직접해보기

final:할일 관리 프로젝트

pwa:프로그래시브 웹 앱 프로젝트



Vue.js

명시적 렌더링(코어라이브러리) > 컴포넌트기반 > 클라이언트 사이드 라우팅(프레임워크 기능) > 상태관리


2014년 2월 처음으로 공식배포

2018년 현재 깃허브 별개수 80300개


Vue.js장점

-배우기가 쉬움

-리액트와 앵귤러에 비해 성능이 우수하고 빠름

-리액트의 장점과 앵귤러의 장점 가지고 있음(앵귤러의 데이터 바인딩 특성과 리액트의 가상돔 기반 렌더링 특징을 모두 가지고 있음)

https://vuejs.org/v2/guide/comparison.html


타입스크립트 : 기존 자바스크립트에 업격한 타입 체크를 도입한 언어. 앵귤러2의 표준

ES6 : 자바스크립트의 최신 스펙으로, ECMAScript 2015와 동일한 용어

웹팩 : 웹 모듈 번들러, 최신 프론트엔드 프레임워크에서 권고하는 필수 웹 성능 개선 도구


Vue.js의 특징

1)UI 화면단 라이브러리

Vue.js는 UI 화면 개발 방법 중 하나인 MVVM 패턴의 뷰 모델에 해당하는 화면단 라이브러리입니다


MVVM패턴(위키피디아)

마크업 언어나 GUI 코드를 비지니스 로직 또는 백엔드 로직과 분리하여 개발하는 소프트웨어 디자인 패턴



뷰(view)                         뷰모델(view Model)                        모델(model)

돔(DOM)                         뷰(Vue.js)                                   자바스크립트 객체(Javascript objects)

------------------------>돔리스너(DOM listener)----------------------------->

------------------------<데이터바인딩(Data binding-------------------------<


뷰(view) : 사용자에게 보이는 화면

돔(DOM) : HTML 문서에 들어가는 요소(태그, 클래스, 속성 등의) 정보를 담고 있는 데이터 트리

돔 리스너(DOM Listener) : 돔의 변경 내역에 대해 즉각적으로 반응하여 특정 로직을 수행하는 장치

모델(Model) : 데이터를 담는 용기, 보통은 서버에서 가져온 데이터를 자바스크립트 객체 형태로 저장

데이터 바인딩(Data Binding) : 뷰에 표시되는 내용과 모델의 데이터를 동기화

뷰 모델(ViewModel) : 뷰와 모델의 중간영역. 돔 리스너와 데이터 바인딩을 제공하는 영역



2)컴포넌트 기반 프레임워크

리액트와 앵귤러도 모두 컨포넌트 기반의 개발 방식 추구

컴포넌트 기반방식으로 개발하는 이유는

:코드를 재사용하기 쉽기 때문, 그리고 Vue,js의 경우 컴포넌트를 썼을때 HTML코드에서 화면의 구조를 직관적으로 파악할 수 있음



3)리액트와 앵귤러의 장점을 가진 프레임워크

뷰는 앵귤러의 양방향 데이터 바인딩과(two-way data binding)과 리액트의 단방향 데이터 흐름(one-way data flow)의 장점을 모두 결합한 프레임워크


양방향 데이터 바인딩이란

:화면에 표시되는 값과 프레임워크 모델 데이터 값이 동기화되어 한쪽이 변경되면 다른 한쪽도 자동으로 변경되는 것을 말함


단방향 데이터 흐름이란

:컴포넌트의 단방향 통신을 의미, 컴포넌트 간에 데이터를 전달할 때 항상 상위 컴포넌트에서 하위 컴포넌트 한 방향으로만 전달하게끔 프레임워크가 구조화되어 있는 것


4) 그외

빠른 화면 렌더링을 위해 리액트의 가상 돔 렌더링 방식을 적용하여 사용자 인터랙션이 많은 요즘의 웹 화면에 적합한 동작 구조를 갖추고 있습니다.

가상 돔을 활용하면 특정 돔 요소를 추가하거나 삭제하는 변경이 일어날 때 화면 전체를 그리지 않고 프레임워크에서 정의한 방식에 따라 화면을 갱신합니다. 따라서 브라우저 입장에서는 성능 부하가 줄어들어 일반 렌더링 방식보다 더 바르게 화면을 그릴 수 있습니다.



Vue.js 개발환경

-크롬브라우저

-텍스트 에디터

-node.js

-Vue 개발자도구



node.js

서버 사이드 자바스크립트로, 서버 측에서 실행되는 자바스크립트 실행 환경을 의미(Vue cli를 이용하려면 필요)

LTS버전을 다운로드 하는 하는 것이 더 좋음


Vue개발자 도구

구글에서 vue.js devtools로 검색

크롭 웹 스토어에 추가



클린코드 자바 스크립트

Posted by HULIA(휴리아)
2018. 3. 1. 21:26 프론트엔드/자바스크립트

https://github.com/martin-material/clean-code-javascript-ko



1.소개(Introduction)

2.변수(Variables)

3.함수(Functions)

4.객체와 자료구조(Objects and Data Structures)

5.클래스(Classes)

6.테스트(Testing)

7.동시성(Concurrency)

8.에러 처리(Error Handling)

9.포맷팅(Formatting)

10.주석(Comments)

11.번역(Translation)



앱)왜 프론트엔드 개발자를 뽑으며 프론트 개발할때 MVC모델이 필요할까?

Posted by HULIA(휴리아)
2017. 11. 13. 15:38 프론트엔드/자바스크립트
사실 위의 질문은 두가지이지만 결국 한가지 질문이다

항상 궁금했었는데

오늘 그것에 대해서 어느정도 답을 얻었으므로 정리를 하고자 한다

결론은 웹페이지 구성 자체가 복잡 해졌다였다

기존 방식의 대표적인 것이 게시판을 생각해 볼 수 있다
지금도 게시판은 자주 볼 수 있다
게시판 정도라면 기존의 방식 프론트가 단순하게 활용될 수 있다
백엔드 언어가 지원하는 템플릿 엔진을 쓰고 JQuery를 통해서 여러가지 이벤트를 처리할 수 있게 된다


그러나 요즘 게시판이 좀 많이 변화되었다 페이스북이 대표적이지만 기능이 들이 많다 동영상도 보여주기도 하고 좋아요도 있고 댓글도 남기고 공유도 해야 하고 알림도 보여줘야 하고 차트도 그려줘야 하고 등등 여러가지 기능을 한페이지에 구성해야 하게 되었다

그래서 데이터를 가지고 웹페이지를 구성하는 것 자체만으로도 많은 처리를 해야 하게 되었다

관리 포인트는 여러가지가 있는데
1. 라이브러리 관리(의존성, 로딩관리)
2. 자바스크립트의 기술발전(ES5, ES6)
3. 자바스크립트를 편하게 사용할 수 있는 다양한 언어(TypeScript, CoffeeScript)
4. 스타일 시트 관리
5. 위의 모든 것을 해줄 수 있는 빌드 툴(Webpack)
6. HTML 관리
등등이 있다

그리고 구글에서는 Augular라는 프론트 MVC프레임워크가 나오게 된다

프론트에서도 드뎌 MVC모델을 가지고 웹페이지를 구성해야할 시기가 온 것이다
게다가 버전이 현재 2버젼대 이다

그이유는 아마도 그만큼 웹페이지가 복잡해지고 있다는 증거일지도 ^^

그러다 보니 프론트엔드 개발자라는 직군이 생겼고 카카오나 네이버에서는 그런 사람들 뽑게 되었다

그리고 프론트엔드와 백엔드 개발자를 합쳐 FULL STACK 개발자라는 용어도 생긴 것 같으다

실제로 백엔드 개발자인 내가 프론트엔드 개발환경을 만들어 보았는데 실로 많이 복잡하다 웹브라우저가 이해할 있는 HTML과 자바스크립트와 CSS를 구성하는 것이 기존과는 많이 달라졌다

그리고 아직도 여러가지 기술이 나오고 있고 기술들이 없어지고 있다
혼란기이기도 하다
그만큼 웹 기술들이 발전하고 있다는 증거이기도 하다

프로그래밍 언어 순위만 봐도 그렇지 않은가^^
http://istoryful.tistory.com/11


***참고로 프론트MVC프레임워크를 쓰면 백엔드에서 템플릿엔진을 쓰지 못한다
자바는 JSTL, NODEJS는 JADE, HANDLEBARS, EJS 등등이다

'프론트엔드 > 자바스크립트' 카테고리의 다른 글

Do it Vue.js 입문 정리4  (1) 2018.04.12
Do it Vue.js 입문 정리3  (0) 2018.04.04
Do it Vue.js 입문 정리2  (0) 2018.04.01
Do it Vue.js 입문 정리  (0) 2018.03.31
클린코드 자바 스크립트  (0) 2018.03.01