02 폴더 메인피드

aws : 서버 구축, 데이터베이스 손 쉽게 만들어 넣을 수 있게 만든 자동화 프로그램

 

풀옵스? : props, 상위 컴포넌트에서 하위 컴포넌트로만 전달 가능 형제도 안됨 병렬도 안됨. 컴포넌트가 복잡해지면 많이 힘들어짐 그래서 리덕스나 컨택트 사용 / 프로퍼티 이름을 정하고 값을 전달 / const TxtFeed = (props) => { à 여기서 props 는 정해진 것이 아니라 다른 걸 써도 됨, props 라는 변수에 이메일, 바디, 네임이 들어가 있는 거고 각각 그 안에 {props.name} 이라고 하면 각각 그 데이터가 불러와짐

이미지가 있는 데이터에는 이미지피드로 : 삼항연산자로

 

구조분해 할당? test 폴더

 

 

 

state : 컴포넌트의 상태, 컴포넌트의 상태를 생성하고 업데이트 시킬 수 있는 도구 제공

const [state, setState] = useState( 초기값 );

à useState 에 생성과 동시에 가져야 할 초기값을 인자로 넣어주면 state setState 라는 두가지 요소를 배열 형태로 리턴

à 현재 상태값은 state 라는 변수에 들어있고 state 를 변경시켜주고 싶을 때는 setState 함수를 이용해서 간편하게 변경 가능, state setState 의 이름은 마음대로 지정 가능

 ex) const[time, setTime] = useState(5); à 컴포넌트 안에 time 이라는 state 가 생기고 초기값은 5 / 여기서 초기값을 변경하려면 setTime(6) 이라고 setTime 함수에 6 을 넣어주면 6 으로 변경할 수 있음

 

 

?

 

변수가 증가하고 감소했을 때는 상태의 변화를 감지하지 못함

유즈 스테이트도 변수 기본으로 설치되어 있는 메서

상태의 변화를 읽어낼 수 있는 변수

상태가 변했을 때 재렌더가

어떤 상태의 변화를 알려주고

스테이트에 담아서 변수를 사용하면 바로바로 읽어올 수 있음

 

진짜 돔을 사용해서 매번 다시 읽어오기 때문에 업데이트 가능

반면 리액트는 리액트는 가상돔과 비교해서 그 부분만 수정

 

메서드 훅:

1. json placeholder

https://jsonplaceholder.typicode.com/

범위 데이터? : users - 대괄호~대괄호 까지 복사 - 메인 피드 안에 userData.json 파일 만들고 붙여넣기

 - 어떤 구조를 리턴해주려면 병렬구조로 하위구조로 리턴해줘야 함 div 안에 div 이런 식으로

 

 

2. react03 폴더

컴포넌트 파일 이름 주고 밑에 jsx 파일 이름은 index 라고 해줘도 됨

users.map(() => {}) → 안팎 전부 써도 됨

{user.picture}  가져오려면 { } 꼭하기

 

{user.online}  이것만 하면 그냥 true false 값만 출력됨 리턴 안에 이프 스위치 문 사용x 때문에 그래서 삼항 연산자로 온라인 유저에 true 면 콜론 앞 문장으로, false 면 콜론 뒤 문장으로 밑에 처럼 적어줌

→ {user.online ? <span className='online on'></span> : <span className='online off'>OFFLINE</span>}

 

- 상위 컴포넌트에 넣어주기 : app.js  <UserList /> 해줘야 index.jsx에 만든 게 들어감

 

!!! js 문법 (까먹을 까봐 다시 설명) object-ex.js !!!

 

 

 

3. for in

증감식 하지 않아도 자기가 알아서 증감함

그래서 순환하고 싶을 때 사용

 

!!! object-ex3.js

다시 이해하고 정리하자 !!!

 

em 은 이탤릭체 강조

 

 

 

4. MovieList index.jsx 반복으로 들어갈 구조 먼저 만들어 놓기

const MovieList = () => {
    const movieList = movieData;
    return (
        <div>
            <ul className='move-list'>
                <li>
                    <div className='imgbox'>
                        <img src="" alt="" />
                        <span className='grageinfo'>12</span>
                        <div className='dimmed'> // hover 했을 때 dim 나오게
                            <a href="#"> 예매하기 </a>
                            <a href="#"> 상세정보 </a>
                        </div>
                    </div>
                    <div className='txtbox'>
                        <div className='title'> 제목 </div>
                        <div className='info'>
                            <span>예매율 <strong className='rateinfo'>0.1</strong> %</span>
                            <span>★ <strong className='starinfo'>8.9</strong></span>
                        </div>
                    </div>
                </li>
            </ul>
        </div>
    );
};

