【问题标题】:How do I tell tell a child element in React to seek its video element?我如何告诉 React 中的子元素去寻找它的视频元素?
【发布时间】:2019-02-28 22:53:08
【问题描述】:

我有一个简单的 React 应用,它带有视频播放器和显示视频数据的图表。两者都在自己的顶层组件中:

class App extends Component {
  ...
  render() {
    return (
      <div className="App">
        <VideoDisplay .../>
        <MetricsDisplay .../>
      </div>
    )
  }
}

VideoDisplay.js 内部是一个我想要控制的&lt;video&gt; 元素,特别是通过寻找它的播放位置,我可以使用videoElement.currentTime=seekToTime 来做到这一点。我想通过MetricsDisplay 元素来控制它:如果我点击图表,我希望视频搜索到点击的时间。但要做到这一点,当它收到来自MetricsDisplay.js 的点击时,似乎我必须从App.js 调用VideoDisplay.js 中的一个函数。但这是必要的,而不是声明性的,而且确实我在 React 中实现它时遇到了麻烦。甚至可能吗?我怎么能告诉一个元素中的视频,由同级元素的点击触发?

我有一个解决方法,我将发布作为答案,但我非常确信从设计的角度来看它不是最佳的,并且会导致代码维护问题。那么有什么更好的方法呢?做这种事情的“反应”方式是什么?

见附件截图:点击右图时,视频应该会搜索到点击的时间点。

【问题讨论】:

    标签: reactjs imperative-programming declarative-programming


    【解决方案1】:

    所以为了解决这个问题,我可以在道具中传递一个搜索时间,并防止它重复搜索,我可以增加一个 seekId 计数器。这似乎非常倒退,既是因为我正在使用旨在避免它的声明性逻辑重新创建命令式逻辑,而且因为我表明视频元素具有我希望视频寻找的位置的持久“属性”到现在和执行此操作的命令的 id。

    也就是说,我用App.js中的这个函数来响应来自MetricsDisplay元素的点击:

    class App extends Component {
      ...
      setPlayheadTime(time) {
        this.setState((state, props) => ({seekTo: time, seekId: state.seekId + 1}));
      }
      ...
    }
    

    我将seekToseekId 都传递给VideoDisplay 并在MetricsDisplay.js 的生命周期函数中处理它:

    class VideoDisplay extends Component {
      ...
      componentWillUpdate() {
        if (this.props.seekTo && this.props.seekId !== this.seekId) { this.seekTo(this.props.seekTo); }
      }
    
      seekTo(time) {
        console.log(`(${this.props.seekId}) Seek to ${time}`);
        this.seekId = this.props.seekId;
        document.getElementById("the-video").currentTime = time;
      }
      ...
    }
    

    这可行,但我必须相信这不是完成“普通”javascript 中简单回调函数的最佳方式。有什么建议么?我错过了什么?

    【讨论】:

    • Ehi Andrew,您找到更好的解决方案了吗?这个命令式 声明式网关也让我有些头疼!
    • @gabry 我还没有回过头来,但我开始认为refs 是处理此类事情的正确方法,坦率地说,它不适合自上而下的声明性框架。
    猜你喜欢
    • 2011-03-09
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    • 2021-05-16
    • 2021-02-17
    • 2018-08-10
    • 1970-01-01
    相关资源
    最近更新 更多