소파에서 개발하기

[노마드] 모멘텀 클론코딩 본문

프론트엔드 공부/클론코딩 실습

[노마드] 모멘텀 클론코딩

couch 2022. 1. 19. 22:36

강의 메모

니꼬쌤 사랑해요

#2 [2021 UPDATE] WELCOME TO JAVASCRIPT

더보기

#2.3 const and let (09:45)

const : 바뀌지 않을 변수

let : 후에 변경 가능한 변수

var : 예전엔 이것만 있었다. 변경 가능. 쓰지 말 것.

#2.4 Booleans (07:22)

null : '아무것도 없음'의 의미. 절대 자동적으로 발생하지 않고, '이 변수는 비어 있음'을 js에게 알려주기 위해 코더가 일부러 적어 넣는 데이터타입.

undefined : 어떤 변수가 생성(let)되기는 했는데, 정의(=)된 값이 없을 때 js가 표시하는 데이터타입.

 

#2.10 Recap II 

  • 함수 : function( );
    • 코드의 캡슐화!
    • () 안 매개변수(place holder)는 아무거나 상관 없고, 함수 안에서만 존재한다.
    • () 는 재생버튼과 같다
  • 배열 : array[  ];
    • 안에 어떤 데이터타입이든(undefined 포함) 다 들어갈 수 있다!
    • const 로 생성해도 array 안의 구성요소는 업데이트 가능!
  • 객체 : object {  } ;
    • Property들이 무엇을 의미하는지 이름표를 달고 싶다면 객체 활용!
    • object.new = "oneMore";로 언제든지 추가 가능

** 결과값을 반환(return)받고 싶은 경우, 담아 갈 바구니(var)를 준비

#3 [2021 UPDATE] JAVASCRIPT ON THE BROWSER

더보기

#3.0 The Document Object

'document'란, javascript의 관점으로 본 html 코드다.

  1. 즉, js는 html을 커다란 하나의 object로 본다.
  2. html의 title 태그는 js에서 document.title이다.
  3. js에서는 object의 property의 값을 update 할 수 있다.
  4. js에서 document.title의 값을 업데이트하면!? - 읽고, 수정하고, 반환해서 BOOM! -  html의 값이 바뀐다.

보다 보니 분명히 생코 할 때 썼던 건데 이해를 못 하고 썼군

css도 js 방식으로 활용할 수 있다.

getElementBy~ : js 방식으로 가져오기. 해당하는 모든 값을 array로 가져옴.

querySelector : css 방식으로 가져오기. css식으로 class나 id를 지정 + 그 밑의 정보까지 특정해서 1개만 가져옴.

querySelectorAll : css 방식 + array로 다 가져오기

맞아 그래서 뒷동산 색깔 바꾸기가 안 됐지.. array에 색이 어딨어 ^^

그리고 html태그에 적용된 css 속성도 html과 같은 방식으로 js에 끌어다 변경할 수 있음.

예를 들면 title.style.color = "green"; 놀랄 노.

 

 

#3.3 Events (12:38) ~~

 
Event를 작동시키려면
  1. 반응시키고 싶은 HTML element를 가져온다(버튼이 아니어도 된다!!)
  2. 원하는 자극을 설정한다 (click, point, down, ...)
  3. 원하는 반응을 function으로 만든다 (알림창 띄우기, 색깔바꾸기, ...)
  4. 자극이 오고 있는지 들어 줄 감시자에게 명령한다.

     HTMLelement . addEventListener ( "자극" , 반응 ) ;    <--- 여기 반응 함수에는 () 붙이지 않는다! 우리가 재생버튼 눌러버리면 애초에 그 실행값이 들어간다! 요렇게 감시자 붙어 있는 채로 JS한테 넘겨주고 때 되면 알아서 재생버튼 누르라고 해야 한다!

아니면 onclick이라는 property(자극)에 handleTitleClick이라는 함수(반응)을 정의할 수도 있다! 

     HTMLelement . on~~~ = 반응 ;   <------- 니꼬쌤은 listener 삭제할 수 없어서 추천하지 않음

이벤트 짱재밋다,, 이렇게 재밌는 거였어??

* html의 <body> <head> <title> 등은 js에서 따로 변수 지정해 읽어오지 않아도 document.body 의 객체.태그 형태로 불러 올 수 있음!

#3.7 CSS in Javascript part Two (09:34)

 계속 너무 satisfying한 내용이 나와서 강의를 못 끊겠다 ㅋㅋㅋㅋㅋ