export default MovieList;

 

 

 

5. aos 라이브러리

CDN SOURCES css, js 코드들 head 안에 붙여넣기 하고 초기화 해주고 위에 해당 박스들 복사 붙여넣기만 해주면 적용가능

깃헙 가면 anchor 라는 데모 페이지도 있으니 보고 적용하면 됨, 어떤 옵션이 있는지도 보기 가능

옵션은 초기화의 소괄호 안에 중괄호 만들고 각 옵션 적어주면 됨

간단하게 이용가능

 

화폐박물관 풀페이지 슬라이더 잘 나와있으니 한번 볼 것

 

!궁금한 점!

1. movieList.map((movie) => { }  소괄호 안의 movie 는 무슨 의미 인지?

A) 위에서 MovieList라는 변수에 movieData를 가져왔음 movieList.map은 각 데이터에 movie라는 변수를 집어넣어서 movie 는 각 하나하나의 정보를 뜻함, 따라서 movie.grade 는 결국 각 movieData grade 라는 정보를 뜻하는 것

2. <li className='move-list-li' key={movie.id}>  key 값은 왜 꼭 줘야 하는지?

A) 어떤 걸 추가로 넣으면 js는 새 페이지를 불러서 그려 넣는 식으로 한다면 react 는 가상 돔으로 기존 페이지에 추가로 그려 넣는 식임 그래서 똑 같은 li 를 넣는다고 해도 id에 값을 각각 다른 독립적인 객체로 넣어줘야 하기 때문에 key 값이 필요함

3. e.target 은 무엇?

A) 부모로부터 이벤트가 위임되어 발생하는 자식의 위치, 내가 클릭한 자식 요소를 반환

 

 

내일은 컴포넌트 자체를 반복해볼 것임

과제! : sns에 나의 친구들만 반복시켰지만 메인 피드들도 반복해볼 것 / 메인 피드 바디 내용은 제이슨생성기로 post comment 들 반복

1. copy

1) deep copy

- 실제 값을 새로운 메모리 공간에 복사하는 것을 의미

- 원시타입 :

let a = 10;

let b = a;

a = 30;

console.log(a) // 30

console.log(b) // 10

 

2) shadow copy

- 주소 값을 복사한다는 의미

- 객체 object :

let a = { value: 1 }

let newA = a;

newA.value = 2;

console.log(a === newA) // true

a newA 는 같은 주소를 카피함 그래서 value: 2 라고 주소 안의 값이 바뀐 것이기 때문에 원시타입처럼 각각 a = value: 1 이고 newA = value: 2 로 복사되어 다르게 바뀌는 것이 아니라 같은 주소 안의 값을 바꿔준 것이라 a, newA 값은 같음

 

3) 객체를 deep copy 하는 방법

- Object.assign() : 출처 객체들의 모든 열거 가능한 자체 속성을 복사해 대상 객체에 붙여넣고 대상 객체를 반환, 1단계까지만 카피됨 / 객체를 합치는 것이 가능, 합칠 때는 2개의 객체가 같은 프로퍼티를 가지고 있다면 그 값을 덮어쓰기 해주며, 객체의 복제에서도 사용

 

const obj = { num: 1 }

const newObj = Object.assign({}, obj) // 반쪽짜리 디카피 완벽한 디카피는 아님

 

console.log(obj) // 1

console.log(newObj) // 1 카피

 

newObj.num = 10;

console.log(newObj) // 10 으로 변경

console.log(obj === newObj) // false -> obj=1 newObj=10 논카피

→ 복사는 됐지만 변경하면 반영 안됨, newObj obj 과 합친 첫번째 인수값을 반환, 따라서 obj 은 변화 없음, 그리고 deep copy 는 새롭게 하나 복사 붙여넣기로 생기는 거라 주소가 달라져서 어떻게든 false 가 뜸

 

const user = {

    name: '철수',

    hobby: {

        a: 'game',

        b: 'music',

    },

}

const newUser = Object.assign({}, user);

newUser.hobby.a = 'book'; // user, newuser 같이 바뀜

