当前位置: 首页 > news >正文

全屏组件封装(react18+antd)

基于react+ts封装的公用全屏组件

1、封装组件

在components下面构建FullScreenButton文件:

FullScreenButton/index.tsx

import React, { useState, useCallback, useEffect } from "react";
import { FullscreenOutlined, FullscreenExitOutlined } from "@ant-design/icons";
import { Tooltip } from "antd";
const FullScreenButton = ({ targetRef }) => {const [isFullScreen, setIsFullScreen] = useState(false);const toggleFullScreen = useCallback(() => {const parentElement = targetRef.current?.parentElement;if (!parentElement) return;if (isFullScreen) {exitFullScreen();} else {enterFullScreen(parentElement);}setIsFullScreen(!isFullScreen);}, [isFullScreen, targetRef]);const enterFullScreen = (element) => {if (element.requestFullscreen) {element.requestFullscreen();} else if (element.mozRequestFullScreen) {element.mozRequestFullScreen();} else if (element.webkitRequestFullscreen) {element.webkitRequestFullscreen();} else if (element.msRequestFullscreen) {element.msRequestFullscreen();}};const exitFullScreen = () => {if (document.exitFullscreen) {document.exitFullscreen();} else if (document.mozCancelFullScreen) {document.mozCancelFullScreen();} else if (document.webkitExitFullscreen) {document.webkitExitFullscreen();} else if (document.msExitFullscreen) {document.msExitFullscreen();}};useEffect(() => {const handleFullScreenChange = () => {const parentElement = targetRef.current?.parentElement;setIsFullScreen(document.fullscreenElement === parentElement);};document.addEventListener("fullscreenchange", handleFullScreenChange);document.addEventListener("webkitfullscreenchange", handleFullScreenChange);document.addEventListener("mozfullscreenchange", handleFullScreenChange);document.addEventListener("MSFullscreenChange", handleFullScreenChange);return () => {document.removeEventListener("fullscreenchange", handleFullScreenChange);document.removeEventListener("webkitfullscreenchange",handleFullScreenChange,);document.removeEventListener("mozfullscreenchange",handleFullScreenChange,);document.removeEventListener("MSFullscreenChange",handleFullScreenChange,);};}, [targetRef]);return (<spanstyle={{ cursor: "pointer", fontSize: "16px" }}onClick={toggleFullScreen}><Tooltip placement="bottom" title={isFullScreen ? "退出全屏" : "全屏"}>{isFullScreen ? <FullscreenExitOutlined /> : <FullscreenOutlined />}</Tooltip></span>);
};export default FullScreenButton;

2、使用组件

在指定的组件中使用

import "./index.less";
import React, { useRef } from "react";
import FullScreenButton from "@/components/FullScreenButton";
const settingPage: React.FC = () => {const targenRef = useRef(null);return (<div ref={targenRef}><div className="settings"><div className="bread">面包屑</div><div className="settings-right"><FullScreenButton targetRef={targenRef} />{/* <span>导航+设置</span> */}</div></div></div>);
};export default settingPage;

3、监听操作(根据需要设定)

 在父组件中监听是否放大(因为涉及到高度问题,最好是监听下根据是否放大来修改)

