反应-在window.history.popstate上更改组件状态

Mir*_*318 3 html5-history reactjs

我有一个React组件,当状态更改时,它会将歌曲ID推送到url。我的问题是,当用户在浏览器上单击“后退”时,我需要更改SongApp组件的状态。我该怎么做呢?

class SongApp extends React.Component {
  constructor(props) {
    super(props);

    this.state = {
      song: props.songId
    }

    this.setSong = this.setSong.bind(this);
  }

  setSong(e) {
    var songId = e.target.id;
    this.setState({song: songId})
    window.history.pushState({song: songId}, '', '?s='+songId)
  }

  render() {
    var id = this.state.song;

    var content = id ? <SongDisplay lyrics={ this.props.songData[id].lyrics } /> : <SongIndex songData={this.props.songData} setSong={this.setSong}/>
    return(
      <div className="song-app">
        {content}
      </div>
    )
  }
}

window.addEventListener('popstate', function(event) {
  console.log('popstate fired!');
  debugger;
  if(event.state.song) {
    // change SongApp state
  }
});
Run Code Online (Sandbox Code Playgroud)

Mir*_*318 5

我发现您可以将组件的方法附加到侦听器:

  componentDidMount() {
    window.addEventListener("popstate", this.setSongFromHistory);
  }

  setSongFromHistory(e) {
    if(e.state.song){
      e.preventDefault(); // stop request to server for new html
      e.stopPropagation();
      this.setState({song: e.state.song});
      $('html,body').scrollTop(0);
    }
  }
Run Code Online (Sandbox Code Playgroud)

  • 显示的代码给了我一个错误,因为“this”设置不正确。解决方案是执行 `window.addEventListener("popstate",(e) =&gt; this.setSongFromHistory(e))` (2认同)