Front-end Development Learning React Basic React Component: How They are Rendered and Behave in Browser 리μ‘νΈμμ μ»΄ν¬λνΈλ ν¨μμ ν΄λμ€μ ννλ‘ μ μλ μ μμ΅λλ€.
ν¨μν μμ(component as function) λ props
κ°μ²΄λ₯Ό μΈμλ‘ λ°μ 리μ‘νΈ μμλ₯Ό λ°ννλ λ°©μμΌλ‘, κ°κ²°ν μ μΈμ΄ νΉμ§μ
λλ€.
μλ°μ€ν¬λ¦½νΈμ ES6 ν΄λμ€ λ¬Έλ²μΌλ‘ κ³κΈν ν¨μ(component as class) λ₯Ό μ μν μ μμ΅λλ€. μ΄μ λ μ μ¬μ©λμ§ μμ§λ§ λͺ κ°μ§ μΆκ° κΈ°λ₯λ€μ νμ©ν μ μλ€λ μ₯μ μ΄ μμ΅λλ€.
ν¨μ/κ³κΈν μ»΄ν¬λνΈλ₯Ό μ μΈνλ μ½λ
Copy // decalre using function syntax
function Foo(props){
return (
<h1>Hello, {props.name}</h1>;
)
}
// declare using class syntax
class Food extends React.Component{
render(){
return <h1>Hello, {this.props.name}</h1>
}
}
React Rendering
리μ‘νΈ μμ§/리μ‘νΈ DOM(react DOM/react engine) μ μ¬μ©μκ° μ μν μ»΄ν¬λνΈλ₯Ό μ€μ DOM μμλ‘ λ³νν©λλ€. μ΄ κ³Όμ μ 리μ‘νΈ λ λλ§(react rendering) μ΄λΌκ³ ν©λλ€. λ€μμ 리μ‘νΈ DOMμ΄ μ»΄ν¬λνΈλ₯Ό μ€μ DOM μμλ‘ λ³ννλ κ³Όμ μ λν μ€λͺ
μ
λλ€:
μ΄κΈ° λ λλ§(initial rendering) μ μμνλ€.
ReactDOM.render()
λλ createRoot().render()
λ₯Ό ν΅ν΄ λ λλ§ νλ‘μΈμ€λ₯Ό νΈμΆν©λλ€.
κ°μ DOM(virtual DOM) μ¦ λ¦¬μ‘νΈ DOMμ ꡬλμν€κ³ , μ΄λ μ£Όμ΄μ§ μ½λλ₯Ό μ½μ΄ μ»΄ν¬λνΈ κ°μ κ³μΈ΅ ꡬ쑰λ₯Ό ννν μΌμ’
μ μ§λμ
λλ€.
μ΄ν, μ€μ DOMκ³Ό λΉκ΅νμ¬ μ°¨μ΄μ μ νμΈν©λλ€. λ§μ½ κ°μ DOMκ³Ό μ€μ DOM μ¬μ΄μ μ°¨μ΄κ° μλ€λ©΄, μ€μ DOMμ κ°±μ νμ¬ λ DOMμ λκΈ°νν΄μΌ ν©λλ€.
리-λ λλ§(re-rendering) μ νΈμΆνλ€.
useState
, useReducer
λ±μ ν΅ν΄ μνκ° λ³κ²½λμλ€λ©΄ ν΄λΉ μ»΄ν¬λνΈ λλ κ·Έ μμμ λͺ¨λ λ€μ λλλ§ν΄μΌ ν©λλ€.
λλλ§μ νΈμΆνλ μ½λ
Copy // Calling Renderer as Functional Component
function Greeting({name}) {
return <h1>Hello, {name}</h1>;
}
// Calling Renderer as Class Component
class Greeting extends React.Component {
render() {
return <h1>Hello, {this.props.name}</h1>;
}
}
Event Handling/Event Handler
리μ‘νΈλ JSX
μ μ¬μ©μ μ μ μ΄λ²€νΈ νΈλ€λ¬λ₯Ό μΆκ°ν μ μμ΅λλ€. μ΄λ ν΄λ¦, νΈλ², ν¬μ»€μ€, μ
λ ₯κ³Ό κ°μ μ¬μ©μ λμμ λ°μνμ¬ μ€νλ©λλ€. μ΄λ²€νΈ νΈλ€λ¬λ₯Ό μΆκ°νλ €λ©΄ λ¨Όμ ν¨μλ₯Ό μ μν ν, μ΄λ₯Ό JSX
νκ·Έμ μμ±μΌλ‘ μ λ¬ν΄μΌ ν©λλ€:
μ»΄ν¬λνΈ λ΄λΆ λλ μΈλΆμ handleClick
ν¨μλ₯Ό μ μΈνμ¬ μνλ λμμ ꡬνν©λλ€.
<button>
νκ·Έμ onClick={handleClick}
μμ± μ μλ₯Ό μΆκ°ν©λλ€:
Copy // Wrtie it in pre-rendering area (Nested Function Pattern)
export default function Button(){
function handleClick(){
alert("You clicked me!");
}
return(
<button onClick={handleClick}>
Click Me
</button>
);
}
// Write it in HTML element (Inline Pattern)
function Button__(){
return (<button onClick={function handleClick()=>{alert("you clicked me!");}})></button>)
}
μ΄λ²€νΈ νΈλ€λ¬λ₯Ό ν΅ν΄ νΉμ±μ μ½κΈ° μ΄λ²€νΈ νΈλ€λ¬λ μ»΄ν¬λνΈ λ΄λΆμμ μ μλλ―λ‘ ν΄λΉ μ»΄ν¬λνΈμ props
μ μμ°μ€λ½κ² μ κ·Όν μ μμ΅λλ€. μλ μμλ₯Ό ν΅ν΄ μ΄λ²€νΈ νΈλ€λ¬μμ props
λ₯Ό μ½λ λ°©λ²μ μ΄ν΄λ΄
λλ€.
Copy function AlertButton({message,children}){
return (
<button onClick={()=>(alert(message))}>
{children}
</button>
);//nest
}
export default function Toolbar(){
return(
<div>
<AlertButton message="Playing!">
Play Movie
</AlertButton>
<AlertButton message="Uploading!">
Upload Image
</AlertButton>
</div>
);//nest
}
μ΄λ²€νΈ νΈλ€λ¬λ₯Ό ν΅ν΄ νΉμ±μ μ ννκΈ° λΆλͺ¨ μ»΄ν¬λνΈμμ μμ μ»΄ν¬λνΈμ μ΄λ²€νΈ νΈλ€λ¬λ₯Ό μ μ΄νλ €λ©΄ propsλ₯Ό ν΅ν΄ μ λ¬νλ©΄ λ©λλ€. λꡬ창 μμλ<PlayButton>
κ³Ό<UploadButton>
μ λ λλ§νλλ°,handlePlayClick()
μonClick()
νΉμ±μΌλ‘ <Button>
μ μ λ¬ν©λλ€. νμμ κ²½μ° μΈλΌμΈ ν¨μλ₯ΌonClick()
νΉμ±μ ν΅ν΄ <Button>
μ μ λ¬ν©λλ€.
Copy function Button({onClick,children}){
return(
<button onClick={onClick}> {children} </button>
);//nest
}
function PlayButton({movieName}){
function handlePlayClick(){
alert("Playing ${moiveName}");
}
return(
<Button onClick={handlePlayClick}>Play {movieName} </Button>
);//nest
}
function UploadBUtton(){
return (
<Button onClick={()=>alert("uploading")}> upload image </Button>
);//nest
}
function UploadBUtton(){
return (
<PlayButton movieName="Kiki's Delivery Service"/>
<UploadButton/>
);//nest
}