gpt4 book ai didi

javascript - 使用 React 更新 HTML5 视频的源 URL

转载 作者:技术小花猫 更新时间:2023-10-29 12:05:32 25 4
gpt4 key购买 nike

我想更新 HTML5 视频元素中的源标记,这样当我单击一个按钮时,正在播放的任何内容都会切换到新视频。

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

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

我还有一个 Movie 组件,它包含多个 URL,每个 URL 对应于电影的一段。它还包含一个位置属性,它通过记住当前正在播放的部分来充当迭代器。

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 });
}
}

Movie 组件呈现一个 Clip 组件和一个“Next”按钮。单击“下一步”按钮时,我想更新位置属性并使用部分中的下一个 URL 重新呈现 HTML5 视频元素。

截至目前,当我点击 Next 时,HTML5 视频源标签会更新,但该元素会继续播放来自先前 URL 的视频。谁能帮我弄清楚如何重置视频元素?

更新:我创建了一个 JSFiddle,你可以看到 here .

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

最佳答案

快速而肮脏的 awnser: 添加 key支持 <Clip><video> ,例如:

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

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

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

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

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

说明:视频最初并没有改变,因为本质上你只是在修改 <source> element 和 React 理解 <video>应该保持不变,所以它不会在 DOM 上更新它,也不会触发新的 load该源的事件。一个新的load应为 <video> 触发事件.

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

关于javascript - 使用 React 更新 HTML5 视频的源 URL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41303012/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com