캡틴 판교(장기효) 님의  [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