newUser.name = '영희'; // 1단계 카피만 되어 newuser 바뀜

console.log(user)

console.log(newUser)

console.log(user == newUser) // 영희까지, false

deep copy 는 실제 값을 새로운 메모리 공간에 복사해서 1단계에선 각자 바뀌지만 이중, 삼중 구조로 가게 되면 쉐도우 카피가 되어 같이 바뀜

 

- … 스프레드 연산자 : 복사하고 싶은 객체 이름 앞에 만 적어주면 복사

const item = {

    type: 101,

    color: {

        a: 'red',

        b: 'blue',

    },

};

const newItem = { ...item };

console.log(item) // type: 101~

console.log(newItem) // type: 101~

// 똑같이 나옴

 

newItem.type = 202;

console.log(item) // type: 101~

console.log(newItem) // type: 202~

// item.type 바뀌지 않음

 

newItem.color.a = 'green';

console.log(item) // green

console.log(newItem) // green

// 두개 바뀜

deep copy 는 실제 값을 새로운 메모리 공간에 복사해서 1단계에선 각자 바뀌지만 이중, 삼중 구조로 가게 되면 쉐도우 카피가 되어 같이 바뀜

 

 

2. JSON

- 백엔드에서 데이터를 보내줄 때의 자료형태, 객체와 똑같은 모형, 키값을 만들어주고 프로퍼티 입력

- stringify 메서드와 parse 메서드를 이용하면 완벽한 카피가 됨

- 처음부터 parse 쓰면 되지 않나? parse 는 문자열을 오브젝트로 바꿔주는 거라 꼭 stringify, parse 해줘야 완벽하게 카피됨

- 방대한 자료는 유용하지 않음 렌더링 오래걸리기 때문에, 단 이런 경우 많다 하면 어쩔 수 없이 사용, 아주 많이 씀 기억해둘것

- 단점은 함수, 메서드는 카피 안됨 언디파인드 나옴. 따라서 자료형은 쓸 수 있지만 함수, 메서드 들어가면 문제가 생김

 

1) JSON.stringify()

- JavaScript 값이나 객체를 JSON 문자열로 변환. 선택적으로, replacer를 함수로 전달할 경우 변환 전 값을 변형할 수 있고, 배열로 전달할 경우 지정한 속성만 결과에 포함

- 예시 : JSON.stringify( value [, replacer [, space ] ] )

const obj = {

    name: '철수',

    address: '서울',

    hobby: {

        a: 'game',

        b: 'music',

    }

}

 

// stringify

const newObj = JSON.stringify(obj);

console.log(newObj)

 // -> {"name":"철수","address":"서울","hobby":{"a":"game","b":"music"}}

 

2) JSON.parse()

- JSON 문자열의 구문을 분석하고, 그 결과에서 JavaScript 값이나 객체를 생성. 선택적으로, reviver 함수를 인수로 전달할 경우, 결과를 반환하기 전에 변형 가능

- 예시 : JSON.parse( text [, reviver ] )

// parse

const newObj2 = JSON.parse(JSON.stringify(obj));

console.log(newObj2) // 문자열 -> 오브젝트

 

 

3. map 반복문

- foreach 의 경우 각각의 element 에 펑션을 ele 하나하나에 실행해주는데 결과값을 리턴하지 않지만 map 은 결과값을 리턴해줌

- foreach map 의 사용법은 동일 :

[ ].forEach((ele,index,arr)=>{})

[ ].map((ele,index,arr)=>{})

 

const arr = [

    { id: 1, item: 'type1' },

    { id: 2, item: 'type2' },

    { id: 3, item: 'type3' },

    { id: 4, item: 'type4' },

    { id: 5, item: 'type5' },

]

 

arr.forEach((ele) => {

    console.log(ele)

});

 

arr.map((ele) => {

    console.log(ele)

});

 

- for, 반복문을 대체하여 사용한다면 아주 유용하다

- react 에서 반복되는 컴포넌트를 렌더링하기 위하여 자바스크립트 배열의 내장 함수인 map( ) 을 사용

 

1) react 에 적용한 foreach

const arr = [1, 2, 3];

let lis1 = arr.forEach((ele,key) => <li>{ele}</li>);

- foreach : 3번의 함수가 적용. <li> [1] , <li> [2], <li> [3]. lis1 변수에 저장. 하지만 리턴 값이 없어 출력x

 

