1) ! + tab
을 누르면 html 기본 틀이 나옴 (emmet)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
</body>
</html>
2) tr * 3
하면 tr 3개 생성
<tr></tr>
<tr></tr>
<tr></tr>
3) td.cn*3
하면 class가 cn인 td 3개 생성
<td class="cn"></td>
<td class="cn"></td>
<td class="cn"></td>
ES5까지 변수를 선언할 수 있는 방법은 var
키워드를 사용하는 것이었다. var
키워드에는 몇가지 특징이 있다.
함수레벨 스코프
var 키워드의 생략을 허용
변수의 중복 선언 허용
호이스팅
var
의 특징들은 전역 변수들과 많은 연관이 있는데 전역 변수는 코드의 복잡성을 증가시키는 원인이 된다.
ES6 에서는 이러한 var 키워드의 단점을 보완하기 위해 let
과 const
키워드를 도입하였다.
1. let과 const 예약어는 한번 선언한 똑같은 변수를 재선언할 수 없다.
let a = 10;
let a = 20; //Identifier 'a' has already been declared
2. const 예약어는 한번 할당한 값을 변경할 수 없다.
const b = 20;
b = 30; // Uncaught TypeError: Assignment to constant variable.
// 하지만 객체의 속성이나 배열의 요소는 변경이 가능하다. (주소값을 복사했기 때문)
const user = {
name: '최동욱',
age: 25,
};
console.log(user.name); // 최동욱
user.name = '홍길동';
console.log(user.name); // 홍길동
3. 수업에서는 let 과 const가 호이스팅되지 않는다고 하였지만 이는 엄밀히 말하면 맞지 않다.
var v = 10;
{
console.log(v);
let v = 20;
}
만약 let 이 호이스팅되지 않는다고 한다면 콘솔에 10이 출력되겠지만 직접 실행해보면 Cannot access 'v' before initialization
이라는 메세지가 출력된다. 변수가 생성될 때는 선언 , 초기화 , 할당 의 3단계를 거치는데 let과 const는 선언 단계만 거친 후 호이스팅되기 때문에 참조 에러가 발생한다.
property shorthand는 객체를 정의 할 때 객체의 key값과 value의 값이 같으면, key 와 value 값을 각각 표기하지 않고 한 번만 표기하는 것을 의미한다.
const id = ‘ssafy',
name = '싸피',
age = 3;
const member = {
id // id: id,
name // name: name,
age // age: age
};
ES5 문법에서 func
는 메서드로 info 함수를 프로퍼티에 할당하였고 ES6에서는 이러한 할당 자체를 콜론과 함수 키워드를 생략함으로서 간결한 문법을 제공해 주고 있다. 이러한 메서드 축약을 통해 메서드 본연의 역할에 충실할 수 있도록 제약할 수 있다. 자세한 내용
const id = 'ssafy',
name = '싸피',
age = 30;
const user = {
id,
name,
age,
// func : info(){ // ES5
info() { // ES6
console.log('user info : ' + this.id + ' ' + this.name + ' ' + this.age);
},
};
user.info();
비구조화 할당이란 배열이나 객체에 입력된 값을 개별적인 변수에 할당하는 자바스크립트 표현식이다.
const user = {
id: 'ssafy',
name: '김싸피',
age: 25,
};
// 기존 Object
{
let id = user.id;
let name = user.name;
let age = user.age;
console.log(id, name, age);
}
//비구조화 할당 (변수 이름을 다르게 할당할 수도 있다.)
{
let { id, name, age: ssafyage } = user;
console.log(id, name, ssafyage);
}
배열을 간단하게 펼쳐서 사용할 수 있다
// Spread Syntax (전개 구문)
const user1 = { id: 'ssafy1' };
const user2 = { id: 'ssafy2' };
const array = [user1, user2];
// array copy
const arrayCopy = [...array];
console.log(array, arrayCopy);
// 주의 : spread operator의 경우 값 복사가 아닌 주소를 가지고 오기때문에 값을 바꿀경우 모두 변경된다.
user1.id = 'ssafy5';
// add
const arrayAdd = [...array, { id: 'ssafy3' }];
console.log(arrayAdd);
// object copy
const user3 = { ...user1 };
console.log(user3);
// array concat
const team1 = ['대전', '광주'];
const team2 = ['구미', '서울'];
const team = [...team1, ...team2];
console.log(team);
// obejct merge(병합)
const u1 = { id1: 'ssafy1' };
const u2 = { id2: 'ssafy2' };
const u = { ...u1, ...u2 };
console.log(u);
// 주의점 : key가 같은 obejct를 병합 하게 되면 마지막 obj가 기존 값을 덮어쓴다.
const user = { ...user1, ...user2 };
console.log(user);
default parameter은 함수에 전달된 파라미터의 값이 undefined이거나 전달된 값이 없을 때, 초기값을 설정할 수 있다.
function print1(msg) {
console.log(msg);
}
print1('hello ssafy');
print1();
function print2(msg2 = 'inital msg') {
console.log(msg2);
}
print2('hello ssafy');
print2();
템플릿 리터럴은 내장된 표현식을 허용하는 문자열 리터럴입니다. 큰따옴표(“) 대신 백틱(`)을 사용하고, 변수을 넣고자 하는 부분에 ${} 키워드를 사용해 그냥 변수를 넣어서 사용할 수 있다. 템플릿 리터럴은 런타임 시점에 일반 자바스크립트 문자열로 처리/변환된다.
console.log(name + '(' + id + ')님 \n나이는 ' + age + '입니다.');
console.log(`${name}(${id})님 나이는 ${age}입니다.`); //템플릿 문자열
function 키워드 대신 화살표(=>)를 사용하여 보다 간략한 방법으로 함수를 선언할 수 있다.
// arrow function (화살표 함수)
// function(param) {code} 형태를 축약
// (param) => {code}
// 함수 이름이 없는 익명 함수 이므로 사용시 변수에 담아서 사용.
// (param) => {code};
// param => {code};
// () => {code};
// () => code;
// () => ({key: value});
//기존 방식
const func1 = function () {
console.log('익명 함수');
};
func1();
//화살표 함수
const func2 = () => {
console.log('화살표 함수');
};
func2();
//기존 방식
const func3 = function (num) {
console.log('익명 함수', num);
};
func3(3);
//화살표 함수
const func4 = (num) => {
console.log('화살표 함수', num);
};
func4(4);
const func7 = (num1, num2) => {
console.log('화살표 함수', num1, num2);
};
func7(6, 7);
// 매개변수가 2개 이상일 때 소괄호 없이 사용 x
// const func8 = num1, num2 => {
// console.log('화살표 함수', num1, num2);
// };
// func8(6, 7);
// 추가적으로 parameter와 화살표 사이에 개행이 불가능.
MVVM 패턴이란 모델과 뷰 사이에 뷰모델이 위치하는 구조이다. DOM이 변경됐을 때, 뷰모델의 DOM Listeners를 거쳐서 모델로 신호가 간다.
모델에서 변경된 데이터를 뷰모델을 거쳐서 뷰로 보냈을 때, 화면이 reactive하게 반응이 일어난다.
Model : 순수 자바스크립트 객체
View : 웹페이지의 DOM
ViewModel : Vue의 역할
vue는 view와 model을 연결하고 자동으로 바인딩하므로 양방향 통신을 가능하게 함
양방향 통신
: DOM이 바뀌면 스크립트단이 바뀌고 스크립트단이 바뀌면 DOM이 바뀐다
MVC패턴에서는 사용자의 요구를 컨트롤러가 받아서 모델에 데이터를 갱신해 달라고 했음 그리고 데이터를 가지고 화면단에 가서 요청했음 .
MVVM 패턴에서는 viewModel이 사이에 껴서 데이터 바인딩을 해줌
<!--html-->
<div id="app">
{{ message }}
</div>
//js
var app = new Vue({
el: '#app',
data: {
message: '안녕하세요 Vue!'
}
})
el에다가 나는 누구랑 연결할거다 라고 설정
data를 객체처럼 사용하기도 하고 함수처럼 사용하기도 하는데 함수처럼 하는게 일반적
<div id="app">
<h1>{{ msg }}</h1>
<script>
new Vue({
el: "#app", //id가 app인 애랑 연결하겠다
data() {
// 이 데이터를 div 안에 출력하겠다.
return {
msg: "안녕 Vuejs !!!",
};
},
});
</script>
</div>
루트 인스턴스 ( 뷰 인스턴스 )
양방향이기 때문에 텍스트가 바뀌면 화면이 바뀐다.
<div id="app">
<!-- html로 인식해라-->
<p v-html="msg"></p>
<script>
//뷰 객체 (어떤 엘리먼트랑 연결할지 어떤 데이터를 사용할지 어떤 메서드를 사용할지)
new Vue({
el: "#app", //id가 app인 애랑 연결하겠다
data() {
// 이 데이터를 div 안에 출력하겠다.
return {
msg: "<big>안녕</big> Vuejs !!!",
};
},
});
</script>
</div>
뷰가 렌더링하는 속도가 살짝 빠르다
리액트는 반복문하는 방법이 여러가지라 표준이없다 . 뷰는
redux vs vuex