트리거한다란 React의 렌더링 과정을 시작하도록 하는 이벤트를 발생시킨다는 의미.
import React from 'react';
const MyFunctionalComponent = () => {
return (
<div>
<h1>Hello, World!</h1>
</div>
);
};
export default MyFunctionalComponent;
import React, { Component } from 'react';
class MyComponent extends Component {
render() {
return (
<div>
<h1>Hello, World!</h1>
</div>
);
}
}
export default MyComponent;
setIsSent(true)
tells React to rerender the UIsetIsSent(true)
sets isSent to true and queues a new render.cf) e.preventDefault();
를 사용하여 제출 이벤트가 발생해도 페이지가 새로고침되지 않도록 할 수 있습니다.
import {useState} from 'react';
export default function Form() {
const [isSent, setIsSent] = useState(false);
const [message, setMessage] = useState('Hi!');
if (isSent) {
return <h1>Your message is on its way!</h1>
}
return (
<form onSubmit={(e) => {
e.preventDefault();
setIsSent(true);
sendMessage(message);
}}>
<textarea
placeholder="Message" value={message}
onChange={e => setMessage(e.target.value)}
/>
<button type=" submit">Send</button>
</form>
);
}
function sendMessage(message) {
// ...
}
PlayButton
passes handlePlayClick
as the setNumber(number + 1): number is 0 so setNumber(0 + 1).import { useState } from 'react';
export default function Counter() {
const [number, setNumber] = useState(0);
return (
<>
<h1>{number}</h1>
<button onClick={() => {
setNumber(number + 1);
setNumber(number + 1);
setNumber(number + 1);
}}>+3</button>
</>
)
}
import { useState } from 'react';
export default function Counter() {
const [number, setNumber] = useState(0);
return (
<>
<h1>{number}</h1>
<button onClick={() => {
setNumber(number + 5);
setTimeout(() => {
alert(number);
}, 3000);
}}>+5</button>
</>
)
}
React에 저장된 상태는 Alert가 실행될 때까지 변경되었을 수 있지만, 사용자가 React와 상호 작용할 때의 상태 스냅샷을 사용하는 것을 알 수 있다.
import {useEffect, useState} from 'react';
export default function Counter() {
const [number, setNumber] = useState(0);
useEffect(() => {
setTimeout(() => {
alert(number);
}, 0);
}, [number]);
return (
<>
<h1>{number}</h1>
<button onClick={() => {
setNumber(number=>number + 5);
}}>+5</button>
</>
)
}
export default function Toolbar() {
return (
<div className="Toolbar" onClick={() => {
alert('You clicked on the toolbar!');
}}>
<button onClick={() => alert('Playing!')}>Play Movie</button>
<button onClick={() => alert('Uploading!')}>Upload Image</button>
</div>
);
}
import { useState } from 'react';
export default function Counter() {
const [number, setNumber] = useState(0);
return (
<>
<h1>{number}</h1>
<button onClick={() => {
setNumber(n => n + 1);
setNumber(n => n + 1);
setNumber(n => n + 1);
}}>+3</button>
</>
)
}
Declare what you want to show and React figures out how to update the UI
Implementing UI in React Declaratively
async function handleSubmit(e) {
e.preventDefault();
setStatus('submitting');
try {
await submitForm(answer);
setStatus('success');
} catch (err) {
setStatus('typing');
setError(err);
}
}
<form onSubmit={handleSubmit}>
<textarea value={answer}
onChange={handleTextareaChange}
disabled={status === 'submitting'} />
<button disabled={
answer.length === 0 ||
status === 'submitting'
}>Submit</button>
{error !== null &&
<p className="Error">{error.message}</p>
}
</form>
<textarea value={answer}>
: 이 요소의 value 속성은 answer라는 상태 변수로 설정되어 있으며, 이는 textarea에 입력되는 텍스트 값을 answer 상태에 저장하겠다는 의미입니다.onChange={handleTextareaChange}
: onChange는 textarea의 값이 변할 때마다 호출되는 이벤트 핸들러입니다. 사용자가 textarea에 텍스트를 입력하면, handleTextareaChange 함수가 호출됩니다. 이 함수는 사용자가 입력한 텍스트를 받아 answer 상태를 업데이트하는 역할을 합니다.disabled={status === 'submitting'}
: disabled 속성은 textarea를 비활성화할지 결정합니다. status 상태가 'submitting'일 때 textarea는 비활성화되며, 이는 폼이 제출되는 동안 사용자가 textarea를 수정할 수 없게 하기 위함입니다.실제로 완성해보면 다음과 같다
import { useState } from 'react';
async function submitForm(answer) {
// 이 부분에 실제로 폼을 제출하는 로직을 추가해야 합니다.
// 예를 들어, 서버로 데이터를 전송하는 API 호출 등이 있을 수 있습니다.
console.log("Form submitted with answer: " + answer);
}
export default function MyFormComponent() {
const [answer, setAnswer] = useState('');
const [error, setError] = useState(null);
// 'typing', 'submitting', or 'success'
const [status, setStatus] = useState('typing');
const handleTextareaChange = (e) => {
setAnswer(e.target.value);
};
const handleSubmit = async (e) => {
e.preventDefault();
setStatus('submitting');
try {
await submitForm(answer);
setStatus('success');
} catch (err) {
setStatus('typing');
setError(err);
}
};
return (
<form onSubmit={handleSubmit}>
<textarea value={answer}
onChange={handleTextareaChange}
disabled={status === 'submitting'} />
<button disabled={
answer.length === 0 ||
status === 'submitting'
}>Submit</button>
{error !== null &&
<p className="Error">{error.message}</p>
}
</form>
);
}
const [x, setX] = useState(0);
const [y, setY] = useState(0);
const [position, setPosition] = useState({x: 0, y:0});
import { useState } from 'react';
export default function Accordion() {
const [activeIndex, setActiveIndex] = useState(0);
return (
<>
<h2>Almaty, Kazakhstan</h2>
<Panel title="About"
isActive={activeIndex === 0}
onShow={() => setActiveIndex(0)}
>
Almaty is Kazakhstan's largest city. From
1929 to 1997, it was its capital city.
</Panel>
<Panel title="Etymology"
isActive={activeIndex === 1}
onShow={() => setActiveIndex(1)}
>
The region surrounding Almaty is thought to
be the ancestral home of the apple.
</Panel>
</>
);
}
function Panel({
title, children, isActive, onShow
}) {
return (
<section className="panel">
<h3>{title}</h3>
{isActive ? (<p>{children}</p>) :
(<button onClick={onShow}>Show</button>)}
</section>
);
}