January 17, 2021
const Detail = () => {
return <h1>Detail</h1>
}
App.js ์ ์๋์ ๊ฐ์ ๊ฒฝ๋ก๋ก ์ฐ๊ฒฐํ์ ์ Detail ์ปดํฌ๋ํธ๋ก ์ ๊ทผ์ด ๊ฐ๋ฅํ๊ฒ props ๋ฅผ ๋ด๋ฆฐ ๊ฒ์ ํ์ธํ ์ ์๋ค.
<Router>
<Route path="/" exact component={Home}></Route>
<Route path="/:id" exact component={Detail}></Route>
</Router>
import { Link } from "react-router-dom";
..... ์ดํ ์ค๋ต .....
return (
<li>
<Link to={`/${props.id}`}>
{props.text} <button onClick={props.onBtnClick}>DEL</button>
</Link>
</li>
)
๊ธฐ์กด์ li ํ๊ทธ ๋ด ์ปจํ ์ธ ๋ฅผ Link ๋ก ๋ฌถ๊ณ to ์์ฑ์ props.id ๋ก ๊ฒฝ๋ก๋ฅผ ์ด๋ํ๋ฉด ํด๋น id ์ Detail ์ ์ ๊ทผํ ์ ์๋๋ก ํด ์ค๋ค.
import { useParams } from 'react-router-dom'
const Detail = () => {
// useParams hooks ๋ฅผ ์ฌ์ฉํ์ ๋ id ๋ฅผ ๊ฐ์ ธ์ค๋ ๋ฒ
const id = useParams()
console.log(id) // {id: "1610867080250"}
return <h1>Detail</h1>
}
useParams hooks ๋ฅผ ์ฌ์ฉํด์ ํด๋น ํ๋ผ๋ฏธํฐ๋ก ์ ๊ทผํ Detail ์ id ๋ฅผ ๊ฐ์ ธ์ฌ ์ ์๋ค.
ํ์ง๋ง Redux ๋ก๋ ์ด๋ป๊ฒ ๊ฐ์ ธ์ฌ ์ ์์๊น?
ownProps ๋ง์ผ๋ก๋ id ๋ฅผ ๊ฐ์ ธ์ฌ ์ ์๋ค.
const mapStateToProps = (state, ownProps) => {
console.log(ownProps)
}
export default connect(mapStateToProps, null)(Detail)
ownProps ๊ฐ ์ฐํ๋๋ฐ ์ด์ ๊ฑฐ๊ธฐ์์ match.params.id ๊ฐ ํ์ํ๋ค.
const mapStateToProps = (state, ownProps) => {
console.log(ownProps)
const {
match: {
params: { id },
},
} = ownProps
}
์ด๋ ๊ฒ ํ๋ฉด ownProps.match.params.id ๋ก ์ ์ ํ์ ์์ด ๋ฐ๋ก id ๋ก ์ ๊ทผํ ์๊ฐ ์๊ฒ ๋๋ค.
๊ทธ๋ฆฌ๊ณ ๋ฆฌํด์ ํด์ฃผ๋ฉด์ ํด๋น ๊ฐ์ฒด ๋ด์ state ๋ฅผ ๋ถ๋ฌ์์ find ํจ์๋ฅผ ํตํด ๋ฐฐ์ด ๋ด toDo ์ id ์,
ownProps.match.params.id ๊ฐ ๊ฐ์ ์์ ํ๋๋ฅผ ๋ฆฌํดํ๊ฒ ํ๋ค.
const mapStateToProps = (state, ownProps) => {
console.log(ownProps)
const {
match: {
params: { id },
},
} = ownProps
return { toDo: state.find(toDo => toDo.id === parseInt(id)) }
}
Detail ์ปดํฌ๋ํธ์์ props ๋ก ๋ฐ์ ์ฝ์ ๋ก๊ทธ๋ฅผ ํ์ธํด ๋ณด๋ฉด,
์์ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ ๋ชจ์ต์ ํ์ธํ ์๊ฐ ์๋ค.
const Detail = props => {
console.log(props)
return (
<>
<h1>{props.toDo?.text}</h1>
<h5>Created at : {props.toDo?.id}</h5>
{/* ์ ๋ฌผ์ํ๋ฅผ ๋ถ์ฌ์ผ ์๋ฌ๋ฅผ ํผํ๋์ง๋ ์์ง ์ ๋ชจ๋ฅด๊ฒ ๋ค. */}
</>
)
}