본문 바로가기

WINK-(Web & App)/React.js 스터디

[2025 1학기 React.js 스터디] 이승준 #2주차

반응형

❤️반복문

for문

for (let i = 1; i <= 9; i++) {
  for (let j = 1; j <= 9; j++) {
    console.log(i + ' X ' + j + ' = ' + i * j);
  }
}
  • 괄호 안 요소들(;으로 구분)
  • 변수 선언; 종료조건; 참일 시 블록 안의 코드 이후 실행할 것
for (let i = 10; i > 0; i -= 2) {
  console.log(i);
}

continue & break

for (let i = 0; i < 100; i++) {
	if (i % 3 === 0) continue; // 한 루프를 건너뜀
	if (i > 10) break; // 루프 종료
	console.log(i);
}

 

for ... of

const myArray = ['한놈', '두시기', '석삼', '너구리', '오징어'];

for (const item of myArray) { // 상수명은 자유
	console.log(item);
}
  • 배열의 요소를 순서대로 반환 (위 요소들 차례대로 출력)

for ... in

const person1 = {
	name: '김철수',
	age: '25',
	married: false
}

for (const key in person1) {
	console.log(key, typeof key);
}

while 문

let x = 0;

while (x < 100) {
	const toPrint = x++;
	
	// continue와 break 역시 동작
	if (toPrint % 3 === 0) continue;
	if (toPrint > 10) break;

  console.log(toPrint);
}
  • 괄호안의 조건이 참일경우 반복한다.
  • 먼저 조건 확인 후 조치

do ... while 문

let x = 12;

do {
  console.log(x++);
} while (x < 10);
  • 선 조치 후 조건 확인

❤️함수

function describeHtmlCssJs () {
	console.log('HTML로 갖다놓고');
	console.log('CSS로 꾸미고');
	console.log('JavaScript로 시킨다.');
}

describeHtmlCssJs();
  • 함수는 기본적으로 반복적으로 수행되는 것들을 함수로 사용합니다.

매개변수와 인자

// to : 매개변수
function countTo (to) {
	for (let i = 1; i <= to; i++) {
		console.log(i);
	}
}

// 5 : 인자
countTo(5);
  • 특정한 값을 input으로 받아서 output으로 반환할때 매개변수를 사용하는데요, 위에 예시에서는 to가 매개변수이며 input값으로 기능합니다. to, pos, a등과같이 ;로 구분하여 여러 매개변수를 받아올 수 있습니다.
  • 매개변수가 있는 함수도 있고 없는 함수도 존재.

return 함수

function add(x, y) {
	return x + y;
}
  • 맨 마지막에 사용하며, 값을 반환하는 역할을 합니다.

함수도 값

const subt = function (x, y) {
  return x - y;
}

console.log(subt(7, 2));
  • 여기서 subt처럼 상수에, 객체의 값이나 배열의 요소로 함수의 인자를 넣을 수 있습니다.

화살표 함수

// 두 줄 이상의 작업이 있을 시
const mult = (x, y) => {
  console.log(`${x}${y}를 곱합니다.`);
  console.log(`결과는 ${x * y}입니다.`);
  return x * y;
};

console.log(mult(2, 7));

 

  • 이런 식으로 만들수도 있다...

HTML 요소 선택하기

Dom

  • 오른쪽그림의 트리구조를 돔구조라고 부른다.
  • 각 요소들을 노드라고 한다(h1, ul)
  • 돔은 라이브 특성이 있다. DOM을 변경하면 즉시 웹페이지에 반영된다.
  • 자바스크립트를 사용하여 DOM 요소를 선택, 수정 , 추가, 제거 가능하다.
  • BOM이란것도 있는데 DOM은 웹 문서를 조작, BOM은 브라우저를 조작하는 것이다.

API

    •  클라이언트(사용자)가 요청하면 서버가 데이터를 제공하는 역할을 합니다.
    • API (Application Programming Interface, 애플리케이션 프로그래밍 인터페이스) 
<html lang="ko">
<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">
  <link rel="stylesheet" href="./style.css">
  <title>DOM 선택하기</title>
</head>
<body>
  <h1>장보기 목록</h1>

  <section class="plant">
    <h2>채소</h2>
    <ul>
      <li>당근</li>
      <li>오이</li>
      <li class="soldout">양파</li>
    </ul>
  </section>
  <section id="sweets" class="plant">
    <h2>과일</h2>
    <ul>
      <li>사과</li>
      <li>딸기</li>
      <li>포도</li>
    </ul>
  </section>
  <section>
    <h2>고기</h2>
    <ul>
      <li class="soldout">소고기</li>
      <li>돼지고기</li>
      <li class="soldout">닭고기</li>
    </ul>
  </section>
  
</body>
</html>

