React Router обменивается данными между компонентами - PullRequest
0 голосов
/ 15 декабря 2018

В моем приложении для реагирования настроен динамический маршрут, когда пользователь щелкает изображение, по которому он переходит на новый маршрут, с помощью URL /details/:id.

<div className='App'>
      <Switch>
        <Route path='/' exact component={Home} />
        <Route exact path='/details/:id' component={ItemDetails} />
      </Switch>
 </div>

, полученного из моего функционального компонента.

`const headerImages = (props) => {
  const imageResults = props.trending.slice(0, 5).map(r => ( // Grab firt 5 array objects
    <Link key={r.id} to={`/details/${r.id}`}>
      <div key={r.id}>
        <img key={r.id} src={`https://image.tmdb.org/t/p/w1280${r.backdrop_path}`} alt={r.title} className='header-image' />
        <h1 className='now-playing'>Latest</h1>
        <h1 className='header-title'>{r.title}</h1>
        <h4 className='header-details'>{r.overview}</h4>
      </div>
    </Link>
  ))
  return <div className='header-images'>
    <Carousel infinite autoPlay={4500}>{imageResults}</Carousel>
  </div>
}

export default headerImages

`itemdetails - это компонент на основе классов, который имеет вызов API. Как получить значение r.id из моего функционального компонента в мой вызов Api?

class ItemDetails extends Component {
  constructor (props) {
    super(props)
    this.state = { selectedItem: null }
  }

  fetchItemDetails = () => {
    axios.get('https://api.themoviedb.org/3/movie/${this.props.r.id}?api_key=40d60badd3d50dea05d2a0e053cc96c3&language=en-US')
    .then((res) => {
      console.log(res.data.results)
    })
  }

  componentDidMount(){
    this.fetchItemDetails()
  }

  render () {
    return <h1>test</h1>
  }
}

в настоящее времяВызов API возвращает неопределенное значение, но, как вы видите, я пытаюсь передать динамический идентификатор в вызов

обновленное решение

`class ItemDetails extends Component {
  constructor (props) {
    super(props)
    this.fetchItemDetails = this.fetchItemDetails.bind(this)
  }


  fetchItemDetails = (itemId = this.props.match.params.id) => {
    axios.get('https://api.themoviedb.org/3/movie/${itemId}?api_key=40d60badd3d50dea05d2a0e053cc96c3&language=en-US')
    .then((res) => {
      console.log(res.data.results)
    })
  }

  componentDidMount(){
    this.fetchItemDetails()
  }

  render () {
    return <h1>test</h1>
  }
}

export default ItemDetails`

Ответы [ 3 ]

0 голосов
/ 15 декабря 2018

Это потому, что вы не привязали это к функции, пытающейся получить доступ к реквизитам.

Добавьте в конструктор:

this.fetchItemDetails = this.fetchItemDetails.bind(this);

, а URL должен вместо этого использовать шаблонный литерал `цитаты '

`https://api.themoviedb.org/3/movie/${itemId}?api_key=40d60badd3d50dea05d2a0e053cc96c3&language=en-US`
0 голосов
/ 15 декабря 2018

Попробуйте это:

import React, { Component } from 'react';
import axios from 'axios';

export default class ItemDtails extends Component {
  fetchItemDetails = () => {
    const itemId = this.props.match.params.id;
    const ROOT_URL = 'https://api.themoviedb.org/3/movie';
    const API_KEY = 'api_key=40d60badd3d50dea05d2a0e053cc96c3&language=en-US';

    axios.get(`${ROOT_URL}/${itemId}?${API_KEY}`).then(res => {
      console.log(res.data.results);
    });
  };

  componentDidMount() {
    this.fetchItemDetails()
  }

  render() {
    return <div>Test...</div>;
  }
}
0 голосов
/ 15 декабря 2018

Вы можете использовать: const id = this.props.match.params.id

Чтобы получить идентификатор и получить данные из этого конкретного идентификатора.

...