localhost:3000/product/45
localhost:3000/product/125
-> <Route exact path='/product/:id' component={productDetail} />
: : Path Parameter가 붙는것을 의미
id: 해당 Path Parameter의 이름을 의미(변수명)
1.
- 리스트 페이지의 개별상품을 클릭하면 onClick 이벤트시 발생하는 push 함수(this.props.history.push)를 통해
/product/1
로 이동- url이
/product/1
로 변하면, route 컴포넌트에 정의되어 있는path='/product/:id
에 따라 productDetail 컴포넌트가 마운트됨
url("http://localhost:3000/product/1")
- productDetail 컴포넌트에서는 백엔드에 id가
1
인 아이템에 대한 정보를 요청componentDidMount() { const id = this.props.match.params.id fetch(`http://123.456.33:8000/products/${id}`) .then(res => res.json()) .then(res => this.setState({ data: res })) }
- 서버에서 가져온 데이터(res)를
setState
함수를 통해 state 객체에 저장하고,
state객체에 담긴 데이터로 컴포넌트 UI를 render 해준다(UI를 그려준다)
//Routes.js
<Route exact path='/product/detail/:id' component={ProductDetail} />
//ProductDetail.js
render(){
console.log(this.props)
//{ history: {}, location: {}, match: {}, ...}
return(
...
);
}
import { withRouter } from 'react-router-dom';
class Payment extends React.Component {
render() {
console.log(this.props); // { history: {}, location:{}, match:{}, ... }
return(
...
)
}
}
export default withRouter(Payment);
// ProductDetail.js
// current url -> localhost:3000/product/1
class ProductDetail extends React.Component {
...
render() {
console.log(this.props.match.params.id) // 1
return (
...
);
}
}
따라서 componentDidMount
메서드에서 해당 id값을 통해 서버에 요청을 보내는 것을 통해 원하는 정보를 받아올 수 있다
componentDidMount(){
fetch(`${API}/${this.props.match.params.id}`)
.then(res => res.json())
.then(res => ...);
}
예제
<Link to={`/monsters/${this.props.id}`}>
<div>
<img
src={`http://rovoo.org/${this.props.id}?set=sdf`}
alt=""
/>
<Card id={this.state.data.id}
name={this.state.data.name}/>
<h2>{this.props.name}</h2>
<p>{this.props.email}</p>
</div>
</Link>
this.props.history.push(`/monster/detail/${id}`)
config.js
//반복되는 url을 따로 구조분해할당 해서 import 하기(ex)메뉴바)
export const API = 'http://10.58.43:8000';
import { API } from '../../config';
componentDidMount(){
fetch(`${API}/products/2`)
.then(res => res.json())
.then(({ result: data }) => {
if (data) {
this.setState({ data });
}else{
console.log('not found');
}
});
}
1) onClick
2) 페이지 이동
this.props.history.push(`/monsters/detail/${id}`)
3)경로찾기
path= "/monster/detail/:id"
4)id값 받아서 fetch
fetch(`${API}/${this.props.match.params.id}`)