2) react 에 적용한 map

const arr = [1, 2, 3];

let lis1 = arr.map((ele, key) => <li key={key}>{ele}</li>);

- map : 리턴값은 함수 안의 값이 모두 리턴, 출력

- 위에서 key 는 어떤 항목을 추가변경할 때 식별자로 사용하기 위해서 key 값을 적용

 

3) map 문에서 key?

- map 메서드를 사용하면 꼭 들어가야 함

- 똑 같은 요소가 반복해서 생겼을 때 그 중 어떤 요소의 변화가 일어나면 그 요소를 식별해야 함

- react 는 가상 돔을 이용해 달라진 속성을 비교해서 업데이트하기 때문에 각각 컴포넌트는 똑같을 수 있지만 식별자는 달라야 함. , key 값을 안 넣어주면 에러나고 동작 하지 않음

- 어떤 항목을 추가 변경할 때 식별자로 사용하기 위해서 key 값을 적용해야 함

- key 값은 고유한 값이어야 함, index 값을 key 값으로 쓰면 안됨

- index id 는 틀림. index 는 번호, id 는 고유한 key .

- 받아온 값들 중에서 key 값으로 써야 하는데 index 의 경우 어떤 요소가 추가 됐을 때 index 번호는 수정될 수 있음.

- 따라서 요소가 추가되면 번호가 바뀔 수 있기 때문에 잘못된 곳에 적용될 수 있음 하지만 id 는 변경되지 않기 때문에 key 값으로 많이 사용

 

4. react public 폴더?

이미지 파일 src 에 넣어도 되지만 원본 이미지 파일에 어떤 손상도 입히고 싶지 않다 하면 퍼블릭 폴더.

하지만 퍼블릭에 넣으면 나중에 빌딩할 때 빌딩 파일에 복사되어 문제가 생길 수도 있음

따라서 특별하게 중요한 파일이면 퍼블릭 별 중요한 파일이 아니면 src

JS

1. 풀페이지

fullpage.min.js : 압축

카피 스크립트 태그로 붙여 넣으면 모든 것 붙여넣기 가능

콜백 처리 : 플러그인 쓸 때 콜백 처리 잘 봐줘야 함, 페이지가 들어오고 나서 반응이 있는 등 은 콜백함수로 처리, 한두개만 봐도 감이 생김

fullpage.min.js:11 fullPage: Fullpage.js requires a `licenseKey` option. Read about it on the following URL:  라이선스 오류? 풀페이지 깃헙 리드미 읽어볼 것,

data-menuanchor : 꼭 있어야 함

메뉴바 : 바디 부분과 스크립트 부분의 앵커 부분 연결해주는 링크가 똑같아야 함 그래서 각각 누르면 anchors: ['section0', 'section1', 'section2', 'section3'] 찾아갈 수 있도록 / active 는 활성되는 클래스 즉, 붙었을 때 변경하고 싶은 것

배민사이트 만들기 가능 (콜백처리)

콜백

- afterload : 구역을 불러오고 나서 스크롤이 끝나면 콜백이 실행됩니다.  도착을 했을 때 실행

- onLeave : 떠나고 실행

 

2. 비구조화 할당

비구조화 할당 : 배열, 객체, 반복 가능 객체에서 값을 꺼내어 그 값을 별도의 변수에 대입하는 문장

리액트 쓸 때 많이 사용

 

배열의 비구조화 할당 destructuring.html

객체의 비구조화 할당 destructuring2.html

 

배열은 index 순서임 그래서 순서를 바꾸면 같이 바뀌는 게 아니라 순서만 바뀜

객체는 순서를 바꿔도 이름으로 찾기 때문에 열거된 순서대로 찾지 않고 이름대로 찾음

 

 

 

 

React

리액트를 다루는 기술 - 김민준 도 괜찮

함수형 주로 할 것

31p

상단부터 전체를 다시 불러오기 서버 요청이 들어감 페이지를 아예 다시 구성 돔트리 다시 구성

싱글페이지 어플리케이션 : 페이지가 한장, 많은 페이지로 각각 페이지로 전환되는 것이 아닌 교체되는 부분만 갈아끼우는 것 페이지 여러장 아님

돔트리 직접 바꾸는 것이 아닌 가상 돔 사용 그 전에 읽어왔던 내용과 바뀐 내용을 읽어서 그것만 변경

 

react/01