import React, { useRef, useState, useEffect } from "react";
import { Layout } from "antd";
import { Outlet } from "react-router-dom";
import "./index.less";
import SettingPage from "@/components/setting";
import isFullScreen from "@/utils/isFullScreen";
const { Content } = Layout;
const MainPage: React.FC = () => {const [isFullScreenState, setIsFullScreenState] = useState(isFullScreen());useEffect(() => {const handleFullScreenChange = () => {setIsFullScreenState(isFullScreen());};document.addEventListener("fullscreenchange", handleFullScreenChange);document.addEventListener("webkitfullscreenchange", handleFullScreenChange);document.addEventListener("mozfullscreenchange", handleFullScreenChange);document.addEventListener("MSFullscreenChange", handleFullScreenChange);// 清理函数return () => {document.removeEventListener("fullscreenchange", handleFullScreenChange);document.removeEventListener("webkitfullscreenchange",handleFullScreenChange,);document.removeEventListener("mozfullscreenchange",handleFullScreenChange,);document.removeEventListener("MSFullscreenChange",handleFullScreenChange,);};}, []);return (<><ContentclassName="custom-scrollbar"style={{height: isFullScreenState ? "100vh" : `calc(100vh - 64px)`,overflow: "auto",backgroundColor: "#eee",}}><SettingPage /><divstyle={{padding: 24,minHeight: 360,margin: "16px 8px",overflow: "auto",}}><Outlet /></div></Content></>);
};export default MainPage;

注意事项:

1、封装的组件中放大的是父组件,可以根据具体需要修改parentElement

2、使用的时候通过ref获取dom并且通过父传子的方式传给封装组件

3、监听是否放大了,修改父盒子的高度

 

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • # 服务治理中间件详解:Spring Cloud与Dubbo
  • 【实现开机自动下载原神(bat脚本)1.0】
  • PythonStudio 控件使用常用方式(十六)TButtonedEdit
  • 在国产芯片上实现YOLOv5/v8图像AI识别-【2.4】导出RKNN模型(第一部分:模型修改)更多内容见视频
  • Midjourney研究笔记丨05图生图:垫图,让机器人为你提供有效关键词
  • LabVIEW中的Reverse String函数与字节序转换
  • MySQL4多表查询 内连接
  • 支付宝开放平台竟出现一张神秘人脸!
  • uniapp(scroll-view)设置show-scrollbar无效
  • RHCA III之路---EX436-5
  • 在Quartz.Net中使用Scoped Service
  • Vue:使用html2canvas将数据导出到PDF上(含分页)
  • docker部署xxl-job
  • Shell脚本-DNS域名解析格式化
  • Element学习(布局组件、案例操作)(4)
  • @jsonView过滤属性
  • [数据结构]链表的实现在PHP中
  • 【翻译】babel对TC39装饰器草案的实现
  • Flannel解读
  • Java 实战开发之spring、logback配置及chrome开发神器(六)
  • JavaScript工作原理(五):深入了解WebSockets,HTTP/2和SSE,以及如何选择
  • JS题目及答案整理
  • Making An Indicator With Pure CSS
  • nginx 负载服务器优化
  • Odoo domain写法及运用
  • python 装饰器(一)
  • 仿天猫超市收藏抛物线动画工具库
  • 基于Vue2全家桶的移动端AppDEMO实现
  • 开源中国专访:Chameleon原理首发,其它跨多端统一框架都是假的?
  • 利用DataURL技术在网页上显示图片
  • 一加3T解锁OEM、刷入TWRP、第三方ROM以及ROOT
  • 终端用户监控:真实用户监控还是模拟监控?
  • 曜石科技宣布获得千万级天使轮投资,全方面布局电竞产业链 ...
  • 移动端高清、多屏适配方案
  • ​​​​​​​开发面试“八股文”:助力还是阻力?
  • ​【已解决】npm install​卡主不动的情况
  • ​DB-Engines 11月数据库排名:PostgreSQL坐稳同期涨幅榜冠军宝座
  • # Redis 入门到精通(一)数据类型(4)
  • #14vue3生成表单并跳转到外部地址的方式
  • $(document).ready(function(){}), $().ready(function(){})和$(function(){})三者区别
  • (22)C#传智:复习,多态虚方法抽象类接口,静态类,String与StringBuilder,集合泛型List与Dictionary,文件类,结构与类的区别
  • (C语言)球球大作战
  • (Git) gitignore基础使用
  • (ISPRS,2023)深度语义-视觉对齐用于zero-shot遥感图像场景分类
  • (Python) SOAP Web Service (HTTP POST)
  • (附源码)springboot炼糖厂地磅全自动控制系统 毕业设计 341357
  • (附源码)ssm航空客运订票系统 毕业设计 141612
  • (四)事件系统
  • (算法)前K大的和
  • (五)activiti-modeler 编辑器初步优化
  • (原创)Stanford Machine Learning (by Andrew NG) --- (week 9) Anomaly DetectionRecommender Systems...
  • (转载)PyTorch代码规范最佳实践和样式指南
  • **PyTorch月学习计划 - 第一周;第6-7天: 自动梯度(Autograd)**
  • .net core 微服务_.NET Core 3.0中用 Code-First 方式创建 gRPC 服务与客户端
  • .Net Core与存储过程(一)