【问题标题】:react-sound - Force React Component to update and go to position?react-sound - 强制 React 组件更新并定位?
【发布时间】:2017-10-10 13:51:35
【问题描述】:

我正在尝试使用react-sound. 构建一个音频播放器我想实现一个功能,它可以简单地回到音频中的某个位置。

我现在只是这样做:

goToVeryCustomPosition() {
  this.setState({playFromPosition: this.state.myVeryCustomPosition});
}

我的问题是:这行得通 - 但它只能工作一次。声音会回到指定的位置,但如果我想连续两次这样做,它就行不通了。

我猜这是因为我的组件没有更新,因为位置仍然相同。当我首先设置它时,它从位置 0(在构造函数中)变为位置 233(或任何可能的位置)。当我再次调用这个东西时,它仍然是 233,因为这是我想要做的。但由于这与之前的状态相同,React 不会更新。我该如何解决这个问题?

编辑:组件的其余部分。

构造函数:

constructor(props) {
    super(props);

    this.state = {
       playStatus: Sound.status.STOPPED,
       elapsed: 0,
       total: 0,
       playFromPosition: 0,
       myVeryCustomPosition: 1337.727
     }
  }

渲染和处理歌曲播放:

handleSongPlaying(audio){
     this.setState({
                      position: audio.position,
                      elapsed: audio.position,
                      total: audio.duration})
   }

  render() {
    return (
      <div className="row handle">
        <Sound
            url="./sound.mp3"
            playStatus={this.state.playStatus}
            onPlaying={this.handleSongPlaying.bind(this)}
            playFromPosition={this.state.playFromPosition}
            />

        <button onClick={this.togglePlay.bind(this)}>Play / Pause</button>
        <button onClick={this.repeat.bind(this)}>Replay</button>
      </div>
    );
  }
}

【问题讨论】:

  • 请显示您的组件的其余部分,尤其是您设置this.state.myVeryCustomPosition的部分
  • 为什么这很重要?我编辑了所有内容。

标签: javascript reactjs audio react-native components


【解决方案1】:

您可以使用forceUpdate

goToVeryCustomPosition() {
    if(this.state.playFromPosition != this.state.myVeryCustomPosition) {
        this.setState({playFromPosition: this.state.myVeryCustomPosition});
    } else {
        this.forceUpdate()
    }
}

您还可以做一个单独的state 变量,例如isUpdating。您将this.state.myVeryCustomPosition 设置为isUpdatingtrue 并在goToVeryCustomPosition 中将其设置为false

这样它会一直更新,你不必使用forceUpdate,这有点令人不悦。

【讨论】:

  • 谢谢。 forceUpdate 似乎不起作用,但它没有任何区别。可能需要以某种方式更新&lt;Sound&gt; 组件?现在,通过您的解决方案,我更新了包含 &lt;Sound&gt; 组件的高阶组件。我不确定它可能是什么。
  • 您可以尝试这样做。创建一个单独的state 变量,如isUpdating,并将其作为prop 传递给Sound 组件,并在Sound 组件中检查isUpdating 属性是否在componentWillReceiveProps 生命周期方法中发生了变化,以及当它使用forceUpdate触发重新渲染时。
  • 如何进入声音组件?这是一个 npm 模块,不知道如何修改,也不知道是否应该修改?
  • 啊,好吧,它是一个外部插件。 forceUpdate 无论如何都应该重新渲染子组件。您能否在第二次尝试时将 state 更改为 1337.7270 或其他内容?这是一种 hacky 方法,但可能会触发更改。
猜你喜欢
  • 1970-01-01
  • 2018-12-23
  • 2016-06-17
  • 2021-02-15
  • 2020-01-12
  • 2021-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多