操作视频的开始与暂停

news2025/1/12 15:08:50
  • 调用 ref.current.play() 方法来播放视频;

  • 如果视频需要暂停,我们调用 ref.current.pause() 方法来暂停视频

通过 useRef 创建的 ref 操作视频的开始与暂停

当用户点击按钮时,根据当前视频的状态,我们会开始或暂停视频,并根据视频的播放状态来更新按钮的显示文本。

image.png

// 播放及暂停视频
import { useRef, useState } from "react";

const ControlsVideo = () => {
  const [isPlaying, setIsPlaying] = useState<any>(false);
  const ref = useRef<any>(null);

  function handleClick() {
    // 按钮名的修改
    const nextIsPlaying = !isPlaying;
    // 开始或暂停视频
    setIsPlaying(nextIsPlaying);

    if (nextIsPlaying) {
      ref.current.play();
    } else {
      ref.current.pause();
    }
  }

  return (
    <>
      <button onClick={handleClick}>{isPlaying ? "开始" : "暂停"}</button>
      <video
        width="250"
        ref={ref}
        onPlay={() => setIsPlaying(true)}
        onPause={() => setIsPlaying(false)}
      >
        <source
          src="https://interactive-examples.mdn.mozilla.net/media/cc0-videos/flower.mp4"
          type="video/mp4"
        />
      </video>
    </>
  );
};

export default ControlsVideo;

我们定义了一个函数组件 ControlsVideo。在组件内部,我们使用 useState 创建了一个名为 isPlaying 的状态变量,并将初始值设置为 false,表示视频初始状态是暂停的。我们还使用 useRef 创建了一个引用 ref,并将其初始化为 null

接下来,我们定义了一个叫做 handleClick 的函数。当按钮被点击时,这个函数会被调用。

在函数内部,我们首先通过取反操作符 ! 来获取下一个状态 nextIsPlaying。然后,我们调用状态更新函数 setIsPlaying,将 nextIsPlaying 设置为新的状态值,从而更新 isPlaying 的值。

接着,我们使用 ref.current 来获取到 ref 引用所指向的 DOM 元素,这里是一个 video 元素。

根据 nextIsPlaying 的值,如果视频需要播放

  • 调用 ref.current.play() 方法来播放视频;

  • 如果视频需要暂停,我们调用 ref.current.pause() 方法来暂停视频

在组件的返回值中,我们渲染了一个按钮和一个视频元素。

在按钮部分,我们通过调用 handleClick 函数来处理按钮的点击事件。根据 isPlaying 的状态,我们使用条件运算符 ?: 来显示不同的按钮名,如果 isPlayingtrue,显示 “开始”,否则显示 “暂停”。

在视频元素部分,我们将 ref 设置为 video 元素的 ref 属性,以便将引用与该元素关联起来。同时,我们通过 onPlayonPause 事件处理函数来更新 isPlaying 的状态,当视频开始播放时将其设置为 true,当视频暂停时将其设置为 false。并且,我们指定了视频源的 URL 和类型。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/969093.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何利用开源工具搭建AI大模型底座

开源社区是技术发展的一个重要部分&#xff0c;对于AI大模型来说&#xff0c;也是如此。 我们在这篇文章中来尝试通过开源工具来构建AI大模型的底座&#xff0c;涉及到的技术包括&#xff1a; LangchainOpenAIFlowiseLocalAILlama 使用Langchain构建第一个对话应用 如果你使…

时序预测 | MATLAB实现TCN-LSTM时间卷积长短期记忆神经网络时间序列预测

时序预测 | MATLAB实现TCN-LSTM时间卷积长短期记忆神经网络时间序列预测 目录 时序预测 | MATLAB实现TCN-LSTM时间卷积长短期记忆神经网络时间序列预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 1.MATLAB实现TCN-LSTM时间卷积长短期记忆神经网络时间序列预测…

17.Oauth2-微服务认证

1.Oauth2 OAuth 2.0授权框架支持第三方支持访问有限的HTTP服务&#xff0c;通过在资源所有者和HTTP服务之间进行一个批准交互来代表资源者去访问这些资源&#xff0c;或者通过允许第三方应用程序以自己的名义获取访问权限。 为了方便理解&#xff0c;可以想象OAuth2.0就是在用…

reference based image enhancement 论文调研

Enhance Images as You Like with Unpaired Learning 这是IJCAI 2021的文章文章提出一个条件GAN模型&#xff0c;用reference image作为条件&#xff0c;可以在unpaired images上训练暗图增强模型&#xff0c;使得增强结果根据reference image来调节色调亮度和对比度。训练的监…

Redis事务为什么不支持回滚

Redis事务中过程中的错误分类两类&#xff1a; 在exec执行之前的错误&#xff0c;这种错误通常是指令错误&#xff0c;比如指令语法错误、内存不足等... --> 在开始事务后&#xff0c;传输指令时&#xff0c;遇到这种错误&#xff0c;Redis会给出Error错误提示&#xff0c;…

【多线程案例】定时器应用及实现

文章目录 1. 定时器是什么&#xff1f;2. 定时器的应用3. 自己实现定时器 1. 定时器是什么&#xff1f; 定时器就类似生活中的闹钟&#xff0c;它是软件开发中的一个重要组件。当有些线程我们并不希望它立刻执行&#xff0c;这个时候我们就可以使用定时器&#xff0c;规定线程在…

