Я работаю с Google search search API. Когда я получаю некоторые данные из API поиска Google Place, он возвращает только 20 записей и дает маркер следующей страницы для получения дополнительных результатов, затем я беру Place_id
для каждого места, а затем снова извлекаю все детали этого места, поэтому я выбираю данные дважды я создал два компонента, один из которых отвечает за выборку мест, и это мой родительский компонент, а другой отвечает за выборку сведений о месте с использованием place_id
, а это мой дочерний компонент. Вот мой код ниже
1. Extractor.js ( родительский компонент )
import React, { Component } from 'react';
import Search from './Components/Search';
import Display from './Components/Display';
import Header from './Components/Header';
import Instructions from './Components/Instructions';
const URI = 'https://maps.googleapis.com/maps/api/place/textsearch/json?query=';
const placeURI = 'https://maps.googleapis.com/maps/api/place/details/json?placeid=';
const API = '&key=xxxxxxxxxxxxxxxxxxxxxxxxx';
class Extractor extends Component {
getData = (keyword, location, country) => {
let dataURI = `${URI}${keyword}+${location}+${country}${API}`;
let proxyUrl = 'https://cors-anywhere.herokuapp.com/',
targetUrl = dataURI
fetch(proxyUrl + targetUrl)
.then((res) => res.json())
.then((data) => {
let jsonData = JSON.parse(JSON.stringify(data));
let nextPageToken = jsonData.next_page_token;
this.setState({nextPage: nextPageToken, googleData: jsonData, dataURI });
//console.log(dataURI");
})
.catch((e)=> console.log(`Error! ${e.message}`));
}
isEmpty = (obj) => {
for(var key in obj) {
if(obj.hasOwnProperty(key))
return false;
}
return true;
}
viewMore = () => {
let dataURI = `${this.state.dataURI}&pagetoken=${this.state.nextPage}`;
let proxyUrl = 'https://cors-anywhere.herokuapp.com/',
targetUrl = dataURI
fetch(proxyUrl + targetUrl)
.then((res) => res.json())
.then((data) => {
let jsonData = JSON.parse(JSON.stringify(data));
let nextPageToken = jsonData.next_page_token;
this.setState({nextPage: nextPageToken, googleData: jsonData, dataURI });
//console.log(dataURI");
})
.catch((e)=> console.log(`Error! ${e.message}`));
}
constructor(props){
super(props);
this.state = {
googleData: [],
nextPage: '',
dataURI: ''
}
}
render() {
let displayData;
if(this.state.googleData.status === 'OK'){
displayData = <Display googleData={this.state.googleData} nextPageToken = {this.state.nextPage} api={API} placeURI = {placeURI} viewMore = {this.viewMore} />
}
else{
displayData = <Instructions />
}
//console.log(this.state.dataURI);
return (
<div>
<Header />
<section>
<Search getData={this.getData} />
{displayData}
</section>
</div>
);
}
}
export default Extractor;
2. Display.js ( дочерний компонент )
import React, { Component } from 'react';
import {
Table,
ProgressBar,
Button
}
from 'react-bootstrap';
class Display extends Component {
constructor(props) {
super(props);
this.state={
rows: []
}
}
componentDidMount(){
var records = this.props.googleData;
const API = this.props.api;
const placeURI = this.props.placeURI;
for (let p_id of records.results) {
let dataURI = `${placeURI}${p_id.place_id}${API}`;
let proxyUrl = 'https://cors-anywhere.herokuapp.com/',
targetUrl = dataURI
fetch(proxyUrl + targetUrl)
.then((res) => res.json())
.then((data) => {
let jsonData = JSON.parse(JSON.stringify(data));
//console.log(dataURI);
this.setState(prevState => ({rows: [...prevState.rows, jsonData.result]}));
})
.catch((e) => console.log(`Error! ${e.message}`));
}
}
viewMoreCall = () => {
this.props.viewMore();
}
render() {
//console.log(this.state.rows);
return (
<div>
<ProgressBar now={45} />
<Table striped bordered condensed hover responsive>
<thead>
<tr>
<th>#</th>
<th>Name</th>
<th>Full Address</th>
<th className="pno">Phone</th>
<th className="pno">International P.no</th>
<th>Website</th>
<th>Rating</th>
</tr>
</thead>
<tbody>
{this.state.rows.map(( listValue, index ) => {
return (
<tr key={index}>
<td>{listValue.index}</td>
<td>{listValue.name}</td>
<td>{listValue.formatted_address}</td>
<td>{listValue.formatted_phone_number}</td>
<td>{listValue.international_phone_number}</td>
<td><a href={listValue.website}>{listValue.website}</a></td>
<td>{listValue.rating}</td>
</tr>
);
})}
</tbody>
</Table>
<Button onClick={this.viewMoreCall} type="button">View More...</Button>
</div>
);
}
}
export default Display;
когда я нажимаю кнопку «Просмотреть больше», созданную в дочернем компоненте, я изменяю состояние родительского компонента, но при этом больше не возвращаются записи.
Чего я хочу добиться, так это добавить больше данных в мою существующую таблицу, когда пользователь нажмет кнопку просмотра дополнительной информации.