20210901 TIL
import React, { useState } from 'react';
// let color = 'red';
// export default function App() {
// function onClick() {
// color = 'blue';
// }
// return (
// <button style={{ backgroundColor: color}} onClick={onClick}>
// 좋아요
// </button>
// )
// }
// color 값이 변경되었지만 리액트가 이 값이 변경되었다는 사실을 모르기 때문에
// 버튼 색이 빨강이다.
// 값의 변경 사실을 알려면 상탯값으로 관리를 해야한다.
export default function App() {
const [color, setColor] = useState('red');
function onClick() {
setColor('blue');
}
return (
<button style={{ backgroundColor: color}} onClick={onClick}>
좋아요
</button>
)
}
{count.value1 > 0 && <Title title={`현재 카운드: ${count.value1}`} />}
// && 왼쪽의 조건을 모두 만족해야 && 뒤에 있는 것이 렌더링된다.
index.html
<div id="root"></div>
<div id="something"></div>
App.js
import React from 'react';
import ReactDOM from 'react-dom';
import Counter from './Counter';
export default function App() {
return (
<React.Fragment>
<p>안녕</p>
<p>하세요</p>
<Counter/>
{
ReactDOM.createPortal(
<div>
<p>안녕</p>
</div>,
document.getElementById('something'),
)
}
</React.Fragment>
)
}
const element = <a href="http://google.com">click here</a>;
const element = React.createElement(
'a',
{ href: 'http://google.com'},
'click here',
);
const Title = React.memo(({ title }) => {
return <p style={{ color: 'blue' }}>{title}</p>;
});
// title 속성값이 변경될 때만 렌더링된다.
리액트 훅(hook)
컴포넌트에 기능을 추가할 때 사용하는 함수
→ ex ) 컴포넌트에 상탯값 추가, 자식 요소에 접근
→ 리액트 16.8에 새로 추가됨
- 그 전에는 클래스형 컴포넌트 사용
- 클래스형 컴포넌트보다 장점이 많으며 리액트 팀에서도 훅에 집중하고 있음
useState: 상태값 추가
const [count, setCount] = useState(0);
// const [상태값, 상태값 변경함수] = useState(초기값);
import React, { useState, useEffect } from 'react';
export default function App() {
const [count, setCount] = useState(0);
function onClick() {
// setCount(count + 1);
// setCount(count + 1);
// 상태값 변경 함수는 비동기이면서 배치(batch)로 처리된다.
// 만약에 리액트가 상태값 변경 함수를 동기로 처리하면 하나의 상태값 변경 함수가 호출될 때마다
// 화면을 다시 그리기 때문에 성능 이슈가 생길 수 있다.
setCount(v => v + 1);
setCount(v => v + 1);
// 상태값 변경 함수에 함수를 입력하면 처리되기 직전의 상태값을 매개변수로 받는다.
}
console.log('render called');
return (
<div>
<h2>{count}</h2>
<button onClick={onClick}>증가</button>
</div>
);
}
import React, { useState, useEffect } from 'react';
export default function App() {
const [count, setCount] = useState(0);
useEffect(() => {
document.title = `업데이트 횟수: ${count}`;
});
return <button onClick={() => setCount(count + 1)}>increase</button>
}
// 첫 번째 매개변수로 함수(부수효과 함수)를 입력하면, 이 함수는 컴포넌트가 렌더링된 후에 호출
// 렌더링 결과가 실제 돔에 반영되고 비동기로 호출
→ 서버 API 호출, 이벤트 핸들러 등록 등