vue.js
vue기본
코딩 화이팅
2023. 5. 1. 14:34
자스 복습
JavaScript
- 프로토타입 기반 객체 생성을 지원하는 동적 스크립트 언어
- 웹 브라우저에서 주로 사용, Node.js를 이용하여 콘솔 환경에서 사용
- 웹 브라우저의 UI를 제어하기 위해 만들어진 프로그래밍 언어
- 자바와 기본 구문이 비슷하다.(C언어의 기본 구문을 바탕)
HTML 자바 스크립트 사용
- <script></script> 태그를 사용
- 문서 내의 위치의 제약이 없다.
- 되도록이면 <body>안에 가장 밑에 쓰는게 좋다.

외부스크립트 참조하기
- .js 확장자를 가진 파일을 생성
- html 문서에서 <script src="외부파일의 위치"></script>

위부분은 작동하지 않는다.
변수(Variable)
- 자바스크립트의 변수 타입은 가리키는 값에 대한 타입을 나타낸다.
- var, let, const 키워드를 이용해서 변수를 선언
- undefined는 변수에 아무 값도 없어서 타입을 알 수 없는 경우를 말한다.
- var를 이용한 변수의 선언일 경우 중복 선언이 가능
- 동적 타입 : 대입되는 값에 따라서 용도가 변경되는 방식
- 문자, $, _로 시작, 대소문자 구분, 예약어 사용 x
- typeof 메소드를 활용하여 데이터 타입을 얻을 수 있다.
/*
식별자 규칙
1. 반드시 문자, $, _ 로 시작한다. (숫자로 시작x)
2. 대소문자를 구분
3. 예약어 사용불가
식별자 작성 스타일
camelCase : 변수, 상수, 함수명
PascalCase : 클래스, 생성자
UPPER_SNAKE_CASE : 상수(절대로 변하면 안되는 값)
*/
// var : 재할당, 재선언 모두가능, 호이스팅, 함수스코프
var z = 1
z = 10
var z = 11 //가능
// 호이스팅
//실제 코드
console.log(username)
var username = 'Bob'
// ----------------------
//자바스크립트가 인식하는 코드
var username
console.log(username) // undefined
username = 'Bob'
console.log(username) // Bob
// let => 재할당 가능, 재선언 불가능, 블록스코프
let x = 1
x = 2
// let x = 3 //SyntaxError: Identifier 'x' has already been declared
// const => 재할당 불가능, 재선언 불가능, 블록스코프
const y = 1
y = 2 //TypeError: Assignment to constant variable.
// const y = 2 //SyntaxError: Identifier 'y' has already been declared
// 블록 스코프 중괄호
const greeting = 'hi'
if (true){
console.log(greeting)
let name = 'Bob'
}
console.log(name) //에러
// let 과 const 둘다 마찬가지 에러
console.log(age)
let age = 99 //ReferenceError: age is not defined
숫자형
- 정수와 실수로 나누어 구분X(부동소수점 형식)
- 일반적인 숫자 외 특수 숫자 포함(Infinity, NaN...)
- e를 활용하여 거듭제곱 표현 가능
문자열
- " "로 감싼다.
- ' '로 감싼다.
- ` `(backtick)으로 감싼다.
- 여러 줄 입력이 가능-공백, 줄 넘김 유지
- 문자열 내 ${변수명}을 이용하여 변수와 문자열을 결합

자바스크립트 false
- 아래의 5가지 값은 false로 인식, 나머지 값은 true로 인식
- null
- undefined
- 0
- ' '(빈 문자열)
- NaN
일치 연산자
- 값과 타입이 일치하는지 체크
- ===, !==
- == : 자동으로 형변환을 해서 둘의 값을 비교
- === : type까지 일치해야 동일하다.

