let [title, setTitle] = useState(0);
function Modal(props) {
return (
<div className="modal">
<h4>{ props.๊ธ์ ๋ชฉ[props.title] }</h4>
<p>๋ ์ง</p>
<p>์์ธ๋ด์ฉ</p>
</div>
)
}
props.๊ธ์ ๋ชฉ[title]๋ก ํ์ฌ ์ ํ๋ ์ธ๋ฑ์ค์ ๊ธ์ ๋ชฉ ํ์function App() {
let [title, setTitle] = useState(0);
return (
<div>
<button onClick={()=>{ setTitle(0) }}> 0๋ฒ๊ธ </button>
<button onClick={()=>{ setTitle(1) }}> 1๋ฒ๊ธ </button>
<button onClick={()=>{ setTitle(2) }}> 2๋ฒ๊ธ </button>
<Modal ๊ธ์ ๋ชฉ={๊ธ์ ๋ชฉ} title={title} />
</div>
)
}
function App() {
let [๊ธ์ ๋ชฉ, ๊ธ์ ๋ชฉ๋ณ๊ฒฝ] = useState(['๋จ์์ฝํธ ์ถ์ฒ', '๊ฐ๋จ ์ฐ๋๋ง์ง', 'ํ์ด์ฌ๋
ํ']);
let [title, setTitle] = useState(0);
return (
<div>
{
๊ธ์ ๋ชฉ.map(function(a, i) {
return (
<div className="list" key={i}>
<h4 onClick={()=>{ setTitle(i) }}>{ ๊ธ์ ๋ชฉ[i] }</h4>
<p>2์ 18์ผ ๋ฐํ</p>
</div>
)
})
}
<Modal ๊ธ์ ๋ชฉ={๊ธ์ ๋ชฉ} title={title} />
</div>
)
}
onClick={()=>{ setTitle(i) }}๋ก ํด๋ฆญํ ๊ธ์ ์ธ๋ฑ์ค๋ก state ์
๋ฐ์ดํธfunction App() {
let [๊ธ์ ๋ชฉ, ๊ธ์ ๋ชฉ๋ณ๊ฒฝ] = useState(['๋จ์์ฝํธ ์ถ์ฒ', '๊ฐ๋จ ์ฐ๋๋ง์ง', 'ํ์ด์ฌ๋
ํ']);
let [title, setTitle] = useState(0);
let [modal, setModal] = useState(false);
return (
<div>
{
๊ธ์ ๋ชฉ.map(function(a, i) {
return (
<div className="list" key={i}>
<h4 onClick={()=>{ setModal(true); setTitle(i); }}>{ ๊ธ์ ๋ชฉ[i] }</h4>
<p>2์ 18์ผ ๋ฐํ</p>
</div>
)
})
}
{
modal === true
? <Modal ๊ธ์ ๋ชฉ={๊ธ์ ๋ชฉ} title={title} />
: null
}
</div>
)
}
function Modal(props) {
return (
<div className="modal">
<h4>{ props.๊ธ์ ๋ชฉ[props.title] }</h4>
<p>๋ ์ง</p>
<p>์์ธ๋ด์ฉ</p>
</div>
)
}
state ์์น์ ๋ํ ์์น ์ค๋ช : ๊ฐ์์์๋ "state๋ฅผ ์ฌ์ฉํ๋ ์ปดํฌ๋ํธ ์ค ์ต๊ณ ๋ถ๋ชจ์ ๋ง๋ค์ด์ผ ํ๋ค"๋ ์ค์ํ ์์น์ ์ค๋ช ํ์ผ๋, ์ด๊ฒ์ด React์ "์ํ ๋์ด์ฌ๋ฆฌ๊ธฐ(lifting state up)" ๊ฐ๋ ์์ ๋ช ์ํ์ง ์์์ต๋๋ค. ๐ค
์ด๋ฒคํธ ํธ๋ค๋ง ์ต์ ํ ๋ถ์กฑ: ํด๋ฆญ ์ด๋ฒคํธ์์ ๋ ๊ฐ์ state๋ฅผ ์์ฐจ์ ์ผ๋ก ๋ณ๊ฒฝํ๋ ๋ฐฉ์(setModal(true); setTitle(i))์ ์ฌ์ฉํ๋๋ฐ, ์ด๋ React์ ๋ ๋๋ง ์ต์ ํ ๊ด์ ์์ ๋ ๋์ ๋ฐฉ๋ฒ์ด ์์ ์ ์์ต๋๋ค. ๐
์กฐ๊ฑด๋ถ ๋ ๋๋ง ๋ฐฉ์: ๋ชจ๋ฌ ํ์๋ฅผ ์ํด ์ผํญ ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ์ง๋ง, && ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ ๋ ๊ฐ๊ฒฐํ ๋ฐฉ์๋ ์๊ฐํ ์ ์์์ต๋๋ค. ๐
// ๊ธ ๋ชฉ๋ก์ ๋ณ๋ ์ปดํฌ๋ํธ๋ก ๋ถ๋ฆฌ
function BlogPost({๊ธ์ ๋ชฉ, index, onClick}) {
return (
<div className="list">
<h4 onClick={onClick}>{๊ธ์ ๋ชฉ}</h4>
<p>2์ 18์ผ ๋ฐํ</p>
</div>
);
}
function App() {
let [๊ธ์ ๋ชฉ, ๊ธ์ ๋ชฉ๋ณ๊ฒฝ] = useState(['๋จ์์ฝํธ ์ถ์ฒ', '๊ฐ๋จ ์ฐ๋๋ง์ง', 'ํ์ด์ฌ๋
ํ']);
let [title, setTitle] = useState(0);
let [modal, setModal] = useState(false);
return (
<div>
{๊ธ์ ๋ชฉ.map((์ ๋ชฉ, i) => (
<BlogPost
key={i}
๊ธ์ ๋ชฉ={์ ๋ชฉ}
index={i}
onClick={() => {
setModal(true);
setTitle(i);
}}
/>
))}
{modal && <Modal ๊ธ์ ๋ชฉ={๊ธ์ ๋ชฉ} title={title} />}
</div>
);
}
&& ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ ๋ ๊ฐ๊ฒฐํ ์กฐ๊ฑด๋ถ ๋ ๋๋ง ์ ์ฉ โ
import { useState, useCallback } from 'react';
function App() {
let [๊ธ์ ๋ชฉ, ๊ธ์ ๋ชฉ๋ณ๊ฒฝ] = useState(['๋จ์์ฝํธ ์ถ์ฒ', '๊ฐ๋จ ์ฐ๋๋ง์ง', 'ํ์ด์ฌ๋
ํ']);
let [title, setTitle] = useState(0);
let [modal, setModal] = useState(false);
// ํด๋ฆญ ์ด๋ฒคํธ ํธ๋ค๋ฌ ์ต์ ํ
const handleTitleClick = useCallback((i) => {
setModal(true);
setTitle(i);
}, []);
return (
<div>
{๊ธ์ ๋ชฉ.map((์ ๋ชฉ, i) => (
<div className="list" key={i}>
<h4 onClick={() => handleTitleClick(i)}>{์ ๋ชฉ}</h4>
<p>2์ 18์ผ ๋ฐํ</p>
</div>
))}
{modal && <Modal ๊ธ์ ๋ชฉ={๊ธ์ ๋ชฉ} title={title} />}
</div>
);
}
useCallback์ ์ฌ์ฉํ์ฌ ๋ถํ์ํ ํจ์ ์ฌ์์ฑ ๋ฐฉ์ง ๐import { createContext, useState, useContext } from 'react';
// Context ์์ฑ
const BlogContext = createContext();
function App() {
let [๊ธ์ ๋ชฉ, ๊ธ์ ๋ชฉ๋ณ๊ฒฝ] = useState(['๋จ์์ฝํธ ์ถ์ฒ', '๊ฐ๋จ ์ฐ๋๋ง์ง', 'ํ์ด์ฌ๋
ํ']);
let [title, setTitle] = useState(0);
let [modal, setModal] = useState(false);
return (
<BlogContext.Provider value={{ ๊ธ์ ๋ชฉ, title, setTitle, modal, setModal }}>
<div>
{๊ธ์ ๋ชฉ.map((์ ๋ชฉ, i) => (
<div className="list" key={i}>
<h4 onClick={() => {
setModal(true);
setTitle(i);
}}>{์ ๋ชฉ}</h4>
<p>2์ 18์ผ ๋ฐํ</p>
</div>
))}
{modal && <ModalWithContext />}
</div>
</BlogContext.Provider>
);
}
function ModalWithContext() {
const { ๊ธ์ ๋ชฉ, title } = useContext(BlogContext);
return (
<div className="modal">
<h4>{๊ธ์ ๋ชฉ[title]}</h4>
<p>๋ ์ง</p>
<p>์์ธ๋ด์ฉ</p>
</div>
);
}
&& ์ฐ์ฐ์์ ๋ํ ์ค๋ช
&&๋ ๋
ผ๋ฆฌ AND ์ฐ์ฐ์๋ก, ๋ ๊ฐ์ง ์ฃผ์ ์ฉ๋๊ฐ ์์.
true && true // true
true && false // false
false && true // false
false && false // false
ํต์ฌ: ์ผ์ชฝ์ด false๋ฉด ์ค๋ฅธ์ชฝ์ ์คํํ์ง ์์
let a = 5;
let b = 10;
a > 10 && console.log("์คํ๋จ"); // ์ถ๋ ฅ ์๋จ (a > 10์ด false)
a < 10 && console.log("์คํ๋จ"); // "์คํ๋จ" ์ถ๋ ฅ (a < 10์ด true)
๊ฐ์ฅ ๋ง์ด ์ฌ์ฉ๋๋ ํจํด:
function App() {
let [๋ชจ๋ฌ์ด๋ฆผ, ๋ชจ๋ฌ์ด๋ฆผ๋ณ๊ฒฝ] = useState(false);
return (
<div>
<button onClick={() => ๋ชจ๋ฌ์ด๋ฆผ๋ณ๊ฒฝ(true)}>๋ชจ๋ฌ ์ด๊ธฐ</button>
{/* ๋ชจ๋ฌ์ด๋ฆผ์ด true์ผ ๋๋ง Modal ์ปดํฌ๋ํธ ๋ ๋๋ง */}
{๋ชจ๋ฌ์ด๋ฆผ && <Modal></Modal>}
</div>
);
}
{๋ชจ๋ฌ์ด๋ฆผ && <Modal></Modal>}
๊ฒฝ์ฐ 1: ๋ชจ๋ฌ์ด๋ฆผ์ด true์ผ ๋
true && <Modal></Modal> โ <Modal></Modal> ๋ฐํ (์ปดํฌ๋ํธ ๋ ๋๋ง)๊ฒฝ์ฐ 2: ๋ชจ๋ฌ์ด๋ฆผ์ด false์ผ ๋
false && <Modal></Modal> โ false ๋ฐํ (์๋ฌด๊ฒ๋ ๋ ๋๋ง ์๋จ)// ๋ก๊ทธ์ธ ์ํ์ ๋ฐ๋ฅธ ๋ ๋๋ง
{๋ก๊ทธ์ธ๋จ && <div>ํ์ํฉ๋๋ค!</div>}
// ๋ฐฐ์ด์ ๋ฐ์ดํฐ๊ฐ ์์ ๋๋ง ๋ ๋๋ง
{๋ฐ์ดํฐ.length > 0 && <List data={๋ฐ์ดํฐ} />}
// ์๋ฌ๊ฐ ์์ ๋๋ง ์๋ฌ ๋ฉ์์ง ํ์
{์๋ฌ && <div className="error">{์๋ฌ}</div>}
// ์ซ์ 0์ falsy์ด๋ฏ๋ก ์ฃผ์!
{items.length && <List />} // items.length๊ฐ 0์ด๋ฉด 0์ด ํ๋ฉด์ ์ถ๋ ฅ๋จ
// ํด๊ฒฐ๋ฐฉ๋ฒ
{items.length > 0 && <List />} // ๋ช
์์ ์ผ๋ก boolean ๋ง๋ค๊ธฐ
React์์ &&๋ "์กฐ๊ฑด์ด ์ฐธ์ผ ๋๋ง ๋ ๋๋งํ๊ณ ์ถ๋ค"๋ ์ํฉ์์ ๊ฐ์ฅ ์ ์ฉํจ!