캡틴 판교(장기효) 님의  [Vue로 구현하는 PWA] 강의를 듣고 중요 내용을 요약하여 정리합니다.

아래 깃헙 블로그에서 가독성 좋게 보실 수 있습니다.

https://nuatmochoi.github.io/notesite/03.html

 

Directives, npm, Vue CLI, Component | Vuejs Lecture Note

Directives, npm, Vue CLI, Component 디렉티브 디렉티브는 화면에 뿌려주는 과정을 편하게 하기 위함. v-bind : 값(data)을 연결할 때 v-on : 이벤트를 연결할 때 v-if : false와 true로 변경함에 따라 tag의 보이는 유무를 제어 (false일 때 element tag에서 완전히 제외된다) v-show : v-if와 비슷하게 화면에 보이는 유무를 제어 (v-if와 다른점은 css의 display 속성이 n

nuatmochoi.github.io


디렉티브

디렉티브(v- 로 시작하는 것) 는 화면에 뿌려주는 과정을 편하게 하기 위함.

 

v-bind : 값을 연결할 때

v-on : 이벤트를 연결할 때 

v-if (조건) : false, true로 변경함에 따라 tag의 보이는 유무 제어 (false일 때 element tag에서 아예 제외된다)

v-show : v-if와 같이 화면에 보이는 유무 제어 (다른 점은, v-show는 css의 display 속성이 none으로 바뀌는 것이기 때문에, DOM으로는 남아 있다)


npm

- https://joshua1988.github.io/webpack-guide/build/npm-module-install.html#npm-%EC%84%A4%EC%B9%98-%EB%AA%85%EB%A0%B9%EC%96%B4

- http://jeonghwan-kim.github.io/series/2019/12/09/frontend-dev-env-npm.html

 

npm

- https://www.npmjs.com/package/vue

- 버전 관리를 용이하게 하기 위함

- 버전이 다르다면 가져온 라이브러리가 호환이 안될 수도 있기 때문에, 그것을 해결하기 위해 npm이 필요함

 

npm i @vue/cli -g로 설치한다 ( === npm install @vue/cli -global)

npm init -y (모든 option을 yes로 처리) -> package.json 생성

package-lock.json : 특정 라이브러리를 설치할 때 또다른 라이브러리를 설치해야 할 수도 있기 때문에 생기는 것

 

npm i jquery와 같이 라이브러리를 install 하면

"dependencies": {
	    "jquery": "^3.4.1"
}

node_modules 폴더 밑에 jquery 폴더가 생기고, 가져다 쓸 수 있음

ES6 에서는 CDN 방식(script)로 접근하지 않고, import로 라이브러리에 접근한다.

 

npm i jquery-ui@1.10.5 처럼 @+ (버전) 으로 특정 버전을 설치할 수 있다.

 

package.json에 필요한 모든 패키지가 명시가 되어 있으므로, node_modules를 제외하고 새로운 폴더로 옮긴 후에, npm i 명령어를 통해 옮긴 후에 node_modules를 생성하는 식으로 프로젝트 위치 변경 용이하다. 따라서 git으로 올릴 때에도 package.json과 package-lock.json을 같이 올리는 것이 좋다.


Vue CLI

 

CDN은 인터넷 연결이 되지 않으면 사용 불가

setup된 project에서 개발하기 위해 Vue CLI를 쓰는 것임 (명령어로 프로젝트 구성하는 도구)

 

1. vue create todo-app (프로젝트 생성, 생성 option은 사전 설정 없으면 defalut로 하면 된다)

2. cd todo-app

3. npm run serve (프로젝트 실행)

 

vue! : vscode에서 .vue 파일로 개발할 때 single file component(html+css+js) 자동 생성 단축키

 

vue cli가 live server로 열리지 않는 이유 : HTML, CSS, JS는 브라우저가 인식 가능하지만, Vue 파일은 인식할 수 없기 때문이다.

 

vue cli에서 서버 명칭 : webpack-dev-server

로딩해주는 것 : vue-loader

-> 이러한 잡다한 부분을 vue-cli의 최신 버전들은 @vue-cli 폴더 등에 넣어놓음


eslint error overlay 해제

VS Code에서 eslint 관련 에러를 뜨지 않게 하려면

project에 vue.config.js 파일 생성한 후에 아래와 같이 타이핑하고 저장

module.exports = {
    devServer: {
        overlay: false,
    }
}

Javascript 모듈화

(function(){
...
})(); 

즉시 실행함수 : function 전체를 ()로 감싸고 끝날 때 ()를 붙여준다.


Component

component는 components 폴더 안에 작성할 것으로 권고됨

 

app.vue에서 component를 들고 오기 위해

app.vue에서

import TodoHeader from "./components/TodoHeader.vue";

(vim + tab으로 자동완성 쉽게 가능) 

export default {
  components: {
    "todo-header": TodoHeader
  }
};

이렇게 컴포넌트 등록할 수 있음 

 

component가 data를 참조하지 않게 하기 위해

//data : {} 객체로 만들면 에러가 난다.
    //컴포넌트에 data를 선언할 때는 function 형태여야 한다.
    data() {
        return {
            inputText: '',
        };
    },

v-model

v-model : 양방향 데이터 바인딩

<input type="text" v-model="inputText" />
<button v-on:click="addItem">add</button>
addItem: function() {
            var value = this.inputText;
            localStorage.setItem(value, value);
            this.clearInput();
        },

 

localStorage.setItem(‘1’, ‘item 1’) 

: 껐다가 다시 켜도 local storage에 저장되어 있음


v-for

<li v-for="(item, index) in todoItems" :key="index">
                {{ item }}
</li>

 

v-for를 돌 때에 key값은 idx 혹은 id로 구별한다.


created (in 라이프사이클)

component가 생성되자마자 호출된다.


Container presentational component

- https://medium.com/@dan_abramov/smart-and-dumb-components-7ca2f9a7c7d0

캡틴 판교(장기효) 님의  [Vue로 구현하는 PWA] 강의를 듣고 중요 내용을 요약하여 정리합니다.

아래 깃헙 블로그에서 가독성 좋게 보실 수 있습니다.

https://nuatmochoi.github.io/notesite/02.html

 

Event, Instance, Component, Axios | Vuejs Lecture Note

Event, Instance, Component, Axios Event Addeventlistener()는 onclick()과 비교했을 때 DOM이 많아졌을 때, 여러 개의 이벤트 타입들을 쉽게 바인딩할 수 있기 떄문에 사용한다. 이처럼 Vue에서는 v-on을 사용하여 버튼의 역할에 대해서 알기가 쉽다. 즉, 오브젝트가 변경되었을 때, Vue가 알아서 처리를 해주는 것이 용이한 부분이다. 카멜케이스와 파스칼케이스 카멜케이스는 appleBananaPinea

nuatmochoi.github.io


<event>

Addeventlistener -> dom이 많아졌을 때, 길어져서 관리하기 힘들다

-> vue에서는 v-on

<button id="btn" v-on:click="logText">click me</button>

ㄴ 버튼의 역할에 대해서 바로 알 수 있다.

Object가 변경되었을 때 vue가 알아서 처리


<카멜케이스와 파스칼케이스>

 

카멜 케이스 – appleBananaPineapple

파스칼케이스 – AppleBanananPineapple 


<Vue Instance>

인스턴스 -> object를 생성자(new~)로 만든 것

Vue 3버전 -> proxy 로 object 관리

 

    <script>
    	var vm = new Vue({
        	el: '#app'      
        })    
    </script>

https://vuejs.org/v2/api/#el

 


 

<뷰 컴포넌트>

 

- 디버깅이 쉽고, 재사용률 높아짐

- 컴포넌트 이름 : { 컴포넌트 내용} -> <body>의 <div id=’app’> 태그에 컴포넌트 표시

- 전역 컴포넌트 -> 어떤 컴포넌트 있는지 보기 힘듬 -> 지역 컴포넌트로 선언 대다수

 

일반적으로는 컴포넌트의 template을 사용해서 tag를 정의하지만

중복되는 경우에 HOC (high order component)를 사용 (with render function & jsx)

https://kr.vuejs.org/v2/guide/render-function.html?

vuejs에서 권고되는 방법은 mixins 이나 scoped slot(data 중복시) 사용

react 에서는 함수 => 함수 => 이런 식으로 사용

 

 


 

vue 파일에서 

<template> - html

<script> - js

<style> - css

 


<Vue Component 간 통신>

 

React 는 data를 아래서 위로 올릴 수 없다

Vue는 아래서 위, 위에서 아래 둘다 가능

ㄴ 상위 -> 하위 (props 전달)  ::: flux 구조 (MVC pattern이 아님)

ㄴ 하위 -> 상위 (이벤트 발생)

 

Props (상위에서 하위로 data 보내기) : v-bind

Appheader.title -> vue는 이런 식으로 참조 불가능!! 하기 떄문에 props 사용

 

<app-header v-bind:프롭스 속성이름 ="상위 컴포넌트의 데이터 이름"></app-header>
<app-header v-bind:propsdata ="title"></app-header>

 

components : {        
	// '컴포넌트 이름' : '컴포넌트 내용' 
    'app-header' : {   
    	template : '<h1> {{propsdata}} </h1>',    
        props: ['propsdata']           
        } 
}

 

https://vuejs.org/v2/guide/components-props.html#Prop-Validation

 

Event (하위에서 상위로 data 보내기) : v-on

Vue.component('app-contents', {    
		template : `      
        	<main>             
        		전역 컴포넌트        
            	<button v-on:click="sendEvent">변경</button>       
            </main>`,          
        method : {             
            sendEvent: function() {      
                this.$emit('change'); //아래서 위로 올릴 때 $emit 사용            
            }          
        }        
})

 

<app-contents v-on:하위 컴포넌트의 이벤트이름="상위 컴포넌트의 메서드 이름"></app-contents>

<VSCODE prettier 설정>

Prettier -> setting -> prettier 검색

Format on save 체크


Vue.component("sibling-component", {  
	props: ["propsdata"], 
    template: `    
    	<div>     
        	{{ propsdata }}      
            <button> click me </button>   
            </div>`
});

//vue component에는 최상위에 하나의 tag만 있어야함(<div>) 
//이러한 문제로 프론트가 컴포넌트 설계하고, html,css 퍼블리셔에게 요청

케밥 표기법 (change-message) (changeMessage)가 아님!

->  이렇게 안쓸거면 change:message

->  v-on:change:message === @change:message

 


<Vue와 React 비교>

[Vue.js]

-       화면 렌더링 라이브러리 (vue.js 코어 라이브러리)

-       페이지 전환 라이브러리 Vue Router

-       여러 컴포넌트의 데이터 관리 라이브러리 Vuex

-       프로젝트 생성 도구 Vue CLI

-       테스팅 도구 Vue Test Utils

-       (X) HTTP 통신 라이브러리 Vue Resource -> 원래 프로젝트에서 붙이기 쉽게 하기

         -> jQuery ajax / axios / request 등 다양하게 씀

 

[React]

-       화면 렌더링 라이브러리 (코어)

-       여러 컴포넌트의 데이터 관리 라이브러리 1 Redux

-       여러 컴포넌트의 데이터 관리 라이브러리 2 Mobx

-       React Router

-       React CLI (Create React App)


<Axios>

Axios -> promise based

 

new Vue({    
	el: "#app",     
    data: {          
    	users: []   
    },      
    methods: {    
    	getData: function() { 
        	var vm = this;      
            axios             
              .get("https://jsonplaceholder.typicode.com/users/") //test api   
              .then(function(response) {     
              	console.log(response.data);       
                vm.users = response.data;        
              });         
        }       
    }      
});

 

fetchData : function(){ //http protocol 요청 method 4개     
				axios.get()    
                axios.post()       
                axios.put()     
                axios.delete()        
            }

 

Callback 함수안의 this-> var vm=this 처럼 선언하지 않으면 this가 window(브라우저)를 가리킨다.

 


<비동기>

var data = axios.get(url);

이렇게 쓸수없다!!!!

 

Single thread -> 비동기 처리를 받아오기 위해서 다른 작업을 못하는 것

  • html-webpack-plugin
  • module.exports 와 exports의 차이
  • service worker란
  • npm anywhere의 작동 원리? 필요성?
  • 다양한 deploying methods의 장단점 (gh-pages, netlify, firebase, surge, heroku, now)

 

2020.03.07 추가

  1. service worker는 PWA에서 사용. 해당 내용 추가할 예정
  2. npm anywhere은 static file server라서 npm run serve와 비슷하지만, 많이 사용되지 않음. 하지만 webpack dev server와는 별개이다. static file server와 webpack dev server 차이에 대해서도 게시물 추가할 예정

 

 

VuePress를 사용하여 gh-pages에 블로그를 deployment 하는 과정에서 

3개의 검정색 정사각형이 나타나며, VuePress의 기본 template이 깨지는 현상이 있었다.

sidebar-button을 가리키는 div tag에 생긴 에러였다. 

 

이게 local에서 vuepress dev로 localhost 포트를 열어서 확인할 때는 괜찮은데, 

github에 deploy했을 때 깨지는 것이어서 구글링하며

뭐가 잘못됐는지 확인하려고 쓸데없이 엄청 커밋을 많이 했다.


 

해결법은 .vuepress 폴더 아래의 config.js에 아래 그림과 같이

 해당 프로젝트의 github에 저장소에 해당하는 이름을

 

base : '/<repository>/'

 

이렇게 추가해주면 해결된다. 

 

 

Custom elements in iteration require 'v-bind:key' directives. 

라는 에러에 대한 해결법입니다. 


vuejs로 Todo list 만드는 강의 보면서 코드 작성하다가

eslint-plugin-vue로 자꾸 v-for 디렉티브에는 v-bind:key 추가하라는 error에 걸려서 

계속 구글링하다가 답을 찾아서 메모합니다 :)

 

2.2.0 이상에서 v-for 는 key가 필수입니다.

v-for를 돌 때에 key값은 index 혹은 별도의 id로 구별합니다.

<li v-for="(item, index) in todoItems" :key="index">
                {{ item }}
</li>

 

vue.js 공식문서에서 답을 찾았습니다

: https://kr.vuejs.org/v2/guide/list.html#v-for-%EC%99%80-%EC%BB%B4%ED%8F%AC%EB%84%8C%ED%8A%B8

+ Recent posts