// Primitive Types
// 1. Number
// 2. String
// 3. undefined, null
// 4. Boolean
// Number
typeof 1
typeof Infinity
typeof -Infinity
typeof -1
typeof 3.14
typeof NaN
typeof -0
typeof 2.998e10
10 / 0 == Infinity
// String
const name = 'Bob'
const name2 = "Bob"
const line1 = "aaa'aaa"
const line2 = 'aaa"aaa'
const line3 = 'aaa\'aaa'
let age = 50
console.log(`${name}은 ${age}살이며 내년에는 ${age+1}살이 된다.`)
// Bob은 50살이며 내년에는 51살이 된다.
console.log(name+"은 "+age+"살이며")
// Bob은 50살이며
// undefined, null
// 둘다 값이 없음을 나타내는데 의도의 차이가 있다.!!!!!!
// Boolean
true, false
// 자바스크립트 false
null
undefined
0
''
NaN
조건문
// if, else if, else
// 조건은 소괄호 안에 작성(필수) 중괄호는 실행할 코드가 한줄 일때는 생략가능
// 하지만 사용을 하는게 조금 더 가독성이 있음
// 파이썬과는 다르게 else if 이다.
// switch (표현식) : 표현식의 결과값을 이용한 조건문
// case문의 값과 비교를 한다.
// break , default문은 선택적으로 사용이 가능하나 이로 인해 조금씩 기능의 차이가 있음
// 블록스코프
let month = 3
switch(month) {
case 3: {
console.log('봄~~~')
break
}
case 4: {
console.log('봄~~~')
break
}
case 5: {
console.log('봄~~~')
break
}
case 6: {
console.log('핫썸머~~')
break
}
case 7: {
console.log('핫썸머~~')
break
}
case 8: {
console.log('핫썸머~~')
break
}
default: {
console.log('봄에서 여름까지만 하자고~~ ')
}
}
// 중복된 값을 써야한다면 축약해서 작성가능
let month = 3
switch(month) {
case 3:
case 4:
case 5: {
console.log('봄~~~')
break
}
case 6:
case 7:
case 8: {
console.log('핫썸머~~')
break
}
case 9:
case 10:
case 11: {
console.log('가을이라네~~')
break
}
case 12:
case 1:
case 2: {
console.log('아이추워 겨울~~')
break
}
default: {
console.log('그거슨 우리나라의 월이 아니라네 ')
}
}
const nation = 'Korea'
switch(nation){
case 'Korea':{
console.log('안녕하세요')
}
case 'Chinese':{
console.log('你好')
}
default: {
console.log('Hi')
}
}
//출력결과는 3개의 인사말 모두 출력이된다~~ (break가 없어서... ㅎ)
// 기능1 : 상 확인
// 기능2 : 상하 확인
// 기능3 : 상하좌우 확인
// switch (기능?) {
// case 3:
// 좌우 확인 기능 구현
// case 2:
// 하 확인 기능 구현
// case 1:
// 상 확인 기능 구현
// break
// }
// 물론 각 기능별로 구현할 수 도 있지만 컴퓨터쟁이들은 중복을 싫어하는 경향이 있음
// 이때는 case 작성 순서도 매우 중요~
반복문
//while 생략
const numbers = [1, 2, 3, 4, 5]
// for (초기식; 조건식; 증감식){
// 코드
// }
// 돌아가는 순서 확인해보기~~~
for (let i = 0; i < numbers.length; i++){
console.log(numbers[i])
}
// for of
for (let number of numbers){
console.log(number)
}
const person = {
name: 'Bob',
age: '77'
}
//in : 객체를 가져와 쓸 때 사용
for (const key in person){
console.log(key, person[key])
}
배열(Array)
- 배열의 생성 : [] 또는 Array() 활용
- 배열의 크기는 동적으로 변경된다.
- 크기가 지정되어 있지 않은 경우에도 데이터의 입력 가능
- 배열은 여러가지의 데이터 타입을 하나의 배열에 입력할 수 있다.
- push 함수를 이용하여 데이터 추가 가능
/*
JS 의 배열(Array)
*/
let numbers = [1, 2, 3, 4]
numbers[0] // 가능
numbers.length // 길이
// .reverse()
numbers.reverse() // [4, 3, 2, 1]
numbers // [4, 3, 2, 1],원본 자체를 뒤집는다.
numbers = [1, 2, 3, 4]
// .push()
numbers.push('a') // 5 : numbers.length 를 return
numbers // [1, 2, 3, 4, 'a']
// .pop()
numbers.pop() // 'a' : pop 한 결과
numbers // [1, 2, 3, 4]
// .unshift()
numbers.unshift('a') // 5 : numbers.length 를 return
numbers // ['a', 1, 2, 3, 4]
// .shift()
numbers.shift() // 'a' : shift(dequeue)한 결과
numbers // [1, 2, 3, 4]
// .includes()
numbers.includes(4) // true
numbers // 변화 없음
// .indexOf()
numbers.indexOf(2) // 1 : 찾은 요소의 첫번째 idx 반환
numbers.indexOf(1234) // -1 : 없는 경우 -1 반환
numbers // 변화 없음
// .join()
numbers.join('-') // '1-2-3-4'
numbers // 변화 없음
const arr = [1, 2, 3]
/*
array helper methods 의 생김새
.forEach, .map, .find, .filter
arr.helperMethod(callbackFunction)
arr.helperMethod(function (arg) {})
*/
// .forEach(cb) => return 되는 값 없음 === 콜백 함수에 return 필요 없음
arr.forEach(function (num) {
console.log(num)
})
// for - of 의 대체제 느낌
for (const num of arr) {
console.log(num)
}
// .map(cb) => 콜백함수의 리턴값으로 만든 배열을 리턴
arr.map(function(num) {
return num * 2;
})
//위에걸 줄여서
arr.map(num => num * 2)
// 사용 예시
// 1.
const contents = ['hello', 'world']
const tags = contents.map(function (content) {
return `<h2>${content}</h2>`
})
tags.forEach(tag => document.write(tag))
// 2.
contents.map(content => `<h2>${content}</h2>`).forEach(tag => document.write(tag))
// .find(cb) => 콜백 함수의 리턴값이 true(혹은 true로 평가되는)
// 첫번째 요소만 리턴
arr.find(function (num) {
return num === 2
})
arr.find(num => num === 2)
const articles = [
{pk: 1, title: 'hi'},
{pk: 2, title: 'hello'},
{pk: 3, title: 'great'},
]
articles.find(article => article.pk === 3)
// .filter(cb) => 콜백함수의 리턴값이 true(혹은 true 로 평가되는)
// 요소만 모아서 배열로 리턴
arr.filter(num => num % 2)
// 사용 예시
const movies = [
{title: 'matrix', isAdult: false},
{title: 'kingsman', isAdult: true}
]
const adultMovies1 = movies.filter(function (movie) {
return movie.isAdult
})
const adultMovies2 = movies.filter(movie => movie.isAdult)
// .some(cb), .every(cb) => 배열 안의 하나라도 / 전부 콜백에서 return 하는 조건을 만족하면 t/f 를 리턴
arr.every(num => num > 0) // [1, 2, 3] => true, true, true => true
arr.every(num => num > 1) // [1, 2, 3] => false, true, true => false
arr.some(num => num > 100) // [1, 2, 3] => false, false, false => false
arr.some(num => num > 2) // [1, 2, 3] => false, false, true => true
/*
- 배열의 각 요소에 대해 주어진 `reduce` 함수를 실행하고, 하나의 결과 값을 반환
- reduce는 map, filter 등 여러 배열 메서드의 동작을 대부분 대체 가능
- 첫번째 매개변수인 콜백함수의 첫번째 매개변수(acc)는 `누적 값(전 단계의 결과)`
- 두번째 매개변수인 `initialValue`는 반환할 누적 값의 초기 값이고 없을 시 첫번째 요소 값이 누적 값
-reduce는 어려울 수 있으니 참고
*/
arr.reduce(function (acc, num) {
console.log(num, acc)
}, 0)
// 총 합 구하기
arr.reduce(function (acc, num) {
return acc + num
}, 0)
// 2씩 곱하기(map)
arr.reduce(function (acc, num) {
acc.push(num * 2)
return acc
}, [])
객체(Object)
객체는 문자열로 이름 붙인 값들의 집합체이다.(Key : Value)
/*
{key: value} => Object === 객체
1. key 문자열의 따옴표 삭제 가능(띄어쓰기 없을 때, 특수문자가 없을떄)
2. 접근할 때, ['key'] 와 .key 모두 가능
*/
const me = {
name: '둘리',
// 'phone number': '010123456789', => 가능하지만, key 도 변수명처럼 지을 것
greeting: '어서오고',
phoneNumber: '01012345678',
friends: [
'도우너', '마이콜', '또치'
],
home: {
address: '서울',
owner: '고길동',
}
}
/* ES6+ 축약 문법 */
// 1. key - value 가 같은 이름일 경우
// Old
var books = ['SSAFY_Java', 'SSAFY_JS']
var magazines = ['GQ', 'esquire']
var bookshop = {
books: books,
magazines: magazines,
}
// New
const books = ['SSAFY_Java', 'SSAFY_JS']
const magazines = ['GQ', 'esquire']
const bookshop = {
books,
magazines,
}
// 2. Object 안의 함수(메서드) 정의
// Old
var dooly = {
name: 'dooly',
greeting: function () {
console.log('어서 오고')
}
}
// New
const dooly = {
name: 'dooly',
// Arrow
greeting1: () => console.log('도우너,'),
// Function 키워드 대체용
greeting2 () {
console.log('어서오고')
},
}
// 3. Object Destructuring (비구조화)
// Old
var userInfo = {
name: '김싸피',
email: 'kim@ssafy.com',
phone: '0101234567',
}
var name = userInfo.name
var email = userInfo.email
var phone = userInfo.phone
// New 변수명과 key값이 같다면, 아래와 같이 작성 가능
const userInfo = {
name: '김싸피',
email: 'kim@ssafy.com',
phone: '0101234567',
}
// const { name } = userInfo
// const { email } = userInfo
// const { phone } = userInfo
const { name, email, phone } = userInfo
function printInfo({ name, email, phone }) {
console.log(`안녕 나는 ${name} ${email} ${phone} `)
}
printInfo(userInfo)