퍼블릭에서 배포

소스에서 작업

app.js 가 메인페이지 역할

102p jsx

jsx = javascript xml

 

1. IntersectionObserver

- 생성자 함수로 만들어야 함

- scroll 쓸 때 유용하게 사용 가능

- isintersecting : 화면 안에서 교차하고 있는 요소들 표시

- 프랜스홀드 : 얼마나 교차를 인식해줄 건지

- 루트 : 마진을 주듯이 영역을 넓힐 수 있음

- 콜백함수는 외부로 빼주기

- on. 한 속성들이 뷰포트 안으로 보이고 원래 설정했던 것들이 밖으로 보임

 

2. swiper.js

https://swiperjs.com/get-started

swiper js : Get Started 플러그인, 애니메이션 빼서 온 것처럼 / 함수들이 많음, 대신 커스터마이징 해줘야 함

데모에 들어가면 만들어진 슬라이드 등 볼 수 있음

이미 지정되어 있는 css 이기 때문에 ! important 이용해서 따로 지정해줘야 함

api 는 양이 너무 많기 때문에 데모가 더 나음

엑티브 컬러

width.html 548p

offsetWidth  , getBoundingClientRect 많이 씀

getBoundingClientRect : 하나만 뽑아보고 싶으면 (). 뒤에 width, height 등 적으면 따로 추출가능

 

posion.html

getBoundingClientRect().top : 브라우저 안쪽 페이지 기준으로 바깥 여백 위쪽

getBoundingClientRect().right : 브라우저 왼쪽부터 요소 오른쪽까지의 값

getBoundingClientRect().bottom : 브라우저 위쪽부터 요소 아래쪽까지의 값

offset : 상위 요소 기준, 어떤 포지션을 줬느냐 에 따라 값이 달라짐, css 포지션 정책대로 top, left 위치 값 받아옴

 

pageYoffset , scrollY 같음 : 스크롤되고 문서가 올라간 높이

pageYoffset :

scrollY :

 

scrollbasic1.html

콜백함수

 

scrollbasic2.html

스크롤 스무스랑 없는 거 비교

스크롤바이 투 둘다 behavior: 'smooth' 쓸 수 있음

 

naviupdate-scroll.html

페이지가 section box 1,2,3,4,5 가 포함되어 길게 되어 있음 그래서 li 하나 누를 때마다 각 box 의 좌표가 맞춰져야 함

그래서 getBoundingClientRect left top 으로 받아오면 됨

포인트 이벤트?

 

halloween-scroll.html

gnb 내려가면 상단에 fix 해주고 각 section 으로 이동하도록

function 했으면 상관이 없는데 const 로 했기 때문에 호이스팅이 되지 않아서 먼저 변수하고 호출

 css : .fix bottom:auto  position:fixed 해줬기 때문에 bottom 0해버리면 페이지 맨 밑까지 gnb 영역으로 됨 그래서 auto 해줘서 컨텐츠만큼 잡도록

 

naviscroll.html

 

window.html : 차이

window : 전역객체 , 자바스크립트 가장 최상위 객체 , 브라우저 실행됐을 때 가장 먼저 로딩되는 객체 , 창으로도 간단하게 생각 가능

document: 윈도우 객체 아래에 위치 ,

onload : 페이지가 열렸을 때 이벤트, 버블링 때문에 다 먹기 때문에 윈도우나 도큐먼트나 다 적용됨

DOMContentLoaded : html 돔트리와 스크립트 뒤에 읽어오는 것, 윈도우에도 적용 가능(이벤트 버블링 때문에)

 

스크립트를 헤드 사이에 달면 에러가 남 window.load

IntersectionObserver: 해당 공간 안에 들어간가면 특정 이벤트를 실행

 

navi-img-scrollupdate.js

<script src="js/navi-img-scrollupdate.js" defer></script> : script src 썼을 때만 defer 사용 가능

이미지 넌 시켜놔서 클래스 넣어서 스크롤되면 이미지 나오도록

이미지 업이라는 클래스 붙으면 left 0 오퍼시티 1 트랜지션 left 오퍼시티 둘다 부여

section 스타트 지점과 앤드 지점 좌표 알아내야 함 시작점 플러스 높이 하면 끝점 뭐가 이 안에 있는지 따져야 함

childNodes : 자식으로 오는 공백까지 다 받아옴

children : 자식으로 오는 태그만 받아옴

