
React
라이브러리와 프레임워크 차이점
- 프레임워크는 모든 것들이 들어 있는 주머니이다. 대신 틀이 있기 떄문에 그 틀에 맞춰어 사용해야 한다.
- 라이브러리는 단 한 가지 문제를 해결하기 위해서 있는 것이다.
- 내가 원하는 것을 골라 쓸 수 있다. 페이스북 에서 UI를 해결하기 위해서 만들었다.
리액트가 가지고 있는 철학
- UI를 표기하고 이벤트에 반응하는 라이브러리다.
- UI들을 컴포넌트 단위로 보여주고 이벤트로 반응하는 거라고 볼 수 있다.
- 독립적이다.
CSR(클라이언트 사이드 렌더링)
- 웹팩이 내가 작성한 코드와 리액트가 동작하기 위한 코드를 압축해서 보여준다.
- UI를 표기 해준다.
리액트 이벤트
- 이벤트 전파 시 함수를 연결해야 해줘야하고 리액트가 한 단계 감싸서 이벤트를 한다.
- 함수는 메모리 셀에 참조 값이기 때문에 함수를 연결을 해야한다. (즉시 함수 호출)
- 함수를 호출하면은 메모리셀에 있는 참조 값을 바로 부르기 때문에 잘못된 동작이 발생한다. (사용자가 버튼을 클릭할 떄 업데이트)
함수를 즉시 호출하는 거고 setNumber(number + 1)
아까 이게 오류난 이유가 애초에 함수인데 함수를 즉시호출해서
오류가 났다. 화살표함수로 한 번 더 감싸줘고 써야 한다.
함수를 연결 즉 참조해야 한다.
const handleClick = () => {
console.log('클릭 됨')
}
return (
<div>
<button onClick={handleClick}>button</button>
useState
- 내부 상태에 변경이 일어난다면(함수를 호출할 떄) 변경이 일어난다. 이전에 돔요소와 현재의 돔요소를 비교하여 변경을 해준다.
- Props를 전달 하는게 아니라 내부에 상태를 업데이트 한다.
- 내부 상태는 useState에서 간직하고 업데이트 해야 한다.
import React, {useState} from 'react';
const Conter = () => {
const [number, setNumber] = useState(0);
return (
<div>
<span>{number}</span>
<button onClick={() => setNumber(number + 1)}>Add +</button>
</div>
);
};
export default Conter;
이 값은 1이다. 클릭이 호출되어 을떄 전달할때 스냅샷(찰칵) 하고
저장된다. 렉시컬이바이먼트에 저장됨
<button onClick={() =>
setNumber(number + 1) = 0 + 1
setNumber(number + 1) = 0 + 1
setNumber(number + 1) = 0 + 1
}>Add +</button>
여러번 업데이트 하거나 이전 상태 값을 토대로 +, - 이전 상태 값을
업데이트 하는 경우에는 콜백함수를 사용해야 이전 상태를 기억한다.
<span>{number}</span>
<button onClick={() => setNumber((prev) => prev + 1)}>Add +</button>
여러개의 함수를 호출하거나 같은 곳에서 호출해야 할떄는 이렇게
하면 된다
const handleClick = () => {
setNumber((prev) => prev + 1);
setCount();
};
useEffect
- 여러개 사용한다고 성능이 저하되지는 않는다.
- 하지만 필요에 따라서 하나의 useEffect 훅에서 하나의 일만 하도록 분리하는게 좋다.
import React from 'react';
const Products = () => {
const [checked, setChecked] = React.useState(false);
const [products, setProducts] = React.useState([]);
// 데이터를 가져오는 첫 번쨰 방법#1
// 다만 무한대로 계속 패치해서 데이터를 가져온다.
// 상태를 변경되었기 떄문에 값을 호출하고 변경 다시 호출 변경(무한 반복)
// 이럴 경우 유즈이펙트가 유용하다.
// 만약에 체크가 된다면 sale이라는 것을 붙여주고
// 아니라면 그냥 프로덕트를 제이슨을 불러와줘
fetch(`data/${checked ? 'sale_' : ''}products.json`)
.then(res => res.json())
.then(data => setProducts(data));
//딱 한 번만 실행함 ([])를 사용 시
useEffect(() => {
fetch('data/products.json')
.then(res => res.json())
.then(data => setProducts(data));
// 컴포넌트가 없어질 떄 무언가 청소를 해야한다면
// 리턴을 사용 즉 우리가 메모리청소하는 것과 비슷함
return () => {
console.log('꺠끗하게 청소하는 일들을 해요.');
}
// 뭔가를 변경될떄마다 변경해줘 다시 불러와줘
// 라는 뜻
}, [checked])
return (
<div>
<input id='products' type='checkbox' value={checked} onClick={() =>
{setChecked((prev) => !prev)}} />
<label htmlFor='products'>Show Only Hot Sale 😘</label>
<ul>
{
products.map((product, i) => (
// 성능향상을 위해서 꼭 키를 사용!!!
<li key={i}>{product.id}
<article>
<h3>{product.name}</h3>
<p>{product.price}</p>
</article>
</li>
))
}
</ul>
</div>
);
};
export default Products;
import React from 'react';
import Products from "./components/Products";
const AppProducts = () => {
// 버튼 클릭 시 이 떄 Products컴포넌트가 호출되어 보여짐
const [showProducts, setShowProducts] = React.useState(false);
return (
<div>
{showProducts && <Products/>}
<button onClick={() => setShowProducts((show) => !show)}>
Toggle
</button>
</div>
);
};
export default AppProducts;
'리액트' 카테고리의 다른 글
포켓몬 API 토이 프로젝트를 하면서 문제점 (0) | 2025.02.08 |
---|---|
포켓몬 API를 사용하여 포켓몬 도감 만들기 (0) | 2025.02.08 |
React-player 라이브러리 (0) | 2024.12.31 |
React Potal Modal 구현하기 (2) | 2024.12.31 |
React scroll시 css 변경하기 (0) | 2024.12.31 |