React:仅在第二个onClick按钮上呈现新值的组件

时间:2016-09-04 22:19:26

标签: javascript reactjs components rendering

我制作了一个反应应用,我有一个包含子组件SearchInput的父组件ResultInput有一个下拉菜单,当点击一个按钮时,它会通过回调函数将值genreValue传递给Search。搜索然后进行api调用,这很好。

我的问题是需要点击两次按钮才能呈现新的API数据。看看其他SO问题,我怀疑我需要将genreValue作为参数传递给cb函数,或者我的onClick只是初始化,而不是在第一次点击时调用它。

这是一个非常简单的应用程序,所以我不认为需要Flux等。我的控制台日志似乎显示了SearchInput组件中正在更改的值。 那么我做错了什么?

Search.js

let Search = React.createClass ({
  getInitialState(){
    return {
      movies: ['Men In Black'],
      genreValue: '12'
    };
  },

  componentDidMount(){
    this.getMovies()
  },

  getMovies(){
    let genre = this.state.genreValue;
    let url = `http://api.themoviedb.org/3/discover/movie?${key}&with_genres=${genre}`;
    Request.get(url).then((response) => {
      console.log('response.body.results', response.body.results)
      this.setState({
        movies: response.body.results.map(function(movie){
          return movie.title
        })
      });
    });
  },

  handleGenre(newGenre) {
    this.setState({ genreValue: newGenre })
    return this.getMovies();
  },

  render(){
      console.log(this.state.movies)
      console.log('genreValue state', this.state.genreValue)
      return (
        <div>
          <Input genre={this.state.genreValue} onGenreChanged={this.handleGenre}/>
          <ul>
            {this.state.movies.map( function(movie){
              return <Results key={movie.id} data={movie}/>;
            })}
          </ul>
        </div>
      );
  }

});

export default Search;

Input.js

let Input = React.createClass ({

  selectHandler(){
    return this.props.onGenreChanged(this.refs.genre.value);
  },

  render() {
    console.log('genreValue prop', this.props.genre);
    console.log('refs', this.refs.genre)
      return <div>
      <select ref="genre">
        <option value="28">Action</option>
        <option value="12">Adventure</option>
        <option value="16">Animation</option>
        <option value="35">Comedy</option>
        <option value="80">Crime</option>
        <option value="99">Documentary</option>
        <option value="18">Drama</option>
        <option value="10751">Family</option>
        <option value="14">Fantasy</option>
        <option value="10769">Non-english</option>
        <option value="36">History</option>
      </select>

      <button onClick={this.selectHandler} value="Go">Go</button>
      </div>
    }
});

export default Input;

1 个答案:

答案 0 :(得分:0)

handleGenre函数中,调用this.getMovies时状态可能尚未更新。您可以将其更改为以下内容:

handleGenre(newGenre) { this.setState({ genreValue: newGenre }, function() { return this.getMovies(); }); },

或者,如果this.getMovies发生了更改,可能更好的做法是在componentDidUpdate生命周期功能中调用genreValue

componentDidUpdate: function(prevProps, prevState) { if (prevState.genreValue !== this.state.genreValue) { this.getMovies(); } }