React 치트시트
검색하고 인쇄할 수 있는 React 19 참조 자료——컴포넌트, JSX, 훅, 새로운 Actions API, 컨텍스트, ref, 성능. 무료.
Components & JSX
12function App() { return <h1>Hi</h1>; }
A function component returning JSX
export default function App() {}
Default-export a component
<Greeting name="Ada" />
Render a component with props
{1 + 2} or {user.name}
Embed a JS expression with braces
<>{a}{b}</>
Fragment groups nodes, no extra DOM
<div className="card">
Use className, not class, for CSS
{isOpen && <Menu />}
Render conditionally with &&
{ok ? <Yes /> : <No />}
Choose between nodes with a ternary
{items.map(i => <li key={i.id}>{i.t}</li>)}
Render a list from an array
function Btn({ label, onClick }) {}
Destructure props in the signature
function Card({ children }) { return children; }
Read nested JSX via the children prop
<input value={v} onChange={onChange} />
Controlled input bound to state
Rendering & setup
10import { createRoot } from 'react-dom/client'
Import the client root API
createRoot(document.getElementById('root')).render(<App/>)
Mount the app into the DOM
import { StrictMode } from 'react'
Import StrictMode wrapper
<StrictMode><App /></StrictMode>
Surface bugs in development
import { hydrateRoot } from 'react-dom/client'
Import the hydration API
hydrateRoot(el, <App />)
Attach React to server HTML
root.unmount()
Tear down a mounted root
import App from './App.jsx'
Import a component from a module
<App {...props} />
Spread an object as props
export { Button, Card }
Named-export multiple components
State & effects
12const [count, setCount] = useState(0)
Declare a state variable
setCount(c => c + 1)
Update from the previous value
setUser(u => ({ ...u, name }))
Update object state immutably
useEffect(() => { run(); }, [dep])
Run an effect when deps change
useEffect(() => { /* once */ }, [])
Run an effect only on mount
useEffect(() => () => cleanup(), [])
Return a cleanup function
const ref = useRef(null)
Hold a mutable value across renders
const [state, dispatch] = useReducer(r, init)
Manage complex state with a reducer
const theme = useContext(ThemeContext)
Read the nearest context value
const memo = useMemo(() => calc(a), [a])
Memoize an expensive computation
useLayoutEffect(() => {}, [])
Run synchronously after layout
useSyncExternalStore(sub, get)
Subscribe to an external store
React 19 hooks & APIs
12import { use } from 'react'
Import the new use API
const data = use(promise)
Read a promise, suspends until ready
const theme = use(ThemeContext)
Read context, allowed conditionally
const [state, action, pending] = useActionState(fn, init)
Track state, action and pending
const [opt, addOpt] = useOptimistic(state, reducer)
Show an optimistic value instantly
const { pending } = useFormStatus()
Read the parent form submit status
const [isPending, startTransition] = useTransition()
Mark updates as non-urgent
startTransition(async () => await save())
Run an async Action in a transition
const deferred = useDeferredValue(value)
Defer a value to keep UI responsive
const id = useId()
Generate a stable unique id
<title>Page title</title>
Render metadata anywhere in the tree
function Input({ ref }) {}
ref is a normal prop, no forwardRef
Forms & Actions
12<form action={handleSubmit}>
Pass a function as a form Action
function handleSubmit(formData) {}
Action receives the FormData
formData.get('email')
Read a field from FormData
const [state, action] = useActionState(submit, null)
Wire an Action to component state
<form action={action}>
Use the wrapped Action on the form
const [s, a, pending] = useActionState(fn, init)
Expose a pending flag for the UI
return { error: 'Invalid' }
Return error state from an Action
function Submit() { const { pending } = useFormStatus() }
Read pending inside the submit button
<button disabled={pending}>Save</button>
Disable submit while pending
import { requestFormReset } from 'react-dom'
Import the form reset helper
requestFormReset(formEl)
Reset an uncontrolled form
<form action={action}><Submit /></form>
Compose Action form with status
Props & composition
10function Hi({ name = 'Guest' }) {}
Default prop via destructuring
function Box({ children }) { return children; }
Wrap content with the children prop
<Box><p>Inside</p></Box>
Pass JSX as children
function List({ render }) { return render(); }
Render prop pattern
<List render={() => <Item />} />
Provide a render function
<Input {...props} />
Forward all props with spread
const { id, ...rest } = props
Pick a prop and pass the rest
<Avatar {...rest} size="lg" />
Spread then override a prop
function Btn(props: BtnProps) {}
Type props with TypeScript interfaces
<Slot label={<b>Hi</b>} />
Pass JSX through a named prop
Events
10<button onClick={handleClick}>
Attach a click handler
function handleClick(e) {}
Receive the synthetic event
<input onChange={e => set(e.target.value)} />
Read an input value on change
<form onSubmit={e => e.preventDefault()}>
Stop the default form submit
e.stopPropagation()
Prevent the event from bubbling
<li onClick={() => remove(id)}>
Pass arguments with a closure
<input onKeyDown={e => e.key === 'Enter'}
Handle a specific key press
<div onMouseEnter={hover}>
Listen for pointer events
e.currentTarget.value
Read the element the handler is on
<button onClick={() => {}} type="button">
Avoid implicit form submission
Lists & keys
10arr.map(x => <li key={x.id}>{x.t}</li>)
Render one node per item
key={item.id}
Give each item a stable key
key={index}
Index keys only for static lists
users.map(u => <Card key={u.id} {...u} />)
Spread item fields as props
{list.length === 0 && <Empty />}
Show a fallback for empty lists
import { Fragment } from 'react'
Import Fragment for keyed groups
<Fragment key={id}>{a}{b}</Fragment>
A keyed fragment in a list
{rows.filter(r => r.on).map(...)}
Filter before mapping
Keys must be unique among siblings
Why keys help React diff lists
{[...Array(n)].map((_, i) => ...)}
Map a fixed-length range
Context
10const ThemeContext = createContext('light')
Create a context with a default
import { createContext } from 'react'
Import the context factory
<ThemeContext value={theme}>
Provide a value (React 19 syntax)
<ThemeContext value={theme}><App /></ThemeContext>
Wrap the tree that reads it
const theme = useContext(ThemeContext)
Read context with useContext
const theme = use(ThemeContext)
Read context with the use API
if (cond) { const t = use(Ctx); }
use can read context conditionally
export const ThemeContext = createContext()
Export a shared context
<Ctx value={{ user, setUser }}>
Pass an object as the value
Avoid new objects each render
Memoize values to limit re-renders
Refs
10const inputRef = useRef(null)
Create a ref holder
<input ref={inputRef} />
Attach the ref to a node
inputRef.current.focus()
Access the DOM node via current
function Field({ ref }) { return <input ref={ref} /> }
ref as a prop, no forwardRef
<Field ref={inputRef} />
Pass a ref to a component
useImperativeHandle(ref, () => ({ focus }))
Expose an imperative API
const setRef = node => { box = node; }
Use a callback ref
<div ref={setRef} />
Attach a callback ref
const count = useRef(0)
Store a value without re-rendering
ref={node => { return () => cleanup(); }}
Callback ref with cleanup (React 19)
Performance
10const Memo = memo(Component)
Skip re-render when props are equal
import { memo } from 'react'
Import the memo helper
const value = useMemo(() => calc(a), [a])
Cache a computed value
const fn = useCallback(() => f(a), [a])
Cache a function identity
const Lazy = lazy(() => import('./Big.jsx'))
Code-split a component
import { lazy, Suspense } from 'react'
Import lazy and Suspense
<Suspense fallback={<Spin />}><Lazy /></Suspense>
Show a fallback while loading
startTransition(() => setQuery(q))
Mark non-urgent state updates
const slow = useDeferredValue(query)
Defer expensive derived UI
React Compiler auto-memoizes
Often removes manual memoization
Misc & metadata
10<Suspense fallback={<Loading />}>
Boundary for async content
class ErrorBoundary extends Component {}
Catch render errors (legacy class)
<title>My Page</title>
Hoist document title from a component
<meta name="description" content="..." />
Render meta tags into the head
<link rel="stylesheet" href="..." />
Hoist a stylesheet link
<Comp key={id} />
Change key to remount a component
React.lazy(() => import('./Page.jsx'))
Lazily import a route component
createPortal(node, container)
Render into a different DOM node
{/* a comment */}
Write a comment inside JSX
cleanup return in useEffect
Always release subscriptions/timers
“:q”와 일치하는 항목이 없습니다.
React 치트시트 소개
이 React 치트시트는 React 19를 기준으로 개념별로 라이브러리를 정리했습니다: 컴포넌트와 JSX, 렌더링과 설정, 상태와 이펙트, React 19 훅과 API, 폼과 Actions, props와 컴포지션, 이벤트, 리스트와 키, 컨텍스트, ref, 성능, 그리고 메타데이터 및 기타입니다.
모든 컴포넌트에서 쓰는 기본기 — useState, useEffect, props, key, 제어 입력 — 뿐 아니라 Actions 기반 폼 패턴을 포함한 최신 React 19 추가 사항까지 다루므로, 복습용으로도 최신 API로 넘어가는 다리로도 활용할 수 있습니다.
이 시트는 무료이며 클라이언트 사이드에서 동작합니다. 검색창으로 훅과 패턴을 실시간 필터링하고, 고정 목차로 섹션 간 이동하고, 클릭 한 번으로 스니펫을 복사하고, 컴포넌트 작업 중 참고용으로 페이지를 인쇄할 수 있습니다.
React 치트시트 사용 방법
- 컴포넌트 및 JSX와 상태 및 이펙트부터 React 19 훅 및 API와 성능까지 섹션을 훑어봅니다.
- useEffect, key, context 같은 훅이나 개념을 검색해 시트를 실시간으로 필터링합니다.
- 특정 패턴이 필요할 때 고정 사이드바로 폼 및 Actions나 ref 섹션으로 이동합니다.
- 스니펫이나 복사 아이콘을 클릭해 코드를 컴포넌트에 복사합니다.
- 오프라인 React 참고용으로 시트를 인쇄합니다.
자주 묻는 질문
네. 오래된 기본기 외에도 React 19 전용 훅과 API 섹션, 그리고 최신 Actions 패턴을 중심으로 만든 폼 섹션이 별도로 있습니다.
열두 개 섹션입니다: 컴포넌트와 JSX, 렌더링과 설정, 상태와 이펙트, React 19 훅과 API, 폼과 Actions, props와 컴포지션, 이벤트, 리스트와 키, 컨텍스트, ref, 성능, 메타데이터 및 기타입니다.
네. 상태 및 이펙트 섹션에서는 useState와 useEffect의 흔한 변형까지 함께 보여주며, 컨텍스트, ref, 성능 섹션에서는 각 주제에 해당하는 훅을 다룹니다.
네. 어떤 코드 스니펫이나 호버 복사 아이콘을 클릭하면 클립보드에 복사되고 짧은 확인 메시지가 뜹니다.
네, 완전 무료입니다 — 검색과 인쇄가 가능하고 브라우저에서 렌더링되며 가입도 필요 없습니다.
인기 검색어
react cheat sheet
react hooks list
usestate and useeffect
react 19 hooks
react props and components
react context example
jsx syntax reference
react memo performance
도움이 필요하신가요?
이 도구에서 문제를 발견하셨나요? 저희 팀에 알려주세요.