苹果iPhone15系列不再使用皮革保护壳?“FineWoven“官方认证替代

根据9月3日的报道&#xff0c;苹果即将推出的iPhone 15系列将不再使用皮革保护壳&#xff0c;取而代之的将是一种名为"FineWoven"的新材料编织工艺保护壳。 这种保护壳将有十种颜色可供选择&#xff0c;包括黑色、桑葚色、灰褐色、常绿色、太平洋蓝色、紫藤色、古白色…

Elasticsearch安装,Springboot整合Elasticsearch详细教程

Elasticsearch 是一个分布式、RESTful 风格的搜索和数据分析引擎&#xff0c;能够实现近乎实时的搜索。 Elasticsearch官网https://www.elastic.co/cn/ 目录 第一步&#xff1a;下载Elasticsearch 下载7.6.2版本 下载其他版本 第二步&#xff1a;安装Elasticsearch 第三…

【Spring+SpringMVC+Mybatis】SSM框架的整合、思想、工作原理和优缺点的略微讲解

&#x1f680;欢迎来到本文&#x1f680; &#x1f349;个人简介&#xff1a;陈童学哦&#xff0c;目前学习C/C、算法、Python、Java等方向&#xff0c;一个正在慢慢前行的普通人。 &#x1f3c0;系列专栏&#xff1a;陈童学的日记 &#x1f4a1;其他专栏&#xff1a;CSTL&…

Redis布隆过滤器原理

其实布隆过滤器本质上要解决的问题&#xff0c;就是防止很多没有意义的、恶意的请求穿透Redis&#xff08;因为Redis中没有数据&#xff09;直接打入到DB。它是Redis中的一个modules&#xff0c;其实可以理解为一个插件&#xff0c;用来拓展实现额外的功能。 可以简单理解布隆…

2.(Python数模)(优化模型一)线性规划问题

Python解决线性规划问题 参考了以下博文 https://blog.csdn.net/m0_46692607/article/details/126784109?spm1001.2014.3001.5506 目标是解决以下的线性规划&#xff0c;程序计算出目标函数的最大值&#xff0c;并在最大值下取得的x1x2x3对应值。 源代码如下&#xff1a; …

Android studio 实现生成二维码和扫描二维码

效果图 build.gradle(:app)添加依赖 dependencies {implementation com.google.zxing:core:3.3.3implementation com.journeyapps:zxing-android-embedded:3.6.0implementation com.google.zxing:javase:3.0.0 }Manifests.xml <uses-permission android:name"android…

SceneXplain 图片叙事升级:如何让图片听得到

‍SceneXplain 是一个由多模态 AI 驱动的产品服务&#xff0c;它不仅 提供一流的图像和视频标注解决方案&#xff0c;还具备卓越的多模态视觉问答能力&#xff0c;为用户解锁视觉内容的全新维度。 在《图像描述算法排位赛》中&#xff0c;我们探讨了图像描述&#xff08;Image …

DSSM实战中文文本匹配任务

引言 本文我们通过DSSM模型来完成中文文本匹配任务&#xff0c;其中包含了文本匹配任务的一般套路&#xff0c;后续只需要修改实现的模型。 数据准备 数据准备包括 构建词表(Vocabulary)构建数据集(Dataset) 本次用的是LCQMC通用领域问题匹配数据集&#xff0c;它已经分好…

利用 GNU Radio + HackRF 做 FM 收音机

比特的打包与解包 GNU Radio 系列教程&#xff08;四&#xff09;&#xff0d;&#xff0d; 比特的打包与解包_哔哩哔哩_bilibili SDR 教程 —— 利用 GNU Radio HackRF 做 FM 收音机_哔哩哔哩_bilibili

Nginx+keepalived实现高可用项目实战

一、环境搭建 此次项目准备四台虚拟机&#xff1a; 防火墙关闭 安装好nginx&#xff08;一台master,一台back&#xff0c;两台Web服务器&#xff09; ip:(根据自己的进行搭建) 192.168.85.128(master) 192.168.85.129(back) 192.168.85.132(web1) 192.168.85.133(web2)…

排序算法问题

给你一个整数数组 nums&#xff0c;请你将该数组升序排列。 示例 1&#xff1a; 输入&#xff1a;nums [5,2,3,1] 输出&#xff1a;[1,2,3,5] 示例 2&#xff1a; 输入&#xff1a;nums [5,1,1,2,0,0] 输出&#xff1a;[0,0,1,1,2,5] 代码如下&#xff1a; 1.插入排序(简…

Python 中轻松实现串口通信

迷途小书童的 Note 读完需要 3分钟 速读仅需 1 分钟 1 简介 pyserial 是一个 Python 库&#xff0c;它可以让您轻松地与串行端口进行通信。它支持多种操作系统&#xff0c;包括 Windows、Linux 和 macOS。pyserial 模块非常易于使用&#xff0c;并且提供了许多有用的功能。 2 实…

数学建模--二次规划型的求解的Python实现

目录 1.算法流程简介 2.算法核心代码 3.算法效果展示 1.算法流程简介 #二次规划模型 #二次规划我们需要用到函数:Cvxopt.solvers.qp(P,q,G,h,A,b) #首先解决二次规划问题和解决线性规划问题的流程差不多 """ 求解思路如下: 1.针对给定的代求式,转化成标准式…