npmtrend.com으로 본 리액트의 활용도 -> 꾸준히 높은 활용도를 보여줌
React 란? :
컴포넌트 기반의 UI 자바스크립트 라이브러리
SPA(Single Page Application)을 쉽고 빠르게 만들어주는 라이브러리 도구
여기서 잠깐, SPA는 뭘까?

실제 DOM에는 브라우저가 화면을 그리는데 필요한 모든 정보가 들어있어 실제 DOM을 조작하는 작업이 무겁다. 따라서 React에서는 실제 DOM의 변경 사항을 빠르게 파악하고 반영하기 위해서 내부적으로 가상 DOM을 만들어서 관리한다. 쉽게 말해서, Virtual DOM은 DOM의 요약본이라고 볼 수 있다.

-> 즉, Virtual DOM에서 변경사항을 감지하여 DOM에 알려주어 DOM은 전체를 렌더링 할 필요없이 변경사항만 바꿔줄 수 있다.
사소한 변경사항에도 전체가 리렌더링되기 때문에 브라우저에 과부하가 올 수 있기 때문에 Virtual DOM의 역할은 중요하다.
JSX란? :
자바스크립트와 XML/HTML 을 함께 사용할 수 있는 자바스크립트의 확장문법
JSX의 역할
JSX로 작성된 코드는 모두 자바스크립트 코드로 변환
리액트는 JS코드를 모두 createElement() 함수를 사용하는 코드로 변환
JSX의 장점
코드가 간결해지고 가독성 향상(JS문법 사용)
Injection Attack을 방어함으로써 보안성이 올라감
import './App.css';
function App() {
return (
<div className="App">
<div className='nav'>
<h1>안녕하세요</h1>
</div>
</div>
);
}
export default App;
function App() {
const Hi = "안녕하세요";
return(
<div className="App">
<h1>{Hi}</h1>
</div>
);
}
export default App;
function App() {
return(
<div>
<p>하이</p>
<div>
);
}
export default App;
이렇게 최상단 태그가 하나 존재해야함.
function App() {
return(
<div>
<p>하이</p>
</div>
<div>
<p>hi</p>
</div>
);
export default App;
이렇게 사용할 수 없다.
4. 인라인 스타일링은 camelCase로 작성한다.
-> backgroundColor
5. 주석은 {/.../} 형태로 써야한다.
6. &&,|| 연산자를 이용한 조건부 렌더링을 사용한다.
7. 삼항연산자를 많이 쓴다. -> boolean ?
: null
렌더링
컴포넌트의 정보를 이용해 화면을 구성(렌더링)한다. 즉, 가장 처음 렌더링하는 과정이다.
리렌더링
이전에 생성한 컴포넌트 정보와 다시 렌더링한 정보를 비교해 최소한으로 데이터를 업데이트하는 과정이다.
Props -> 리액트 컴포넌트의 속성
<Comment name={zeroeuni}
comment={"안녕하세요"}/>
function Comment(props){
return <div>{props.comment} 저는 {props.name}입니다.</div>
훅(Hook)이란?
-> 함수형 컴포넌트에서 컴포넌트의 상테(state)와 컴포넌트 생명주기의 원하는 시점에 정해진 함수를 실행되도록 만든 것
훅(Hook)의 종류
-> useState(),useEffect(),useMemo(),useCallback(),useRef()
훅(Hook)의 규칙
1. 훅은 무조건 컴포넌트 내의 최상위 레벨에서만 호출해야 함.
2. 제어문 내에서 호출하면 안됨
3. 컴포넌트 밖의 자바스크립트 함수에서 호출 불가함
4. 컴포넌트 내부요소의 상태변화 감지가 목적
const [변수명, set변수명] = useState(초기값);
const [count, setCount] = useState(0);
const [text, setText] = useState("");
import { useState } from "react";
const Counter = () => {
const [value, setValue] = useState(0); //useState사용
return(
<div>
<p>숫자는 <p>{value}</p>이다</p>
<button onClick={()=>setValue(value+1)}>+1</button>{/* 초기값에서 1을 더하기*/}
<button onClick={()=>setValue(value-1)}>-1</button>
</div>
);
};
export default Counter;
function 컴포넌트 이름() {}
const 컴포넌트 이름 = () => {}
두 방법 모두 뒤에 export default 컴포넌트 이름;을 붙여줘야 한다.
쉽게 말해, 똑같이 생긴 UI들을 반복문을 이용하여 줄여주는 방법이다.
const myArray = ["apple","banana","orange"];
myArray.map((item) => {
return <p>{item}</p>
});
//한줄 요소인 경우 return과 {}는 동시에 생략 가능함.
myArray.map((item)=> <p>{item}</p>);
즉,
const myArray = ["hi","im","zeroeuni"];
myArray.map((item) => {
return <p>{item}</p>
});
위 코드는
<p>hi</p>
<p>im</p>
<p>zeroeuni</p>
이 코드와 실행결과가 같다.
요소의 개수가 작을 땐 상관이없지만, 100개 200개로 점점 늘어날땐 map을 사용하는 것이 효율적이다.
배열에서 조건에 맞는 값만 출력할 때 사용할 수 있다.
const fruits = ["apple", "banana", "tomato", "grape"];
const filteredItems = fruits.filter((fruit, index) => index >= 2);
console.log(filteredItems);
위 코드에서는 fruits 배열에서 index가 2 이상인 요소만 출력하도록 filter 과정을 거쳤으므로 "tomato","grape"가 출력된다.
조건에 따라 렌더링의 결과가 달라지도록 하는 것
엘리먼트 변수
let 변수 = <컴포넌트 />인라인조건
참 && 표현식 -> 표현식 조건? <컴포넌트1 />:<컴포넌트2 /> //조건이 참이면 1, 거짓이면 2가 렌더링 됨Truthy(참같은 값) 과 Falsey(거짓같은 값) 의 개념
JS에서 참 같은 값(Truthy)란 불리언을 기대하는 문맥에서 true로 평가되는 값이다. 따로 거짓 같은 값으로 정의된 값이 아니면 모두 참 같은 값으로 평가.
function MissedGoal() { //컴포넌트
return <h1>MISSED!</h1>;
}
function MadeGoal() { //컴포넌트
return <h1>Goal!</h1>;
}
function Goal(props) {
const isGoal = props.isGoal;
if (isGoal) {
return <MadeGoal/>; //참이면 <MadeGoal/>컴포넌트 렌더링
}
return <MissedGoal/>; //거짓이면 <MissedGoal/>컴포넌트 렌더링
}
const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(<Goal isGoal={false} />); //Goal 컴포넌트 props에 false 전달하여 렌더링
function Garage(props) {
const cars = props.cars; //['Ford', 'BMW', 'Audi'];
return (
<>
<h1>Garage</h1>
{cars.length > 0 && //배열의 개수가 양수이면 <h2> 요소 리턴 <h2>
You have {cars.length} cars in your garage.
</h2>
}
</>
);
}
조건 ? 참일때 실행할 요소 : 거짓일때 실행할 요소
function Goal(props) {
const isGoal = props.isGoal;
return (
<>
{ isGoal ? <MadeGoal/> : <MissedGoal/> }/isGoal이 참이면 <MadeGoal/>,아니면 <MissedGoal/>렌더링
</>
);
}
const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(<Goal isGoal={false} />);
import { useState } from "react";
const Modal = (props) => {
return (
<div>
입력한 값은 <span style={{ color: "orangered" }}>{props.text}</span>{" "}
입니다
</div>
);
};
export default function InputText() {
let [text, setText] = useState(""); //useState를 사용하여 input 입력값 저장
return (
<div>
<input
type="text"
value={text}
onChange={(e) => {
setText(e.target.value);
console.log(e);
}}
/>
<button onClick={() => setText("")}>초키화</button>
<br />
<Modal text={text} />
</div>
);
}
{(e) => setText(e.target.value);} 를 작성하여 input안에서 일어나는 변화를 setText 변수에 저장
-> 이 외에도 useState는 정말 다양한 곳에 사용되니 공부하기.