当我想在一个视频中播放一个新的HTML5元素时,点击按钮来更新它.

我有一个Clip组件,它返回一个HTML5视频元素,通过props 提供源URL.

function Clip(props) {
  return (
    <video width="320" height="240" controls autoPlay>
      <source src={props.url} />
    </video>
  )
}

我还有一个电影组件,它包含多个URL,每个URL对应于电影的一部分.它还包含一个position属性,通过记住当前正在播放的部分,该属性的作用类似于迭代器.

class Movie extends Component {
  constructor() {
    super();
    this.state = {
      sections: [
        'https://my-bucket.s3.amazonaws.com/vid1.mp4',
        'https://my-bucket.s3.amazonaws.com/vid2.mp4'
      ],
      position: 0
    };
  }
  render() {
    const sections = this.state.sections
    const position = this.state.position

    return (
      <div>
        {position}
        <Clip url={sections[position]} />
        <button onClick={() => this.updatePosition()}>Next</button>
      </div>
    )
  }
  updatePosition() {
    const position = this.state.position + 1;
    this.setState({ position: position });
  }
}

电影组件渲染剪辑组件和"下一步"按钮.单击Next按钮时,我想更新position属性,并使用sections中的Next URL重新呈现HTML5视频元素.

现在,当我点击Next时,HTML5视频源标签会更新,但元素会继续播放上一个URL中的视频.有人能帮我弄清楚如何重置视频元素吗?

Update:我创建了一个JSFIDLE,你可以看到here.

Update 2:更新视频元素的src属性有效!

推荐答案

Quick and dirty awnser:keyprops 添加到<Clip><video>,例如:

function Clip({ url }) {
  return (
    <video key={url}>
      <source src={url} />
    </video>
  );
}

Recommended awnser:每当有新URL时,触发视频元素的load事件,例如:

function Clip({ url }) {
  const videoRef = useRef();

  useEffect(() => {    
    videoRef.current?.load();
  }, [url]);

  return (
    <video ref={videoRef}>
      <source src={url} />
    </video>
  );
}

Explanation:视频最初不会改变,因为本质上你只是在修改<source>元素,React理解<video>应该保持不变,所以它不会在DOM上更新它,也不会为该源触发新的load事件.<video>应触发新的load事件.

肮脏的答案是有效的,因为当你改变React元素的key时,React理解这是一个全新的元素.然后,它在DOM中创建一个新元素,它自然会在装载时触发自己的加载事件.

Reactjs相关问答推荐

在带有和设计的表格中禁用和取消选中复选框

Next.js-图像组件加载问题

CreateBrowserRouter将props 传递给父组件以验证权限

Redux Provider Stuck甚至彻底遵循了文档

在继承值更改时重置react 挂钩窗体字段值

REACTION-Easy-SORT返回.map错误

React useEffect 问题...异步函数内的变量正在获取延迟的更新值

Chart.js如何go 除边框

是否可以直接在 jsx 标签上使用 CSS 定义的 colored颜色 ?

当`useSelector`回调中的属性值更新时,将会使用更新后的值吗?

React Js和Firestore中如何将当前ID与集合中的ID查询以仅显示具有相似字段和值的文档-第二部分

条件渲染元素的测试不起作用

顶点图表甜甜圈项目边框半径

如何在 React Native 中更新跨屏幕呈现的上下文状态变量?

map 未显示在react 传单中

如何通过 Material ui select 使下拉菜单下拉

在 redux 工具包中使用 dispatch 发送多个操作

使用 useRef(uuid()) 的目的是什么?

从输入中获取数字时,react 计数器不会增加

如何通过 Material Ui 设计将 Accordion 添加到您的 React 项目中?