当前位置: 首页 > 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、监听是否放大了,修改父盒子的高度

 

http://www.lryc.cn/news/419719.html

相关文章:

  • wordpress全局自适应网址导航整站打包源码,含主题和数据库
  • PyTorch深度学习框架
  • Python和AI库NumPy(二):数组创建与操作
  • GD32 SPI驱动代码
  • Qgis 开发初级 《数据库和图层》
  • 三大机器学习框架对比:TensorFlow、PyTorch与Scikit-Learn
  • Apache OFBiz 曝出严重漏洞,允许预身份验证 RCE
  • SpringCloud 微服务nacos和eureka
  • Java学习篇(一)| 如何生成分布式全局唯一ID
  • c++ 弹窗办法
  • 小程序使用this.animate实现3维动画切换
  • 【区块链+社会公益】第一反应互助急救链 | FISCO BCOS应用案例
  • leetcode 136. 只出现一次的数字
  • 可扩展架构设计:策略与最佳实践
  • 一图胜千言|图解Pandas常用操作!
  • ue5正确导入资源 content(内容),content只能有一个
  • HTTP协议基础知识【后端 4】
  • 2024/8/10 英语每日一段
  • 深入探索 Wireshark——网络封包分析的利器
  • VS2022使用.Net Framework4.0方法
  • 创建一个简单的贪吃蛇游戏:HTML、CSS和JavaScript教程
  • 全面讲解电子齿轮比与脉冲数计算
  • 音频进阶学习一——模拟信号和数字信号
  • SpringBoot企业人事管理系统-附源码与配套论文
  • 用window计算器实现定点数的十进制和二进制之间相互转换
  • 搬砖人2024年的智能工作伙伴 —— 4款思维导图软件种草集!
  • 【Python第三方库】Requests全面解析
  • 基于CNN的医学X-Ray图像分类全程解析
  • C++初学者指南-5.标准库(第二部分)--排序序列操作
  • matplotlib库学习之绘图透明度设置(精炼准确)