25.06.05 - se5ri/React GitHub Wiki
09/
βββ node_modules/
βββ public/
βββ src/
β βββ assets/
β βββ ~/likelion-script/script_js/React/works/
β β βββ Title.tsx
β βββ pages/
β βββ todo/
β βββ List.tsx
β βββ App.css
β βββ App.tsx
β βββ index.css
β βββ main.tsx
β βββ vite-env.d.ts
βββ .gitignore
βββ eslint.config.js
βββ index.html
βββ package-lock.json
βββ package.json
βββ README.md
βββ tsconfig.app.json
βββ tsconfig.json
βββ tsconfig.node.json
π 09 Viteλ‘ κ°λ° νκ²½ κ΅¬μΆ λ° λΉλ, λ°°ν¬
- π» Title.tsx
- π» List.tsx
- π» App.tsx
- π» main.tsx
- π» index.html
- π» eslint.config.js
-
κ°λ
- JSX(JavaScript XML)λ μλ°μ€ν¬λ¦½νΈ νμΌ λ΄μ HTMLκ³Ό μ μ¬ν λ§ν¬μ μ μμ±ν μ μκ² ν΄μ£Όλ μλ°μ€ν¬λ¦½νΈ νμ₯ ꡬ문
- Reactμμ μ¬μ©ν λͺ©μ μΌλ‘ κ°λ°λκΈ°λ νμ§λ§ JSXκ° Reactμ ν¬ν¨λ κΈ°μ μ μλκΈ° λλ¬Έμ Reactμμ JSX μ¬μ©μ΄ νμλ μλ
-
React.createElement()
μ§μ μ¬μ©
-
1 λ¨μΌ λ£¨νΈ μμλ₯Ό λ°νν΄μΌ νλ€.
-
JSXλ μλ°μ€ν¬λ¦½νΈ κ°μ²΄λ‘ λ³νλλλ° ν¨μκ° μ¬λ¬ κ°μ²΄λ₯Ό λ°ν ν μ μμΌλ―λ‘ λ¨μΌ κ°μ²΄λ₯Ό λ°ννλλ‘ ν΄μΌν¨
-
λ§μ½ λ¨μΌ μμλ₯Ό λ°ννμ§ μμ κ²½μ°
Adjacent JSX elements must be wrapped in an enclosing tag. Did you want a JSX fragment <>...</>?
μλ¬ λ°μreturn ( <h1>Todo List</h1> <div>...</div> );
-
λ£¨νΈ μμλ₯Ό μΆκ°
return ( <div> <h1>Todo List</h1> <div>...</div> </div> );
-
Fragment μ¬μ©
- λ λλ§ κ²°κ³Όμλ μν₯μ λ―ΈμΉμ§ μμ
return ( <Fragment> <h1>Todo List</h1> <div>...</div> </Fragment> );
-
Fragmentμ μ½μ΄ μ¬μ©
return ( <> <h1>Todo List</h1> <div>...</div> </> );
2 λͺ¨λ νκ·Έλ λ«λλ€.
- HTMLμμλ λ«λ νκ·Έλ₯Ό μλ΅ ν μ μμ§λ§ JSXλ XMLκ³Ό μ μ¬ν λ¬Έλ²μ΄λ―λ‘ λ«λ νκ·Έλ₯Ό νμ μμ±ν΄μΌ ν¨
-
HTML μμ
<img src="./logo.png"> <br> <ul> <li>λλΆ <li>κ³λ <li>λΌλ©΄ </ul>
-
JSX μμ
<img src="./logo.png" /> <br /> <ul> <li>λλΆ</li> <li>κ³λ</li> <li>λΌλ©΄</li> </ul>
-
3 μμμ μμ±λͺ μ μΉ΄λ© νκΈ°λ²(camel case)μ μ€μν΄μΌ νλ€.
-
μμ±λͺ μ HTML νμ€ μμ±λͺ μ΄ μλ DOM API μ€νμ κΈ°λ°μ λ
-
stroke-width
->strokeWidth
-
onclick
->onClick
-
onkeyup
->onKeyUp
-
-
HTMLμμ
class
μμ± μΆκ°<div id="todolist" class="todo"></div>
-
μλ°μ€ν¬λ¦½νΈμμ
class
μμ± μΆκ°document.querySelector('#todolist').className = 'todo';
-
JSXμμ
class
μμ± μΆκ°<div id="todolist" className="todo"></div>
-
JSXμμ
class
μμ±μ λμ μΌλ‘ μΆκ°const todoClass = 'todo'; <div id="todolist" className={ todoClass }></div>
-
μλ°μ€ν¬λ¦½νΈ μμ½μ΄λΌ μΆ©λμ νΌνκΈ° μν΄ μμ±λͺ μμ²΄κ° λ°λ κ²½μ°
-
class
->className
-
for
->htmlFor
-
4 보κ°λ²{ }μ μ¬μ©ν λμλ ννμμ μ¬μ©ν΄μΌ ν¨
- { } μμλ λ³μκ°, λ©μλ 리ν΄κ° λ± κ°λ§ μ¬μ© κ°λ₯
-
if
λ¬Έ,for
λ¬Έ λ±μ μ¬μ©ν μ μμ-
if
λ¬Έ λμ μΌν μ°μ°μ μ¬μ©{ item.done ? <s>λλΆ</s> : 'λλΆ' }
-
for
λ¬Έ λμforEach()
,map()
λ± μ¬μ©{ for(let i=0; i<itemList.length; i++){ return item.title; } }
{ itemList.map(item => item.title) }
-
5 보κ°λ HTML λ¬Έμμ΄μ μΈμ½λ©λ¨
-
{ } λ΄λΆμ κ°μ΄ HTML μ½λκ° ν¬ν¨λ λ¬Έμμ΄μΈ κ²½μ° HTML νκ·Έλ₯Ό μΈμ½λ©ν΄μ μ²λ¦¬νλ―λ‘ λΈλΌμ°μ μλ νκ·Έκ° κ·Έλλ‘ λ³΄μ¬μ§
- XSS (Cross Site Scripting) κ°μ 곡격μ λλΉνκΈ° μν κ·μΉ
-
μμ
const App(){ const msg = '<i>World</i>'; return <span>Hello { msg }</span> } // λ§λ€μ΄μ§λ λ¬Έμμ΄: <span>Hello <i>World</i></span>
-
μ€ν κ²°κ³Ό
- Hello World
-
ν΄κ²° λ°©λ²
- dangerouslySetInnerHTML μμ±μ μ¬μ©νλ©΄ HTML νκ·Έλ₯Ό μΈμ½λ©νμ§ μμ
const App(){ // { msg }λ₯Ό <span dangerouslySetInnerHTML={{ __html: msg }}></span>λ‘ λ³κ²½ const msg = '<i>World</i>'; return <span>Hello <span dangerouslySetInnerHTML={{ __html: msg }}></span></span> }
- JSXλ XSS 곡격μ μμ νλ―λ‘ JSXλ₯Ό μ¬μ©
const App(){ // const msg = '<i>World</i>'; const msg = <i>World</i>; return <span>Hello { msg }</span> }
-
κ°λ
-
λΆλͺ¨ μ»΄ν¬λνΈμμ μμ μ»΄ν¬λνΈλ‘ λ°μ΄ν°λ₯Ό μ λ¬ν λ μ¬μ©
// ch02-start/todo/08.html function App(){ const list = [ { _id: 1, title: 'React 곡λΆ', done: false}, { _id: 2, title: 'Javascript νλ‘μ νΈ', done: true}, { _id: 3, title: 'Javascript 곡λΆ', done: true}, ]; return ( <div id="app"> <div> <Title title="08 Simple Todo List - React Props" /> <TodoList list={ list } /> </div> </div> ); } function Title({ title = 'Todo List' }){ return ( <div> <h1>{ title }</h1> <hr /> </div> ); } function TodoList({ list }){ const itemList = list.map(item => { return ( <li key={ item._id }>{ item.title } - { item.done ? 'μλ£' : 'μ§νμ€' }</li> ); }); return ( <ul className="todolist"> { itemList } </ul> ) }
-
ν¨μμ λ°μ΄ν°λ₯Ό μ λ¬ν λ μΈμλ₯Ό μ¬μ©νλ―μ΄ μ»΄ν¬λνΈμ λ°μ΄ν°λ₯Ό μ λ¬ν λ Propsλ₯Ό μ¬μ©
- JSXμμ μμ μ»΄ν¬λνΈλ₯Ό HTML νκ·Έμ²λΌ μ¬μ©ν λ HTML νκ·Έμ μμ±μ μ§μ νλ κ²μ²λΌ μ¬μ©
<TodoList list={ list } />
-
λΆλͺ¨ μ»΄ν¬λνΈκ° μ λ¬ν μ¬λ¬ μμ±μ΄ μμ μ»΄ν¬λνΈμλ νλμ Props κ°μ²΄λ‘ μ λ¬λλ―λ‘ μ£Όλ‘ κ΅¬μ‘° λΆν΄ ν λΉμ μ΄μ©ν΄μ νμν μμ±μ λ°λ‘ κΊΌλ΄μ μ¬μ©
function TodoList({ list }){ .... }
-
κΈ°λ³Έκ° λ§€κ°λ³μλ₯Ό μ¬μ©νλ©΄ Propsκ° μ λ¬λμ§ μκ±°λ undefinedκ° λͺ μμ μΌλ‘ μ λ¬λ λ μ μ©λ¨
- null, 0 κ°μ κΈ°λ³Έκ°μΌλ‘ λ체λμ§ μμ
-
μμ μ΄ μ λ¬λ°μ Props μ 체λ₯Ό μμ μ»΄ν¬λνΈμ μ λ¬νκ³ μΆμ λλ μ κ° μ°μ°μλ₯Ό μ¬μ©
function Profile(props) { return ( <div> <Avatar { ...props } /> </div> ); }
-
Propsλ‘ κ°μ²΄λ₯Ό μ λ¬ λ°μ λ μμ μ»΄ν¬λνΈκ° κ·Έ κ°μ μ§μ λ³κ²½νλ κ²μ κΆμ₯νμ§ μμ
- Reactμ λ°μ΄ν°λ λΆλͺ¨ μ»΄ν¬λνΈμμ μμ μ»΄ν¬λνΈλ‘ μ λ¬λλλ° μμ μ»΄ν¬λνΈμμ λΆλͺ¨ μ»΄ν¬λνΈμ λ°μ΄ν°λ₯Ό μ§μ μμ νλ©΄ λ°μ΄ν°μ νλ¦μ μμΈ‘νκΈ° μ΄λ €μμ λλ²κΉ νκΈ° μ΄λ €μ΄ μ€λ₯λ₯Ό λ§λ€ μ μμ
-
π 10 Button μ»΄ν¬λνΈμ Props μ λ¬
10/
βββ node_modules/
βββ public/
βββ src/
β βββ assets/
β βββ components/
β β βββ Button.tsx
β β βββ Counter.tsx
β β βββ Header.tsx
β βββ App.css
β βββ App.tsx
β βββ index.css
β βββ main.tsx
β βββ vite-env.d.ts
βββ .gitignore
βββ eslint.config.js
βββ index.html
βββ package.json
βββ README.md
βββ tsconfig.app.json
βββ tsconfig.json
βββ tsconfig.node.json
βββ vite.config.ts
- π» Button.tsx
- π» Counter.tsx
- π» Header.tsx
- π» App.tsx
- π» main.tsx