- path = 경로
- react route dom 공식문서를 살펴보면 path는 경로이기 때문에 depth 형태로 나타낼 때 사용된다고 한다
"users/:id"
path의 id의 값이 어떻게 들어왔는지 알기 위해 → this.props.match.params.id
로 접근하게 된다id
라고 안하고 hello
처럼 다른 문자열로 적어도 되는데"users/:hello"
→ this.props.match.params.hello
로 접근하게 된다fetch() 함수를 통해 서버에 요청한 API주소를 → 브라우저를 통해 확인할 수 있는데
monster
path로 이동하면 → 상품리스트가 보이고monster/detail/
path로 이동하면 → 해당하는 monster/detail/1
, monster/detail/2
이런식으로 id값까지 지정하면 → 해당하는 id값에 맞는 users 정보에 대한 상세페이지가 보인다그래서 monster/detail/
이라고면 경로를 입력하면 첫 번째 상품을 보여줄지, 두 번째 상품을 보여줄 지 모르는 상태이기 때문에
화면에 데이터가 제대로 구현되지 않는 것을 볼 수 있다
이러한 점을 해결하기 위해, url에 대해 id를 지정해줄 수 있다
이렇게 받은 props 안에 있는 id에 접근하기 위해서는
this.props.match.id
로 하면 되는데
일단 console.log로 출력해서 어떤 데이터가 어떠한 방식으로 들어오는지 확인해야 한다
json placeholder
요청주소를 주소창에 입력해서 불러올 수 있다
일단 id=1인 데이터만 잘 가져오는지 확인하기 위해서
componentDidMount() {
fetch(`http://jsonplaceholder.typicode.com/users/1`)
.then(res => res.json())
.then(res => this.setState({data:res});
}
render() {
const { data } = this.state;
console.log(data);
(..코드생략..)
<MonsterDetail>
컴포넌트에서 render될 때
console.log(this.props)
로 props를 확인하면
이렇게 history
, location
, match
3개에 대한 key 및 그에 대한 객체를 받아왔다
여기 f로 되어있는거는 해당 객체에서 사용가능한 메서드라고 생각하자
id=1인 데이터에 대한 요청을 한건데
fetch()함수를 통해 서버로 요청하는 API주소의 id랑
브라우저에서 보이는 주소창의 id랑 다르니까 헷갈리지 않도록 주의해야 한다
따라서 브라우저 주소창의 id 값을 → fetch() 내부로 받아와야 한다
https://jsonplaceholder/typiclode.com/users/1
localhost:3000/monster/detail/1
/monsters
: 몬스터 목록 보여주는 페이지에서 각각의 카드를 클릭햇을 때 각각의 정보를 확인하고 싶고, 그 카드는 각각 고유의 id를 가지고 있다
각각의 카드가 id가 1,2,3,4,5인지 다 알 수 있지만
해당 카드의 경로가 들어가서는 id값을 알 수 없기 때문에
페이지를 넘어가면서도 정보가 남아야하기 때문에 해당하는 객체에 id: 1
이라는 property를 추가해준다
따라서 브라우저 주소창의 id를 변수처럼 서버에 보내는 URL에 활용하려면 아래처럼 적을 수 있다
componentDidMount() {
fetch(`https://jsonplaceholder.typicode.com/users/${this.props.match,params.id}`)
상품리스트에서 해당 상품을 클릭했을 때 상세페이지로 이동해야 하기 때문에
<div className="card-list">
{monsters.map(monster => {
return (
// Link태그는 react-route-dom으로부터 받는다
<Link
key={monster.id}
to={`/monsters/detail/${monster.id}`}>
<Card
id={monster.id}
name={monster.name}
email={monster.email}
/>
</Link>
);
만약 상품리스트에서 Link태그를 연결하는 것이 아니라 상품상세리스트에 해당하는 Card 컴포넌트 내부에서 withRoute를 없애고 Link태그를 연결하면 아래와 같은 에러가 발생한다
TypeError : Cannot read property 'pash' of undefined
어디서 undefined 되었나 확인하기 위해 Card 컴포넌트의 render되는 곳에 console.log(this.props)
로 확인하면
Card 컴포넌트는 Route.js에 직결되어있지 않기 때문에 history
, location
, match
에 대한 객체가 없다
이렇게 Route.js에 직결되지 않은 Card 컴포넌트에서도
history
, location
, match
같은 라우터기능을 사용하고 싶으면
withRouter를 Card 컴포넌트에서 사용하면 된다
withRoute 에 대해서 더 알아봐야겠다..!
<Route exact path="monster/detail/:id" component={MonterDetail}>
componentDidMount() {
fetch( `https://jsonplaceholder.typicode.com/users/${this.props.match.params.id}`)
.then(res => res.json())
.then(res => this.setState({ data: res });
}