PAYATHON 2026

如何在 React Web 项目中用 JavaScript 播放和暂停视频?

数据阿明

在 React 中,可以用 useRef 获取原生 <video> 元素的引用,再调用 play() 和 pause() 控制播放和暂停。VS Code 是代码编辑器,视频控制逻辑运行在浏览器中。

为什么要使用 useRef?

play() 和 pause() 是浏览器视频元素提供的方法。React 的 useRef 可以保存元素的引用,让按钮的点击事件访问它。

调用 play() 会返回一个 Promise。播放请求可能因浏览器播放策略或媒体资源问题而失败,因此需要处理异常。pause() 可以直接调用,无需 await。

完整示例

这个组件包含视频、播放和暂停按钮,以及播放失败时的提示:

import { useRef, useState } from 'react';

export default function VideoPlayer() {
  const videoRef = useRef(null);
  const [error, setError] = useState('');

  async function handlePlay() {
    const video = videoRef.current;
    if (!video) return;

    setError('');

    try {
      await video.play();
    } catch (err) {
      setError('视频未能开始播放,请检查视频地址和浏览器控制台。');
      console.error('Video playback failed:', err);
    }
  }

  function handlePause() {
    videoRef.current?.pause();
  }

  return (
    <div>
      <video
        ref={videoRef}
        src="/sample.mp4"
        controls
        width={640}
        style={{ maxWidth: '100%' }}
      />

      <div>
        <button type="button" onClick={handlePlay}>
          播放
        </button>
        <button type="button" onClick={handlePause}>
          暂停
        </button>
      </div>

      {error && <p role="alert">{error}</p>}
    </div>
  );
}

将 /sample.mp4 替换为项目中可以访问的视频 URL。这个路径指向网站根路径下的资源,本地文件的存放位置取决于项目的构建工具和静态资源配置。

ref={videoRef} 让 React 在元素挂载后将对应的 DOM 元素赋给 videoRef.current。点击按钮时,事件处理函数就能通过这个引用调用视频方法。调用前检查引用是否存在,可以避免在元素不可用时调用方法。

只需要基本控制时,可以使用 controls

如果只需要让用户手动播放、暂停和拖动进度条,直接使用浏览器自带的控制栏即可:

export default function VideoPlayer() {
  return <video src="/sample.mp4" controls />;
}

需要自定义按钮时,可以使用前面的 useRef 方案。示例同时保留了 controls 和自定义按钮,也可以根据界面需求去掉 controls。

播放失败或按钮没有效果时检查什么?

  • 视频地址是否可访问:检查浏览器 Network 面板中的视频请求,确认没有 404 等错误。文件系统路径不能直接用作网站资源 URL。
  • 媒体是否受浏览器支持:文件扩展名不能保证视频可播放,浏览器还需要支持对应的容器和编码格式。
  • 调用是否来自用户操作:直接在按钮点击事件中调用 play() 是常见做法。如果改为页面加载后自动播放,可能受到浏览器自动播放策略的限制。
  • 事件是否绑定正确:使用 onClick={handlePlay},不要写成 `onClick={handlePlay()}“;后者会在渲染时执行函数。

暂停后会保留当前播放位置,再次调用 play() 会从该位置继续播放。如需回到开头,可以在暂停后重置播放位置:

const video = videoRef.current;

if (video) {
  video.pause();
  video.currentTime = 0;
}

备注:内容仅供参考。