둘 다 배열임

 

cloneNode : false 가 기본값, 텍스트 노드 등 자식 모두를 불러오고 싶으면 소괄호에 true 넣고, 복제할 대상만 불러오고 싶으면 비워 놓기

 

mouse

over : 하위 요소 간 공간이 있으면 공간에서 over out 이 발생함

out

enter : 핸들러 지정한 요소 하나에 위치를 잡기 때문에 그 안에 마우스 움직일 때는 out 으로 인식 안함

leave

 

키 다운

키 업

console.log(e) 콘솔에 확인했을 때 나오는 키코드가 내가 키보드에서 누른 코드

 

pageX: 981

pageY: 187

 

스크롤탑 그 위로 올라간 문서의 높이

스크롤바가 250 보다 커지면 .pageHeader .fix 붙여주기

scrollTop :

 

 

position : sticky

- 부모요소 기준으로 그 요소 안에서 위치를 고정, 스크롤에 따라 움직임

- 익스는 안됨 엣지 이상

- scroll_event.html 에서 했던 것처럼 스크립트로 상단에 안 붙여주고 스티키 쓰면 간단 해결

- , 부모박스가 브라우저 상에서 없어지면 같이 사라짐 따라서 부모박스의 height 값이 있어야 함

- overflow:hidden 쓰면 안됨 부모박스의 overflow 속성이 적용되어 있으면 sticky 적용안됨

kakaotb.html

animal.html

클릭하면

-          animal 이미지를 cover 아래 이미지로 넣고

-          li 백그라운드 컬러를 div

갯어트리뷰트, 셋어트리뷰트 530p 이용해서 속성값 가져오고 설정

          

노드 객체의 프로퍼티 이용할 것임  514p

window.getComputedStyle(대상).스타일속성 : css 파일에 있는 스타일 값을 가져올 때 / 요소 검사에서 계산됨에 있는 스타일을 가져와서 씀 563p , 567p

도큐먼트오브젝트.style.스타일속성 : 인라인으로 적용되어 있을 때, 주입할 때

 

자식요소 속성 뽑아오기

- fristChild : 공백을 자식으로 삼아서 추후 문제가 생김 ???

- lastChild

- childNodes[0]

 

text.html 534 536

innerhtml : 엘리먼트 등 html 의 모든걸 다 불러와 줌

textcontent : 공백 읽어오고, sytle 적용x, html 요소만 없앰

innertext : 공백제거하고 텍스트만 불러옴, 스타일에서 적용된 값도 다 불러옴

텍스트만 불러온다 하면 텍스트 컨텐츠로

 

wall.html

li img 클릭하면 div 에 반영,

 

팝업창은 창이 따로 뜨는 것

모달은 페이지 안에서 팝업창처럼 뜨는 것

뒷배경 어둡게 = dim

사진 말고 배경 클릭하면 닫히도록

 

 parentNode : 바로 위 부모 선택, 요소 주석 줄바꿈 공백 모두 포함

element.closest() : 선택한 요소의 가장 가까운 조상 요소를 선택

 

accodian2.html

::selection {

    background-color: transparent;

}

복붙 텍스트 드래그 할 때 파란 배경 안 보이게

 

 

탭 연습

모달 띄우기 연습

어트리뷰트 바꾸기

오후: 아코디언 메뉴(서랍메뉴), css 부터 다

스크롤

캐러셀

1. 이벤트 처리기

1) addEventListener 메서드로 등록하기

- 이벤트 생성이벤트 객체핸들러함수 전달 받음이벤트 발생 시 작동

- 노드라는 오브젝트에 상속받고 html element object 가 만들어짐

- 모든 이벤트 타겟이라는 객체를 갖고 있음 우리가 동작을 했을 때 이벤트 핸들러에 연결, 핸들러의 매개변수로 전달됨 이벤트 객체는 모든 속성과 메서드 갖고 있음 이벤트 발생 시 어떻게 작동되는지 보려면 꺼내서 봐야함

 

btn1.addEventListener('click', (event) => {

            console.log(event)

        })

(아무거나 써도 됨)=> : 매개변수로 이벤트 객체를 넘겨줌 객체 안에 있는 값들을 확인해 볼 수 있음 타겟, 이벤트 핸들 연결자, 어떤 키값 사용했는지 등 모든 정보가 있음 보통 가로 안에 e, event

 

