🔷 웹 사이트와 웹 어플리케이션의 사용자 인터페이스(UI)와 사용자 경험(UX)을 만들고 디자인하는 것
🔷 Client-side Frameworks
react
, 이번에 공부할 Vue
, 그리고 angular
가 있다.💡 물론 엄밀히 따지자면 react는 라이브러리다. 그냥 비교군으로 넣었다.
사용자는 이제 웹에서 문서만을 읽는 것이 아닌 음악을 스트리밍하고, 영화를 보고, 원거리에 있는 사람들과 텍스트 및 영상 채팅을 통해 즉시 통신을 하고 있다. 이처럼 현대적이고 복잡한 대화형 웹 사이트를 웹 어플리케이션(Web Application)
이라 부르며 JavaScript 기반의 Client-side frameworks 출현으로 매우 동적인 대화형 어플리케이션을 훨씬 더 쉽게
구축할 수 있게 되었다.
어플리케이션의 상태를 변경할 때마다 일치하도록 UI를 업데이트해야 한다. 이는 어플리케이션의 기본 데이터를 안정적으로 추적하고, 업데이트(렌더링, 추가, 삭제 등) 하는 도구가 필요하다는 것이다.
💡 SPA와 클라이언트 사이드 렌더링(CSR)에 대해서는 이전에 언급한 적이 있으니 이 정도까지만 알아보자.
🔷 사용자 인터페이스를 구축하기 위한 JavaScript 프레임워크
Evan You
(학사 : 미술 & 미술사, 석사 : 디자인 & 테크놀로지 / Angular 개발팀 출신)Vue3
가 최신 버전이다.1. 쉬운 학습 곡선 및 간편한 문법
2. 반응성 시스템
3. 모듈화 및 유연한 구조
4. 거대하고 활발한 커뮤니티
1. 선언적 렌더링 (Declarative Rendering)
2. 반응형 (Reactivity)
🖥 맛보기
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8" />
<title>FirstVueApp</title>
<script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>
</head>
<body>
<div id="app">
<h1>{{ message }}</h1>
<button @click="count++">Count is: {{ count }}</button>
</div>
<script>
const { createApp, ref } = Vue;
const app = createApp({
setup() {
const message = ref("Hello vue!");
const count = ref(0);
return {
message,
count,
};
},
});
app.mount("#app");
</script>
</body>
</html>
💡 크롬 확장프로그램에서
vue.js devtools
를 찾아 다운받으면 이렇게 컴포넌트 확인이 쉬워진다. 리액트 쓸 때 스토리북 와리가리하면서 바쁘게 움직였던거 생각하면 이게 나을지도 모르겠다. 참고로 리액트 버전도 있다.
🔷 Vue를 사용하는 방법
1. CDN
방식
<script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>
NPM
방식 (CDN 방식 이후 진행)🖨 Vue 첫 번째
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
<!-- 1. CDN 추가 -->
<script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>
</head>
<body>
<div id="app">
<!-- 6. 꺼내어 사용할 때는 .value가 필요 없다. -->
<p>{{message}}</p>
<!-- 자바스크립트 표현식도 사용 가능 -->
<p>{{message.split('').reverse().join('')}}</p>
</div>
<script>
const { createApp, ref } = Vue; //구조 분해 할당
//2. Application Instance 생성
const app = createApp ({
setup() {
const message = ref("Hello Vue!"); //4. 변수 사용을 위해 ref메서드로 감싸서 초기화
console.log(message);
console.log(message.value);
//5. 템플릿에서 사용하기 위해 반환 -> 객체 타입으로 반환
return {
message,
};
},
});
// 3. dom 연결(mount)
app.mount("#app");
</script>
</body>
</html>
🔷 createApp()에 전달되는 객체는 Vue 컴포넌트 (Component)
🔷 Application instance
🔷 app.mount()
🔷 ref 함수
.value
속성이 있는 ref 객체로 래핑(wrapping)하여 반환💡 템플릿에서 ref를 사용할 때는 .value를 작성할 필요가 없다.
🖨 Vue eventListener 맛보기
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Vue</title>
<script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>
</head>
<body>
<div id="app">
<!-- v-on: 이벤트 지정, '@'로 대체할 수 있음 -->
<button v-on:click="increment">{{ count }}</button>
</div>
<script>
const { createApp, ref } = Vue;
const app = createApp({
setup() {
const count = ref(0);
const increment = () => {
count.value++;
}
return {
count,
increment,
}
}
});
app.mount("#app");
</script>
</body>
</html>
누르면 숫자가 늘어난다. 반응형 변수기 때문에 가능하다. 이게 무슨 말이냐면
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
<script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>
</head>
<body>
<div id="app">
<div>반응형 변수: {{ reactiveValue }}</div>
<div>일반 변수: {{ normalValue }}</div>
<button @click="updateValues">값 업데이트</button>
</div>
<script>
const { createApp, ref } = Vue;
const app = createApp ({
setup() {
const reactiveValue = ref(0); //반응형 변수
const normalValue = 0; //그냥 변수
const updateValues = () => {
reactiveValue.value++;
normalValue++;
}
return {
reactiveValue,
normalValue,
updateValues,
};
},
});
app.mount("#app");
</script>
</body>
</html>
이 경우에 반응형 변수는 버튼을 누르면 바로바로 숫자가 업데이트 되지만 일반 변수는 콘솔창에 오류 표시가 뜰 뿐, 숫자가 바뀌지 않는다.
🖨 unwrap
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
<script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>
</head>
<body>
<div id="app">
<div>{{ object.id + 1 }}</div>
<div>{{ object["id"] + 1 }}</div>
<div>{{ object.id }}</div>
<div>{{ object.id.value }}</div>
<div>{{ object.id.value + 1 }}</div>
<div>{{ object["id"] }}</div>
<div>{{id}}</div>
<div>{{id+1}}</div>
</div>
<script>
const { createApp, ref } = Vue;
const app = createApp ({
setup() {
const object = { id: ref(0) };
const { id } = object;
return {
object,
id,
};
},
});
app.mount("#app");
</script>
</body>
</html>
리액트랑 비슷해서 익숙한 맛이 난다.