위의 내용을 모두 이해하고 활용할 수 있게 됐음에도 불구하고, 스타일 변경은 css에서 하는 게 좋다!

  1. css 에서 class값으로 원하는 '반응(.~~)'을 넣어둔다.
  2. js의 자극function을 통해 목표 태그에 '반응(.~~)'을 업데이트한다. 즉, js->html->css 의 흐름으로 영향을 미침!
  3. 조건에 따라 class 값을 넣었다 뺐다 해야 한다면!?  ---> 덮어쓰기 해서 다른 class에는 영향을 미치는 일이 없도록 classList를 이용한다! --> classList는 class 내의 element를 조작하도록 허락 --> contains는 있는지 없는지 확인, add는 넣고 remove는 뺌.
  4. 아니면 그냥 classname.toggle을 쓴다 ^^ 매개변수가 있으면 없애고, 없으면 만들어주는 코드

치트키 배우는 거 안 좋아했는데, 과정도 배우고 치트가 필요한 이유도 배웠다 ^^

#4 [2021 UPDATE] LOGIN

필기 내용이 저장이 안 됐나보다 슬프다 ^^

더보기

#4.1 Form Submission (08:38) + #4.2 Event object (10:56)

input 안에 있는 button을 누르거나 type이 submit인 input을 클릭하면

값이 submit되는 동시에 페이지가 새로고침됨 <------ 이 부분이 맘에 안 든다면

&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;form&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;gt;안에서 required, maxlength 등을 이용하면 브라우저가 알아서 잘 입력되고 있는지 감시해 줌

 

WHY?

submit event가 일어나면 js가 onLoginSubmit의 괄호(argument, 매개변수) 안에 다양한 정보를 objet 형태로 담아 줌(제출자, 제출시간, 마우스 좌표 등 + 몇 가지 함수).

그런데 새로고침되면 이런 정보들이 날아가므로, 담겨 있는 preventDefault()를 써서 브라우저의 기본동작을 막음.

 

#4.4 Getting Username (11:12)

어떻게 하면 input받은 username을 새로고침해도 계속 기억할 수 있을까?

-> localStorage 활용하기!

 localStorage의 많은 method 중 'localStorage.setItem(Key, Value)'을 활용하면 브라우저에 object를 만들 수 있음.

사용자명, 유튜브 볼륨 크기 등등 사용자 설정 저장 가능. 가져오려면 localStorage.getItem(Key) 이용.

 

#4.6 Loading Username (10:07)

const savedUsername = localStorage.getItem(USERNAME_KEY);
if(savedUsername === null)

localStorage에 username이 없으면 -> login 페이지 show,  greeting 페이지 hidden

localStorage에 username이 있으면 -> login 페이지 hidden,  greeting 페이지 show

#5 [2021 UPDATE] CLOCK

더보기

#5.0 Intervals (05:37)

#5.1 Timeouts and Dates (08:46)

* Interver = 일정한 시간 간격으로 동작을 반복실행 시켜주는 도구 (첫번째 실행도 시간 센 다음에 실행)

setInterval( 실행할 동작 , 시간간격 ms ) ;    <--------- 1000ms = 1초

timeout = 일정 시간 이후에 동작이 실행하도록 하는 타이머

setTimeout( 실행할 동작, 기다릴 시간 ms )

  

* new Date() 함수에서 각각의 요소 떼어오기

WHY? 앞에 new라고 붙이는 이유?

Date는 function 이다.

JavaScript에는 생성자 함수라는 것이 있다(여러개의 동일한 property를 가지는 object를 생성하기 위해서 필요).
new 를 선두에 쓰고 생성자 함수를 호출하면 instance object를 반환한다.

 

1초 간격으로 새 object를 생성해 반환하는 시계

1: 페이지 로드한 그 순간의 시간&amp;amp;amp;amp;amp;amp;amp;amp;amp;nbsp; &amp;amp;amp;amp;amp;amp;amp;amp;amp;nbsp;2: 로드하고 1000ms 후의 시간
padStart : string 앞에 padding / padEnd : string 뒤에 padding

#6 [2021 UPDATE] QUOTES AND BACKGROUND

더보기

#6.0 Random Quotes (10:14)

랜덤으로 인용구 가져오기

1. 랜덤 number 불러오기

*Math.random()에다가 '숫자'를 곱하면, 0과 그 '숫자' 사이에 있는 number가 랜덤하게 반환됨.

   즉 0 이상 < ___ < '숫자' 미만

 

* 랜덤값은 float다. int로 만드는 방법은

Math.round(  ) <--- 반올림

Math.ceil(   )    <--- 올림

