这是App.js

import React, {Component} from 'react';
import {
  BrowserRouter,
  Route,
  Switch,
  Redirect
} from 'react-router-dom';
import Search from './Search';
import Nav from './Nav';
import '../index.css';
import axios from 'axios';
import apiKey from './Config';
import NotFound from './NotFound';
import PhotoList from './PhotoList';


class App extends Component {

  state= {
    pictures: []
  }

  componentDidMount() {
    this.getImages()
  }


  getImages=(query='cats')=> {
    axios.get(`https://www.flickr.com/services/rest/?method=flickr.photos.search&api_key=${apiKey}&tags=${query}&per_page=24&page=1&format=json&nojsoncallback=1`)
      .then(res=> {
        const pictures=res.data.photos.photo
        this.setState({pictures});
      }).catch((error)=> {
        console.log("There was an error parsing your data", error);
      })
  }

  render() {
    console.log(this.state.pictures);
    return (
      <div className="container">
        <Search />
        <Nav getImages={this.getImages}  />
        <Switch>
          <Route exact path="/" render={()=> <Redirect to={'/cats'} />} />
          <Route path='/cats' render={()=> <PhotoList getImages={()=>this.getImages} query='cats' data={this.state.pictures}/>} />
          <Route path='/dogs' render={()=> <PhotoList getImages={()=>this.getImages} query='dogs' data={this.state.pictures} />} />
          <Route path='/computers' render={()=> <PhotoList getImages={()=>this.getImages} query='computers' data={this.state.pictures} />} />
          <Route component={NotFound}/>
        </Switch>
      </div>
    )
  }
}

export default App;


这是PhotoList.js

import React, {Component} from 'react';
import Photo from './Photo';

class PhotoList extends Component {

  handleImages=()=> {
    this.props.getImages(this.props.query);
  }

  componentDidMount() {
    this.handleImages();
  }


  render() {
    const data=this.props.data
    console.log(this.props.query)
    return (
      <div className="photo-container">
        <h2>Results</h2>
        <ul>
          {data.map((photo,index)=>
            <Photo
              farm={photo.farm}
              server={photo.server}
              id={photo.id}
              secret={photo.secret}
              key={index}
            />
          )}
        </ul>
      </div>
    );
  }
}


export default PhotoList;


我已经将getImages函数传递到PhotoList中,该函数可获取数据并更改主应用程序的状态。该函数采用查询字符串(猫,狗或计算机)。然后状态数据作为props向下传递并映射到PhotoList组件中。

即使输入其他路径(例如/ dogs,/ computers),我的网站仍只显示cats,但是当我用控制台登录查询字符串时,很明显我在其中输入了不同的值。那么,为什么我仍然要让猫出现?我知道默认情况下查询等于猫,但是当我在PhotoList中调用函数时,应使用查询道具将其设置为其他值。

我究竟做错了什么?

最佳答案

在您的代码中,this.handleImages仅被调用一次,因为componentDidMount仅在组件首次由prop初始化时才被调用。

要获取各种类型的图像,需要在更改道具时调用。

然后,您可以使用componentDidUpdate函数执行此操作。

   componentDidMount() {
     this.handleImages();
   }

   componentDidUpdate(prevProps) {
     if (prevProps.query !== this.props.query) {
       this.handleImages();
     }
   }

09-25 19:01