
function handleClick(string) {
alert('Hi');
}
<button onClick={handleClick}>Click Me</button>
=> 이 경우 함수는 컴포넌트가 렌더링 될 때마다 실행 (잘못된 예시)
function handleClick(string) {
alert(`${string}`);
}
<button onClick={handleClick('Hi')}>Click Me</button>
=> 추가적인 파라미터가 필요할 경우 화살표 함수를 사용 (올바른 예시)
function handleClick(string) {
alert(`${string}`);
}
<button onClick={() => handleClick('Hi')}>Click Me</button>
전파를 차단하는게 좋은 습관일까?
전파 차단은 특정 상황에서 유용.
But 남용하면 코드가 덜 유연해지고, 애플리케이션의 동작을 추적하기 어려울 수 있음.
React는 이런 종류의 컴포넌트별 메모리를 state라고 부름.
React에서 useState와 같이 “use”로 시작하는 다른 모든 함수를 훅이라고 함
import { useState } from 'react';
import { sculptureList } from './data.js';
export default function Gallery() {
const [index, setIndex] = useState(0);
const [showMore, setShowMore] = useState(false);
const [active, setActive] = useState(true);
function handleNextClick() {
if(index >= sculptureList.length - 1) {
// handleActivate();
setIndex(index - sculptureList.length + 1);
} else {
setIndex(index + 1);
}
}
function handlePreviousClick() {
if(index <= 0) {
// handleActivate();
setIndex(sculptureList.length - 1);
} else {
setIndex(index - 1);
}
}
function handleActivate() {
if(index >= sculptureList.length - 1) {
setActive(!active);
}
}
function handleMoreClick() {
setShowMore(!showMore);
}
let sculpture = sculptureList[index];
return (
<>
{
active &&
<button
onClick={handleNextClick}>
Next
</button>
}
<button
onClick={handlePreviousClick}>
Previous
</button>
<h2>
<i>{sculpture.name} </i>
by {sculpture.artist}
</h2>
<h3>
({index + 1} of {sculptureList.length})
</h3>
<button onClick={handleMoreClick}>
{showMore ? 'Hide' : 'Show'} details
</button>
{showMore && <p>{sculpture.description}</p>}
<img
src={sculpture.url}
alt={sculpture.alt}
/>
</>
);
}




import { useState } from 'react';
export default function Form() {
const [firstName, setFirstName] = useState('');
const [lastName, setLastName] = useState('');
function handleFirstNameChange(e) {
setFirstName(e.target.value);
}
function handleLastNameChange(e) {
setLastName(e.target.value);
}
function handleReset() {
setFirstName('');
setLastName('');
}
return (
<form onSubmit={e => e.preventDefault()}>
<input
placeholder="First name"
value={firstName}
onChange={handleFirstNameChange}
/>
<input
placeholder="Last name"
value={lastName}
onChange={handleLastNameChange}
/>
<h1>Hi, {firstName} {lastName}</h1>
<button onClick={handleReset}>Reset</button>
</form>
);
}