함수
- 자바스크립트에서 함수는 객체 타입으로 값처럼 사용이 가능하다.
- 함수를 변수에 대입하거나 매개변수로 넘길 수 있다.
- 매개변수의 개수가 일치하지 않아도 호출이 가능하다.
- JavaScript의 함수는 일급 객체에 해당
- 변수에 할당 가능
- 함수의 매개변수로 전달 가능
- 함수의 반환 값으로 사용 가능
함수 선언식
- 함수의 이름과 함께 정의하는 방식
- 함수의 이름
- 매개 변수
- 내용
- 호이스팅
함수 표현식
- 익명함수로 정의 가능
- 매개변수
- 내용
/*
함수 : 일급객체 (변수할당 가능 / 함수의 매개변수 전달 가능 / 함수의 반환값으로 사용 가능)
함수를 정의하는 3가지 방법
1. 선언식
2. 표현식
2-1. function
2-2. => (arrow function)
*/
// 1. 선언식 : function funcName() {}
function add(n1, n2) {
return n1 + n2
}
// 2-1. : const funcName = function () {}
const sub = function (n1, n2) {
return n1 - n2
}
// 2-2. : () => {} Arrow Function (~ES6)
/*
1. function 키워드를 지운다.
2. () 와 {} 사이에 => 를 넣는다.
--
3. 인자가 딱 1개라면, 괄호 생략 가능
4. 블록 안에 return 구문만 있으면 {} 와 return 모두 삭제 가능
//이 두 개는 비추천
* function(){} vs () => {}
내부에 this 키워드가 있으면 다르게 동작. 이외에는 모두 같음
*/
// original
let cube = function (n) {
return n ** 3
}
// 1, 2 번 적용시
cube = (n) => {
return n ** 3
}
// 3, 4 번 적용시
cube = n => n ** 3
// 3번 적용 불가능 할 경우
mul = (n1, n2) => n1 * n2
printer = () => console.log('hi')
// Default Arguments
function withOutDefaultArg(a, b) {
if (a === undefined) {
a = 0
}
if (b === undefined) {
b = 0
}
return a + b
}
function withDefaultArg(a=0, b=0) {
return a + b
}
Web Stroage
- Web Stroage API
- 키 / 값 쌍으로 값을 저장
- sessionStorage
- localStorage
- setItem(key, value)
- getItem(key)
- removeItem(key)
- clear()
- key(index)
- length
- 값은 반드시 문자열로 저장(JSON)
- parse : 문자열->객체
- stringify : 객체->문자열
spread
- 배열로 묶여 있는 값들을 각각의 개별 값으로 풀어준다.
- 문자열은 각각의 문자로 나눈다.
rest
나머지 값들을 모아서 배열로 만듦

