โ ๋น๊ตฌ์กฐํ ํ ๋น
const { name, favoriteNumber, children } = this.props; // ๋น๊ตฌ์กฐํ ํ ๋น
const { number, fixedNumber } = this.state; // ๋น๊ตฌ์กฐํ ํ ๋น
this.props ๊ฐ ๊ฐ์ง name, favoriteNumber, children ๊ฐ์ { name, favoriteNumber, children } ์ ๋ฃ์ด์ค๋ค.
โ constructor ์์ด state ์ด๊น๊ฐ ์ง์ ํ๊ธฐ
class Counter extends Component {
state = {
number: 0,
fixedNumber: 0
}
render(){
const {number, fixedNumber} = this.state;
return ( ... );
}
}
โ this.setState ์ ๊ฐ์ฒด ๋์ ํจ์ ์ธ์ ์ ๋ฌํ๊ธฐ
onClick={() => {
this.setState({ number: number + 1 });
this.setState({ number: this.state.number + 1 });
}}
์ด ๊ฒฝ์ฐ ํด๋ฆญ์ ํ์ ๋ ์ซ์๊ฐ ์ฆ๊ฐํ๋ ์ด๋ฒคํธ๊ฐ ๋ ๋ฒ ๋ฐ์ํ ๊ฒ ๊ฐ์ง๋ง, ์ค์ ๋ก๋ ์ซ์๊ฐ ํ ๋ฒ๋ง ์ฆ๊ฐํ๋ค. this.setState ๋ฅผ ์ฌ์ฉํ๋ค๊ณ ํด์ ๋ฐ๋ก state ๊ฐ์ด ๋ฐ๋์ง๋ ์๊ธฐ ๋๋ฌธ์ด๋ค. ์ด์ ๋ํ ํด๊ฒฐ์ฑ ์ด this.setState ๋ฅผ ์ฌ์ฉํ ๋ ๊ฐ์ฒด ๋์ ํจ์๋ฅผ ์ธ์๋ก ๋ฃ์ด์ฃผ๋ ๊ฒ์ด๋ค.
<button onClick={() => {
this.setState(prevState => {
return{
number: prevState.number + 1
}
});
// ์ ์ฝ๋์ ์๋ ์ฝ๋๋ ๊ฐ์ ๊ธฐ๋ฅ์ ํ๋ค.
// ์ฐจ์ด์ ์ ์๋ ์ฝ๋๋ ํจ์์์ ๋ฐ๋ก ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ค๋ ์๋ฏธ์ด๋ค.
this.setState(prevState => ({
number: prevState.number + 1
}));
}}></button>
์ฌ๊ธฐ์ prevState ๋ ๊ธฐ์กด ์ํ์ด๊ณ , props๋ ํ์ฌ ์ง๋๊ณ ์๋ props ๋ฅผ ๊ฐ๋ฆฌํจ๋ค.
โ useState ์์๋ณด๊ธฐ
const [message, setMessage] = useState('');
useState ํจ์์ ์ธ์์๋ ์ํ์ ์ด๊น๊ฐ์ ๋ฃ์ด ์ฃผ๋๋ฐ, ๋ฐ๋์ ๊ฐ์ฒด์ผ ํ์๋ ์๋ค. ๋ฌธ์์ด, ์ซ์, ๊ฐ์ฒด, ๋ฐฐ์ด ๋ฑ ๊ฐ์ ํํ๋ ์์ ์ด๋ค. ํจ์๋ฅผ ํธ์ถํ๋ฉด ๋ฐฐ์ด์ด ๋ฐํ๋๋๋ฐ ๋ฐฐ์ด์ ์ฒซ ๋ฒ์งธ ์์๋ ํ์ฌ ์ํ์ด๊ณ , ๋ ๋ฒ์งธ ์์๋ ์ํ๋ฅผ ๋ฐ๊พธ์ด์ฃผ๋ ํจ์์ด๋ค. ์ด๋ฅผ Setter ํจ์๋ผ๊ณ ํ๋ค. ๋ฐฐ์ด ๋น๊ตฌ์กฐํ ํ ๋น์ ํตํด ์ด๋ฆ์ ์์ ๋กญ๊ฒ ์ค์ ํด ์ค ์ ์๋ค.
import {useState} from 'react';
const Counter = () => {
const [value, setValue] = useState(0);
return(
<div>
<p>
ํ์ฌ ์นด์ดํฐ ๊ฐ์ <b>{value}</b>์
๋๋ค.
</p>
<button onClick={()=>setValue(value+1)}>๋ํ๊ธฐ</button>
<button onClick={()=>setValue(value-1)}>๋นผ๊ธฐ</button>
</div>
)
}
export default Counter
โ ref ์์๋ณด๊ธฐ
ReactDOM.render(<App />, document.getElementById('root'));
import React, { Component } from "react";
import ScrollBox from "./ScrollBox";
class App extends Component {
render() {
return (
<div>
<ScrollBox ref={(ref) => (this.scrollBox = ref)} />
<button onClick={() => this.scrollBox.scrollToBottom()}>๋งจ ๋ฐ์ผ๋ก</button>
</div>
);
}
}
export default App;
import { Component } from "react";
class ScrollBox extends Component {
scrollToBottom = () => {
const { scrollHeight, clientHeight } = this.box;
this.box.scrollTop = scrollHeight - clientHeight;
console.log(this.box, scrollHeight, clientHeight, this.box.scrollTop);
};
render() {
const style = {
border: "1px solid black",
height: "300px",
width: "300px",
overflow: "auto",
position: "relative",
};
const innerStyle = {
width: "100%",
height: "650px",
background: "linear-gradient(white, black)",
};
return (
<div
style={style}
ref={(ref) => {this.box = ref}}>
<div style={innerStyle} />
</div>
);
}
}
export default ScrollBox;
ํน์ DOM ์ ์์ ์ ํด์ผ ํ ๋, DOM ์ ์ง์ ์ ์ผ๋ก ๊ฑด๋๋ ค์ผ ํ ๋ ref ๋ฅผ ์ฌ์ฉํ๋ค. ref ๋ ๋ฆฌ์กํธ ๋ด์์ id ์ ๊ฐ์ ์ญํ ์ ํ๋ค. ์ฆ, ์์ return() ๋ด์ ์๋ <div> ์์๋ ์์ผ๋ก this.box ๋ฅผ ํตํด ์ ๊ทผ์ด ๊ฐ๋ฅํด์ง๋ค. ์ด๋ฆ์ this.box ๋ง๊ณ this.bigBox ๋ผ๋ ๊ฐ this.cup ์ด๋ผ๋ ๊ฐ ๋ค๋ฅด๊ฒ ํ ์ ์๋ค.
์ฝ๋ฐฑ ํจ์๋ฅผ ํตํ ref ์ค์
ref ๋ฅผ ๋ง๋๋ ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ๋ฐฉ๋ฒ์ ์ฝ๋ฐฑ ํจ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด๋ค. ref ๋ฅผ ๋ฌ๊ณ ์ ํ๋ ์์์ ref ๋ผ๋ ์ฝ๋ฐฑ ํจ์๋ฅผ props ๋ก ์ ๋ฌํด์ฃผ๋ฉด ๋๋ค. ์ด ์ฝ๋ฐฑ ํจ์๋ ref ๊ฐ์ ํ๋ผ๋ฏธํฐ๋ก ์ ๋ฌ ๋ฐ๋๋ค.
<input ref={(ref) => (this.input=ref)}/>
์ฌ๊ธฐ์ this.input ์ input ์์์ DOM ์ ๊ฐ๋ฆฌํจ๋ค.
โ key ์์๋ณด๊ธฐ
key ๋ ์ปดํฌ๋ํธ ๋ฐฐ์ด์ ๋ ๋๋งํ์ ๋ ์ด๋ค ์์์ ๋ณ๋์ด ์์๋์ง ์์๋ด๋ ค๊ณ ์ฌ์ฉํ๋ค. key ๊ฐ ์์ ๋๋ ๋ฆฌ์คํธ๋ฅผ ์์ฐจ์ ์ผ๋ก ๋น๊ตํ๋ฉด์ ๋ณํ๋ฅผ ๊ฐ์งํ์ง๋ง key ๊ฐ ์์ผ๋ฉด ์ด ๊ฐ์ ์ฌ์ฉํด์ ์ด๋ค ๋ณํ๊ฐ ์ผ์ด๋ฌ๋์ง ๋น ๋ฅด๊ฒ ์์๋ผ ์ ์๋ค.
import React from "react";
const IteraationSample = () => {
const names = [" ๋์ฌ๋", "์ผ์", "๋", "๋ฐ๋"];
const nameList = names.map((name, index) => <li key={index}>{name}</li>);
return <ul>{nameList}</ul>;
};
export default IteraationSample;
map ํจ์์ ์ ๋ฌ๋๋ ์ฝ๋ฐฑ ํจ์ ์ธ์์ธ index ๊ฐ์ ์ฌ์ฉํ๋ฉด ๋๋ค. ๊ณ ์ ํ ๊ฐ์ด ์์ ๋๋ง index ๋ฅผ key ๋ก ์ฌ์ฉํด์ผ ํ๋ค. index ๋ฅผ key ๋ก ์ฌ์ฉํ๋ฉด ๋ฐฐ์ด์ด ๋ณ๊ฒฝ๋ ๋ ํจ์จ์ ์ผ๋ก ๋ฆฌ๋ ๋๋งํ์ง ๋ชปํ๋ค.
โ ๋ฐ์ดํฐ ์ถ๊ฐ/์ญ์ ๊ตฌํํ๊ธฐ
import { useState } from "react";
const IteraationSample = () => {
const [names, setNames] = useState([
{ id: 1, text: "๋์ฌ๋" },
{ id: 2, text: "์ผ์" },
{ id: 3, text: "๋" },
{ id: 4, text: "๋ฐ๋" },
]);
const [inputText, setInputText] = useState("");
const [nextId, setNextId] = useState(5); // ์ถ๊ฐํ ๋ฐ์ดํฐ์ ์ธ๋ฑ์ค๊ฐ 5๋ถํฐ ์์
const onChange = (e) => {
setInputText(e.target.value);
console.log(e.target.value);
};
// ๋ฐ์ดํฐ ์ถ๊ฐํ๊ธฐ : ๋ฐฐ์ด ๋ด์ฅ ํจ์ concat ์ฌ์ฉ
const onClick = () => {
const nextNames = names.concat({
id: nextId, // ๋ค์๋ฒ ์ธ๋ฑ์ค์ ์ถ๊ฐํด์ฃผ๊ธฐ
text: inputText, // ์
๋ ฅํ ๋ด์ฉ์ ์ถ๊ฐํ๋ ๊ฒ์ด๋ text๋ก inputText ์ง์
});
setNextId(nextId + 1); // ๋ค์ ์ธ๋ฑ์ค๋ฅผ ์ํด 1 ์ฌ๋ฆฌ๊ธฐ
console.log(nextId + 1);
setNames(nextNames); // ๋ฆฌ์คํธ์ ์ด๋ฒ์ ์ถ๊ฐํ ๋ด์ฉ ์ถ๊ฐ
console.log(nextNames);
setInputText(""); // inputText ๋น์ฐ๊ธฐ
};
// ๋ฐ์ดํฐ ์ญ์ ํ๊ธฐ : ๋ฐฐ์ด ๋ด์ฅ ํจ์ filter ์ฌ์ฉ
const onRemove = (id) => {
const nextNames = names.filter((name) => name.id !== id);
setNames(nextNames);
};
// ๋ฐ์ดํฐ ๋ณด์ฌ์ฃผ๊ธฐ & ๋๋ธํด๋ฆญ ์ ์ญ์
const namesList = names.map((name) => (
<li key={name.id} onDoubleClick={() => onRemove(name.id)}>
{name.text}
</li>
));
return (
<>
<input value={inputText} onChange={onChange} />
{/* ๋ฒํผ ํด๋ฆญ ์ ์ถ๊ฐ */}
<button onClick={onClick}>์ถ๊ฐ</button>
<ul>{namesList}</ul>
</>
);
};
export default IteraationSample;
์น ์คํ ํ๋ฉด

๋์ [๋ฆฌ์กํธ๋ฅผ ๋ค๋ฃจ๋ ๊ธฐ์ ] ์ ์ฐธ๊ณ ํ์ฌ ์์ฑํ ๊ธ์ ๋๋ค.
'JavaScript > React' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[React] ํจ์ ์ปดํฌ๋ํธ์์ ๋ฆฌ๋ ๋๋ง ์ต์ ํ๋ฅผ ์ํ ๋ฐฉ๋ฒ (0) | 2021.10.27 |
---|---|
[React] Hooks ์ ๋ฆฌ (0) | 2021.10.26 |
[React] ๊ธ์ฐ๊ธฐ ๊ธฐ๋ฅ ๊ตฌํํ๊ธฐ (0) | 2021.10.22 |
[React] Redux ํด๋ ๊ตฌ์กฐ ์ ๋ฆฌํ๊ธฐ (0) | 2021.10.21 |
[React] Redux ๋? (0) | 2021.10.21 |
๋๊ธ