2) 브라우저에서 이벤트를 누르면 콘솔에 나오는 것들

- 페이지x 페이지y : 위치

- 메타키 : os

- current.target : 많이씀

- target : 많이씀, 클릭하고 있는 요소를 말해줌

 

3) 이벤트 연결

- 디스패치 : 강제로 생성 시켜놓는 것, 타입을 정해놓으면 아무것도 안해도 콘솔에 표시됨 단, 단독으로 사용 어렵고 핸들러가 있어야 함

- 리무브 : 연결된 이벤트를 끊어주는 것.

 

4) 이벤트 전파 

- 하나 누르면 겹친 모든 게 표시되는 것

- 전파 방식 : 캡쳐링 버블링

- 버블링: 위쪽으로 올라가면서 전파되는 방식 false (기본), 따로 안 적으면 이걸로 적용, 비눗방울 올라가듯이 적용

- 캡쳐링: 아래로 내려가면서 전파되는 방식 true

- stopPropagation() : 이벤트 전파 취소, 사실 그렇게 많이 쓰지 않음 / 안 쓴다고 다 버블링 하면 다른 사람이 하는 거랑 상충되어서 충돌

inner.addEventListener('click', (e) => {

            console.log('이너');

            e.stopPropagation();

        })

 

 

console.log(e.currentTarget);

console.log(e.target);

 이용하면 위 방법과 유사하게 이용가능

- 커런트타겟은 핸들러가 연결된 돔 노드(앨리먼트)를 가지고 옴

- 타겟은 현재 클릭한 요소 현재 이벤트가 발생한 위치에 있는 앨리먼트

- 따라서 커런트타겟과 타겟이 똑 같을 때만 뭔가 출력되도록 하면 전파가 안되게 가능

if (e.target !== e.currentTarget) {

                return;

            }

- 이벤트 위임도 많이 사용, 버블링 캡쳐링에서 많이 사용하니 주의

 

- preventDefault : 기본값 방지, 취소

 

5) 이벤트 위임

부모 요소에 한번 걸어주고 그 안에 자식요소를 처리하기 위해 이벤트타겟 요소를 받아 하나씩 처리할 수 있음

 

6) 속성값 추가, 삭제

- getAttribute : 요소의 속성을 가져옴

- setAttribute : 요소의 속성을 설정

- hasAttribute : 속성 이름을 받아서 그 이름을 가진 속성이 있는지 알려줌

- removeAttribute : 속성 이름을 받아서 그 이름을 가진 속성을 삭제

 

1. 배열 array

- 배열에는 어떤 자료도 담을 수 있음

- 방법 1 : 길이 지정 값을 일일이

- 방법 2 : 아예 만들 때 값을 지정

- 방법 3 : [ ] 써서 값만 입력

 

 * 문제점, 주의할 점 : 값을 집어넣으면 인덱스가 생성되고 10이 있고 length 1이겠지 생각하겠지만, 숫자가 두개일 때는 상관없음 하지만 숫자 하나면 방법 2의 의도로 만드려고 하면 결과가 그렇게 나오지 않음

 

- 인덱스 번호랑 랭스를 헷갈림 랭스는 개수, 인덱스 번호는 순번

- for : 어디가 초기값, 어디가 끝값인지 생각해서 부여해주기

 

 

 

2. 돔트리

js 가 브라우저에서 하는일

태그 하나씩 노드로 감싸서 보여줌

돔트리 꼭대기에 html, 그 다음 head body, head 밑에~

하나의 요소 하나의 태그를 노드? 뭐라는거야....

돔에 어떤 요소 있는지? 어떻게 꺼내 쓰는지? 

바디에서만 트리?

앨리먼트 노드 = 태그?

글자들 = 문자 노드, txt 노드

공백 노드 따로 있음

문서 전체는 문서 노드 어쩌구

도큐먼트에 있는

 

 

 

3. 이벤트 처리기

1) querySelector

list 중 하나만 받아옴 querySelectorall 해줘도 에러가 남 / list[2].style.backgroundColor = '#567' 이렇게 해주면 2번째 list에 적용 / 다 적용하고 싶으면 반복문for

 

2) forEach

배열에만, 오브젝트x / forEach(대상데이터, 인덱스, 배열)  배열만 쓰고 싶어도 세개 다 써야 함

 

3) addeventlistener 메서드를 사용하는 방법 576p

+ Recent posts