Vue.js
- 사용자 인터페이스를 만들기 위한 progressive framework이다.
- 현대적 도구 및 지원하는 라이브러리와 함께 사용하면 정교한 SPA(Single Page Application)을 완벽하게 지원한다.
- Evan You에 의해서 만들어짐
특징
- Approachable(접근성)
- Versatile(유연성)
- Performant(고성능)
MVVM Pattern
- Model+View+ViewModel
- 애플리케이션 로직을 UI로 부터 분리하기 위해 설계한 디자인 패턴
- Model : 순수 자바스크립트 객체(데이터를 담기 위해 사용)
- View : 웹페이지의 DOM(HTML)
- ViewModel : Vue역할, View와 Model 사이에서 Data와 DOM에 관련된 일 처리

Vue.js를 사용하기 위해
CDN : <script src="http://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
=>vue.js devtools 브라우저에 추가
Vue사용해보기
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8" />
<title>Vue Start</title>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
</head>
<body>
<div id="app">
<h2>{{msg}}</h2>
</div>
<script>
//Vue 객체(인스턴스)를 생성
//el : 뷰객체를 마운트(연결) 엘리먼트를 설정
//1. CSS 선택자
//2. HTML 요소를 직접가지고와서 선택
const content = document.getElementById('app');
const app = new Vue({
// el: '#app', //CSS선택자
el: content, //HTML 요소 자체를 넣겠다.
data: {
msg: 'hello ssafy!',
},
});
</script>
</body>
</html>