Math.floor(   )  <--- 내림

 

*number를 string으로 만드려면 String()으로 감싸기

 

2. 인용구 array에서 [몇 번째 것을 꺼내 올 것인가] <-----여기에 Math.random을 활용

[노란 부분]이 다 숫자. 랜덤한 값이 들어가게 된다.

 

#6.1 Random Background (08:45)

* 윈도우 시작화면 이미지 저장하는 법 : https://questionblock.tistory.com/52 

 

 ***append 스파르타에서 대충 배워서 아리까리 하다!

append : 끝에 달기

preppend : 앞에 달기

 

#7 [2021 UPDATE] TO DO LIST

더보기

#7.3 Saving To Dos (07:26) ~

새로고침해도 살아남는 todolist를 만들려면 localstorage에 저장을 해야 하는데,

배열 자체로는 못 하고 텍스트 형식으로만 저장 가능.

그래서 배열생성 -> 텍스트로 변환(JSON.stringify) 후 localstratge에 저장 -> localstorage에 뭔가 들어 있다면 배열로 변환(JSON.parse) 후 사용하는 3단계를 거쳐야 함. 

참고(json에 대해): https://velog.io/@surim014/JSON%EC%9D%B4%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80

 

그리고 코드에서 todos(즉, todo 배열)이 empty 인 상태로 시작하게 되는데,

새로고침 했을 때 localstorage에 뭔가 들어있다면 그걸 각각(forEach) 꺼내서 print 해줘야 한다.

 

#7.6 Deleting To Dos part One (10:23)

이제 반대로 페이지에서 삭제하면 localstorage에서도 삭제되어야 한다.

즉, 삭제하고 싶은 걸 뺀 array를 update하면 된다.

그런데 어떻게 사용자가 지우고 싶은 todo를 특정해 빼낼 것인가?

  ---> 저장 시점(Date.now)을 각각의 todo에 id 값으로 주기 

  1. 사용자가 todo를 submit하면, text와 id 값을 담은 newTodoObj 만들어진다.
  2. newTodoObj를 todos에 push한다 (storage에 있다가 새로고침 시 paint됨)
    1. newTodoObj는 todos에 들어간 채 stringify되어 localStorage에 저장되었다가
    2. 새로고침되면 parse되어 다시 object의 형태를 찾는다.
    3. 이대로 paintTodo에 들어간다.
  3. newTodoObj를 paintTodo에 넣는다
    1. 이제 paintTodo는 단순히 text값을 받아 그걸로 li를 만들어 print하는 게 아니라, objet를 받아 각각의 key를 다른 곳으로 보낸다.
    2. newTodoObj.text는 기존대로 span의 innertext로 보낸다.
    3. newTodoObj.id는 todoLi의 id 값으로 보낸다.

#7.7 Deleting To Dos part Two (13:04)

filter 문법 : array.filter(function)  <--- function에 필터링 조건이 들어 있어야 함

filter()의 기능은 forEach()와 비슷하지만, 안에 들어가는 함수 sexyFilter에 array의 item [1, 2, 3, 4]를 넣어 실행한 뒤 조건에 true인 것만 유지하고 false인 것은 빼는 것이다.

이걸 delTodo에 적용해 보면, todos에 저장된 값 중에 선택된 id값을 제외한 새 array로 업데이트 해야 한다.

새로 정의해야 할 건 없다.

todoLi : 선택된 항목의 상위 <Li> 태그

todoLi.id : 선택된 항목의 상위 <Li>태그의 id값  <--- Date.now 값이므로 number임. todo.id는 stringify되어 string이므로 다시 parseInt 해줘야 함수가 작동.

이후 update된 array를 localStorage에까지 업데이트 해 줘야 완전히 끝.

#8.0 Geolocation (07:27)

더보기

 

 

 

 

 

 

 

 


오늘의 실수(22.01.24)

함수 안에서 정의된 변수는 그 밖에서는 사용할 수 없고, 다른 방식으로 불러오던가 정의해야 한다.

그걸 잊고 로그인 함수에서 정의한 local variable을 로그인 확인 함수에서 썼더니 정의 안 됐다고 오류 나고 난리 났음 ㅠ

함수의 value -> 로컬스토리지에 저장-> 로컬스토리지 value 불러오기 요렇게 가자.

똑같은 argument 여기저기서 쓰다가 헷갈리면 큰일 날 수도 있겠다;

 

*js에서 모든 함수는 실행 시 최상단으로 끌어올려진다고 한다. 그러니 맥락상 이해하기 편한 곳에다 정의해도 상관 없음.