위의 예제를 사용해서 해보겠습니다

getElementsByTagName

// 상수/변수로 저장 가능
const $listItems = document.getElementsByTagName('li');

console.log($listItems);
  • 태그명으로 선택
  • 요소 앞에 $붙이는 이유는 이것만 보고도 이 웹사이트의 요소다라는것을 알아볼 수 있도록 붙힘.(안해도 오류는 안뜸)

getElementsByClassName

document.getElementsByClassName('plant');
  • 클래스명으로 선택

getElementsById

document.getElementById('sweets');
  • 아이디로 선택

querySelector, querySelectorAll

document.querySelector('section');

document.querySelectorAll('section');

document.querySelector('.plant > ul > .soldout');

document.querySelector('#sweets ul > :nth-child(2)');
  • CSS 선택자로 선택
  • 각각 첫번쨰, 모든 요소 반환
  • 마지막 두줄은 부모요소부터 시작해서 자식요소로의 경로같은 것임
  • 첫번째는 첫번째 section만 두번째는 모든 section 가져옴

Childeren

document
.querySelector('section')
.children;
  • 자식 요소들을 반환

firstElementChild, lastElementChild

const $firstUl = document.querySelector('ul');

$firstUl;

$firstUl.firstElementChild;

$firstUl.lastElementChild;
  • 첫 번째, 마지막 자식요소 반환
  • 두번째 줄은 첫번째 ul을 가져옴

ParentElement

$firstUl.parentElement;
  • 부모요소 반환
  • 바로 앞 부모 반환하는거임.

❤️요소들 조작하기

<!DOCTYPE html>
<html lang="ko">
<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">
  <link rel="stylesheet" href="./style.css">
  <title>DOM 조작하기</title>
</head>
<body>
  <section class="plant">
    <h2>채소</h2>
    <ul>
      <li>당근</li>
      <li>오이</li>
      <li>상추</li>
      <li>가지</li>
      <li class="hidden">양파</li>
    </ul>
  </section>

  <br>

  <a href="https://www.naver.com" target="_blank">🔗 웹사이트 바로가기</a>

  <br>

  <input type="text" name="message" value="Hello World!">

  <br>

  <input type="checkbox" id="checkbox" name="toggle">
  <label for="checkbox">체크박스</label>

</body>
</html>

예제

 

textContent

const $carrot = document
.querySelector('section > ul > li');

$carrot;

$carrot.textContent;

$carrot.textContent = '제주당근';
  • 일단 section에 ul에 li를 갖고옴
  • 세번째 줄은 당근이라는 값을 반환
  • 마지막은 원래 당근이라는 값에 제주당근이라는 값으로 바꿔줌

classList

const $onion = document
.querySelector('section ul')
.lastElementChild;

$onion;

$onion.classList;

$onion.classList.remove('hidden');

$onion.classList.add('organic');

// 반복실행해 볼 것
$onion.classList.toggle('soldout');
  1. remove - 클래스 삭제
  2. add - 클래스 추가
  3. toggle - 스위치같은 기능 on off(좋아요같은거)

Style

$onion.style['font-size'] = '2em';
  • CSS 스타일 확인 및 수정
  • 글자 사이즈 2em으로 바꿈

getAttribute, setAttirbute

$hyperlink.getAttribute('href');
$hyperlink.setAttribute('href', 'https://www.yalco.kr');
  • 각각 속성값을 가져오고, 변경하는 것임
  • href를 갖고온다. 두번째 줄은 얄코웹사이트로 바꾼다.

value, checked

$message.value;
$message.value = '안녕하세요';
$toggle.checked;
$toggle.checked = !$toggle.checked;
  • 인풋 요소들의 값을 확인, 수정
  • 첫, 세번째는 확인 두, 네번째는 수정

removeChild, appendChild

$ul.removeChild($onion);
$ul.appendChild($tomato);
  • 각각 요소를 삭제, 추가시킴

createElement

const $tomato = document.createElement('li');
$tomato.textContent = '토마토';
  • 태그명으로 새로운 요소를 생성
  • 일단 만들고 두번째줄은 토마토라고 정의함.

❤️이벤트

<!DOCTYPE html>
<html lang="ko">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>이벤트</title>
  <link rel="stylesheet" href="style.css">
</head>
<body>

  <button id="myButton">이벤트를 부여하세요.</button>
  <br>
  <div id="clickPosition">
    클릭 전
  </div>
  <br>
  <input id="myInput" type="text">
  
</body>
</html>

예제

const myButton = document.querySelector('#myButton');

addEventListener