Vue Instance 생성
- 모든 Vue 앱은 Vue 함수로 새 Vue 인스턴스를 만드는 것부터 시작
- Vue 인스턴스를 생성할 때는 Options 객체를 전달해야함.
Vue Instance - Options : el
- Vue 인스턴스에 마운트(연결)한 기존 DOM 엘리먼트 지정
- CSS selector or HTML Element 작성
- new를 이용한 인스턴스 생성때만 사용한다.
Vue Instance - Options : data
- Vue 인스턴스의 데이터 객체
- 객체 또는 함수의 형태로 작성 가능
- 컴포넌트를 정의할 때 data는 데이터를 반환하는 함수로 선언해야 함(일반 객체 사용 시 생성된 모든 인스턴스에서 동일 객체 참조 공유, 함수로 생성 시 새 복사본을 반환)
- 화살표 함수 사용 X
화살표 함수가 부모 컨텍스트를 바인딩하기 때문에 'this'는 예상과 달리 Vue 인스턴스가 아님.
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8" />
<title>Vue Start</title>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
</head>
<body>
<div id="app">
<h2>{{msg}}</h2>
</div>
<script>
//data : 사용할 데이터를 지정
//1. 객체 형태
//2. 함수 형태 (컴포넌트를 이용하면 무조건 이렇게 만들어야함.)
// const content = document.getElementById('app');
//밑에 2.HTML 요소를..방법인데 잘 안 씀
const app = new Vue({
//Vue 객체(인스턴스)를 생성
//el :뷰 객체를 마운트(연결) 엘리먼트를 설정
//1. CSS 선택자
//2. HTML 요소를 직접 가지고와서 선택
el: "#app", //CSS선택자(id선택자)
//1. 객체 형태
// data: {
// msg: 'hello ssafy!',
// },
//2-1. 함수형태
// data: function () {
// return {
// msg: "hello ssafy!!",
// };
// },
//2-2. 함수형태 (ES6+)
data() {
return {
msg: "hello ssafy!!!",
};
},
});
</script>
</body>
</html>

2-1 함수형태도 위와 똑같이 hello ssafy!!가 나온다.
Vue Instance - Options : methods
- Vue 인스턴스에 추가할 메소드
- VM 인스턴스를 통해 직접 접근 or Directive 표현식에서 사용가능
- 모든 메소드는 자동으로 this 컨텍스트를 Vue 인스턴스에 바인딩
- 화살표 함수를 메소드 정의하는데 사용X
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8" />
<title>Vue Start</title>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
</head>
<body>
<div id="app">
<h2>{{count}}</h2>
</div>
<script>
//Vue 객체(인스턴스)를 생성
//method : 사용할 함수를 정의하겠다.
const app = new Vue({
el: "#app", //CSS선택자
data() {
return {
count: 1,
};
},
methods: {
plus() {
this.count++;
//this는 app이라는 인스턴스를 의미
//count는 위에 count를 의미
console.log(this); //vue 인스턴스 객체
},
//아래의 화살표함수는 사용하는 것을 지양해라.... ㅎ
// plus2: () => {
// this.count++;
// console.log(this); //window 객체
// },
},
});
</script>
</body>
</html>

console.log(this)를 통해 Vue라는 객체도 같이 출력된다.