μ°Έκ³ λ§ν¬:
https://react.vlpt.us/styling/03-styled-components.html
[μ€μΉλ²]
npm install styled-components
npm install --save-dev prettier
npm install --save-dev eslint
π¨π¨π¨π¨π¨π¨π¨π¨π¨π¨π¨π¨π¨π¨π¨π¨π¨π¨
Index.tsx
import Accommodate from './Component/Accommodate';
(...)
root.render(
<React.StrictMode>
<Accommodate />
</React.StrictMode>
);
Accommodate.tsx
import React from 'react'
import { useState, useEffect } from 'react'
import App from '../App';
const MAX_CAPACITY = 10;
const Accommodate = (props) => {
const [isFull, setIsFull] = useState(false);
const [count, IncreaseCount, DecreaseCount] = App(0);
useEffect(() => {
console.log("==========");
console.log("useEffect() is called");
console.log(`isFull: ${isFull}`);
})
useEffect(() => {
setIsFull(count >= MAX_CAPACITY)
console.log(`Current count value: ${count}`);
}, [count]);
return (
<div style={{ padding: 16 }}>
<p>{`μ΄ ${count}λͺ
μμ©νμ΅λλ€.`}</p>
<button disabled={isFull} onClick={IncreaseCount}>μ
μ₯</button>
<button onClick={DecreaseCount}>ν΄μ₯</button>
{isFull && <p style={{ color: 'red' }}>μ μμ΄ κ°λ μ°Όμ΅λλ€.</p>}
</div>
)
}
export default Accommodate
App.tsx
import React from 'react'
import { useState } from 'react'
const App = () => {
const [isConfirmed, setIsConfirmed] = useState(false);
const handleConfirm = () => {
setIsConfirmed((prevIsConfirmed) => !prevIsConfirmed);
}
return <button onClick={handleConfirm}>
{isConfirmed ? "νμΈλ¨" : "νμΈνκΈ°"}
</button>;
}
export default App
π¨π¨π¨π¨π¨π¨π¨π¨π¨π¨π¨π¨π¨π¨π¨π¨π¨π¨
App.tsx
import React from 'react'
import { useState } from 'react'
const App = () => {
const [isConfirmed, setIsConfirmed] = useState(false);
const handleConfirm = () => {
setIsConfirmed((prevIsConfirmed) => !prevIsConfirmed);
}
return <button onClick={handleConfirm}>
{isConfirmed ? "νμΈλ¨" : "νμΈνκΈ°"}
</button>;
}
export default App
π¨π¨π¨π¨π¨π¨π¨π¨π¨π¨π¨π¨π¨π¨π¨π¨π¨π¨
App.tsx
import React from 'react'
import LoginControl from './Component/LoginControl'
const App = () => {
return (
<div>
<LoginControl />
</div>
)
}
export default App
Greeting.tsx
import React from 'react'
const UserGreeting = () => {
return <h1>λ€μ μ€μ
¨κ΅°μ!</h1>
}
const GuestGreeting = () => {
return <h1>νμκ°μ
μ ν΄μ£ΌμΈμ!</h1>
}
const Greeting = (props: any) => {
const isLoggedIn = props.isLoggedIn;
if (isLoggedIn) {
return <UserGreeting />
}
return <GuestGreeting />;
}
export default Greeting
LoginControl.tsx
import React, { useState } from 'react'
import Greeting from './Greeting'
const LoginButton = (props: any) => {
return <button onClick={props.onClick}>λ‘κ·ΈμΈ</button>
}
const LogoutButton = (props: any) => {
return <button onClick={props.onClick}>λ‘κ·Έμμ</button>
}
const LoginControl = () => {
const [isLoggedIn, setIsLoggedIn] = useState(false);
const handleLoginClick = () => {
setIsLoggedIn(true);
}
const handleLogoutClick = () => {
setIsLoggedIn(false);
}
let button;
if (isLoggedIn) {
button = <LogoutButton onClick={handleLogoutClick} />
} else {
button = <LoginButton onClick={handleLoginClick} />
}
return (
<div>
<Greeting isLoggedIn={isLoggedIn} />
{button}
</div>
)
}
export default LoginControl
π¨π¨π¨π¨π¨π¨π¨π¨π¨π¨π¨π¨π¨π¨π¨π¨π¨π¨
App.tsx
import React, { useState } from 'react'
const App = () => {
const [value, setValue] = useState('');
const handleChange = (e) => {
setValue(e.target.value);
}
const handleSubmit = (e) => {
alert(`μ
λ ₯ν μ΄λ¦: ` + value);
}
return (
<form onSubmit={handleSubmit}>
<label>
μ΄λ¦:
<input onChange={handleChange} value={value} type="text" />
</label>
<button type='submit'>μ μΆ</button>
</form>
)
}
export default App
π¨π¨π¨π¨π¨π¨π¨π¨π¨π¨π¨π¨π¨π¨π¨π¨π¨π¨
App.tsx
import React, { useCallback, useState } from 'react'
const App = () => {
const [value, setValue] = useState(`μμ²μ¬νμ μ
λ ₯νμΈμ`);
const handleChange = (e) => {
setValue(e.target.value);
}
const handleSubmit = () => {
alert(`μ
λ ₯ν μμ²μ¬ν: ` + value);
}
return (
<form onSubmit={handleSubmit}>
<label>
μμ²μ¬ν:
<textarea value={value} onChange={handleChange} />
</label>
<button>μ μΆ</button>
</form>
)
}
export default App
π¨π¨π¨π¨π¨π¨π¨π¨π¨π¨π¨π¨π¨π¨π¨π¨π¨π¨
App.tsx
import React, { useState } from 'react'
const App = () => {
const [value, setValue] = useState('grape');
const handleChange = (e) => {
setValue(e.target.value);
}
const handleSubmit = () => {
alert(`μ νν κ³ΌμΌ: ` + value);
}
return (
<form onSubmit={handleSubmit}>
<label>
<select value={value} onChange={handleChange}>
<option value="apple">μ¬κ³Ό</option>
<option value="banana">λ°λλ</option>
<option value="grape">ν¬λ</option>
<option value="watermelon">μλ°</option>
</select>
</label>
<button>μ μΆ</button>
</form>
)
}
export default App
π¨π¨π¨π¨π¨π¨π¨π¨π¨π¨π¨π¨π¨π¨π¨π¨π¨π¨
App.tsx
import React, { useState } from 'react'
const App = () => {
const [haveBreakfast, setHaveBreakfast] = useState(true);
const [numberOfGuest, setNumberOfGuest] = useState(2);
const handleSubmit = (e) => {
alert(`μμΉ¨μμ¬ μ¬λΆ: ` + haveBreakfast + `, λ°©λ¬Έκ° μ: ` + numberOfGuest);
}
return (
<form onSubmit={handleSubmit}>
<label>
μμΉ¨μμ¬ μ¬λΆ:
<input
type="checkbox"
checked={haveBreakfast}
onChange={(e) => {
setHaveBreakfast(e.target.checked);
}}
/>
</label>
<br />
<label>
λ°©λ¬Έκ° μ:
<input
type="number"
value={numberOfGuest}
onChange={(e: any) => {
setNumberOfGuest(e.target.value);
}}
/>
</label>
<button type='submit'>μ μΆ</button>
</form>
)
}
export default App