// 마우스 클릭 이벤트
myButton.addEventListener('click', function () {
	console.log('클릭');
});
const logMouseEnter = () => { console.log('진입'); };
const logMouseLeave = () => { console.log('이탈'); };
// 마우스 진입/이탈 이벤트
myButton.addEventListener('mouseenter', logMouseEnter);
myButton.addEventListener('mouseleave', logMouseLeave);
  • 첫 번째 인자로 주어진 이벤트에, 두 번째 인자로 주어진 함수의 동작을 부여 (콜백함수라고 불림)
  • 이벤트가 발생할때까지 있다가 발생하면 함수 실행.
  • 중간쪽은 배웠던 화살표함수
  • 이함수들을 addEventListener에 넣어서 이 함수가 실해되게 만들었다.

이벤트 객체

// 하나의 이벤트에 여러 콜백함수 등록 가능
clickPosition.addEventListener('click', function (e) {
	let text = 'x: ';
	text += e.clientX;
	text += ', y: ';
	text += e.clientY;
	clickPosition.textContent = text;
});
  • 하나의 이벤트에 여러 콜백함수를 등록할 수 있다.
  • 이벤트 발생시 상세정보가 포함. ex) 이벤트 발생 x,y좌표...
  • addEventListener의 이벤트에 click 말고도 여러 이벤트가 존재한다
  • focus - 인풋 요소 등이 사용자 입력을 받을 준비가 된 상태
  • blur - 포커스를 잃어 활성이 아니게 된 상태 - focus가 아닐때
  • change - 인풋 요소의 값이 바뀔때
  • keyup - 키 입력
  • 여러 이벤트가 있다.....

❤️최종프로젝트

알게된거 위주로 적어볼게용

 

defer

<script defer src="./script.js"></script>
  • 먼저 html 요소들이 모두 로드된 후에 실행되도록 함
const headerNavs = [
  { title: '얄코강좌는', link: '#about' },
  { title: 'HTML', link: '#html' },
  { title: 'CSS', link: '#css' },
  { title: '커리큘럼', link: '#curriculum' },
  { title: '문의하기', link: '#contact' }
];

const $headerNavUl = document.querySelector('.header__nav ul');

for (const nav of headerNavs) {
  const $li = document.createElement('li');
  $li.classList.add('header__nav-item');

  const $a = document.createElement('a');
  $a.textContent = nav.title;
  $a.setAttribute('href', nav.link);

  $li.appendChild($a);
  $headerNavUl.appendChild($li);
}
  • for of 문에서 배열 순환을 돌린다.
$currLis = document.querySelectorAll('.curriculum__list > li');
  •  nodelist로 갖고오게된다
  • nodelist란?? --------querySelectorAll() 같은 메서드로 가져온 여러 개의 요소들을 담고 있는 객체입니다. (유사 배열)
for (let i = 0; i < $currLis.length; i++) {
  const $li = $currLis[i];

  $li.addEventListener('mouseenter', () => {
    $currProgBar.style.width = (200 * i) + 'px';
  });
  $li.addEventListener('mouseleave', () => {
    $currProgBar.style.width = 0;
  });
}
  • for문으로 배열길이만큼 돌리고, addEvenListener을 이용하여 마우스가 올려져있거나 안올려져있을때 발생하는 이벤트를 정의해줬다.
const $contactTabs = document.querySelectorAll('input[name=contact]');
const $contactSlideCon = document.querySelector('.contact__slide-con');

for (let i = 0; i < $contactTabs.length; i++) {
  const $tab = $contactTabs[i];
  const marginLeft = [0, '-100vw'][i];

  $tab.addEventListener('click', () => {
    $contactSlideCon.style.marginLeft = marginLeft;
  });
}
  • const marginLeft = [0, '-100vw'][i]; 여기에서 i값이 0이면 0, 1이면 한 화면만큼 이동하게 만들었다고 합니다..
  • 그리고 클릭시 이벤트를 감지하여 실행하게 해줬네요
const $menuBtn = document.querySelector('.header__menu-btn');
const $headerNav = document.querySelector('.header__nav');

$menuBtn.addEventListener('click', (e) => {
  $menuBtn.classList.toggle('on');
  $headerNav.classList.toggle('active');

  // 이 요소 아래 레이어에는 클릭 이벤트가 먹히지 않도록
  e.stopPropagation();
});

document
.querySelector('body')
.addEventListener('click', () => {
  $menuBtn.classList.remove('on');
  $headerNav.classList.remove('active');
});
  • 클릭시 토글이 on/off되게 이벤트를 설정해줬군요..
  • addEventListener으로 다른곳을 클릭했을 시 on되어있다면 off시키도록 설정해준 코드다.
  • 여기서 e.stopPropagation이 없으면 버튼을 눌렀을 때 문제가 발생하게된다 --> 버튼요소도 모든 요소에 포함되어있기때문에 버튼을 눌러도 동작안함 이걸 e.stopPrapagation이 막아줌

힘들었읍니다..

 

 

반응형