Vue3+Ts封装全屏/退出全屏组件

 通过调用浏览器的api:requestFullscreen来实现浏览器全屏,同时对浏览器进行了兼容性设置

<template>
	<div>
		<i class="full-button" @click="toggleFullscreen">
			<svg
				v-if="!isFullscreen"
				t="1724052190455"
				class="icon"
				viewBox="0 0 1024 1024"
				version="1.1"
				xmlns="http://www.w3.org/2000/svg"
				p-id="27834"
				width="18"
				height="18"
			>
				<path
					d="M414.165333 609.834667a42.666667 42.666667 0 0 1 0 60.330666L145.664 938.666667H276.906667a42.666667 42.666667 0 1 1 0 85.333333H42.666667a42.666667 42.666667 0 0 1-42.666667-42.666667v-234.24a42.666667 42.666667 0 1 1 85.333333 0v131.242667l268.501334-268.501333a42.666667 42.666667 0 0 1 60.330666 0zM609.834667 609.834667a42.666667 42.666667 0 0 1 60.330666 0L938.666667 878.336V747.093333a42.666667 42.666667 0 1 1 85.333333 0V981.333333a42.666667 42.666667 0 0 1-42.666667 42.666667h-234.24a42.666667 42.666667 0 1 1 0-85.333333h131.242667l-268.501333-268.501334a42.666667 42.666667 0 0 1 0-60.330666zM414.165333 414.165333a42.666667 42.666667 0 0 0 0-60.330666L145.664 85.333333H276.906667a42.666667 42.666667 0 0 0 0-85.333333H42.666667a42.666667 42.666667 0 0 0-42.666667 42.666667v234.24a42.666667 42.666667 0 0 0 85.333333 0V145.664l268.501334 268.501333a42.666667 42.666667 0 0 0 60.330666 0zM609.834667 414.165333a42.666667 42.666667 0 0 0 60.330666 0L938.666667 145.664V276.906667a42.666667 42.666667 0 1 0 85.333333 0V42.666667a42.666667 42.666667 0 0 0-42.666667-42.666667h-234.24a42.666667 42.666667 0 1 0 0 85.333333h131.242667l-268.501333 268.501334a42.666667 42.666667 0 0 0 0 60.330666z"
					p-id="27835"
					fill="#ffffff"
				></path>
			</svg>
			<svg
				v-else
				t="1724051727898"
				class="icon"
				viewBox="0 0 1024 1024"
				version="1.1"
				xmlns="http://www.w3.org/2000/svg"
				p-id="22073"
				width="18"
				height="18"
			>
				<path
					d="M400.595 345.365l-0.948-245.022c-0.42-18.881-16.018-30.215-34.956-30.637h-25.406c-18.88-0.42-33.874 16.018-33.457 34.881l1.061 133.251L138.772 72.417c-18.274-18.311-47.844-18.311-66.119 0-18.218 18.314-18.218 47.907 0 66.236l166.575 164.885-127.697 0.512c-18.88-0.477-36.394 12.606-39.26 34.899v24.08c0.477 18.917 16.077 34.558 34.957 34.972l243.826-1.438c0.362 0.035 0.608 0.171 0.928 0.171l17.1 0.378c9.441 0.226 17.9-3.467 23.923-9.593 6.124-6.083 8.382-14.58 8.131-24.078l-1.821-17.138c0.001-0.335 1.27-0.562 1.27-0.945z m365.616 356.086l127.524-0.512c18.88 0.421 36.357-11.183 39.26-33.474v-24.077c-0.478-18.922-16.134-34.558-34.957-35.037l-240.702 1.458c-0.378 0-0.605-0.151-0.967-0.151l-17.062-0.42c-9.441-0.226-17.95 3.469-23.98 9.611-6.159 6.03-8.361 14.559-8.173 24.057l1.881 17.1c0.033 0.42-1.234 0.661-1.234 0.986l0.986 241.248c0.477 18.863 16.078 30.162 34.957 30.576l24.017 0.037c18.827 0.433 33.874-16.055 33.403-34.941l-1.062-130.388 168.117 166.502c18.276 18.314 47.809 18.314 66.085 0 18.255-18.31 18.255-47.906 0-66.218L766.209 701.442z m-373.219-82.596c-6.028-6.14-14.541-9.834-23.923-9.61l-17.104 0.42c-0.346 0-0.566 0.151-0.948 0.151l-243.81-1.458c-18.881 0.478-34.503 16.112-34.956 35.034v24.078c2.843 22.292 20.357 33.892 39.206 33.474l129.158 0.42-167.983 166.37c-18.234 18.255-18.234 47.906 0 66.218 18.256 18.314 47.845 18.314 66.102 0l168.137-165.418-1.079 131.185c-0.42 18.922 14.579 35.413 33.424 34.938h25.406c18.937-0.477 34.54-11.713 34.956-30.637l0.987-243.05c0-0.346-1.267-0.571-1.267-0.949l1.821-17.104c0.206-9.495-1.993-18.025-8.116-24.053z m222.442-231.296c6.03 6.123 14.541 9.819 23.965 9.553l17.06-0.378c0.378 0 0.608-0.132 0.986-0.19l244.19 1.457c18.88-0.434 34.482-16.078 34.956-34.994l0.058-24.078c-2.898-22.331-20.439-35.355-39.26-34.939l-129.573-0.511 166.483-164.893c18.31-18.235 18.31-47.83 0.054-66.143-18.276-18.311-47.809-18.311-66.084 0L700.152 238.89l1.079-134.276c0.454-18.863-14.598-35.355-33.424-34.939H643.79c-18.881 0.477-34.484 11.773-34.957 30.637l-0.967 245.075c0 0.378 1.251 0.608 1.251 0.948l-1.859 17.138c-0.192 9.499 2.007 17.991 8.173 24.078z"
					p-id="22074"
					fill="#ffffff"
				></path>
			</svg>
		</i>
	</div>
</template>

<script lang="ts" setup>
import { ref, onMounted, onBeforeUnmount } from "vue";

const isFullscreen = ref<boolean>(false);

const toggleFullscreen = () => {
	if (isFullscreen.value) {
		exitFullscreen();
	} else {
		enterFullscreen();
	}
};

const enterFullscreen = () => {
	const doc = document.documentElement as HTMLElement;
	if (doc.requestFullscreen) {
		doc.requestFullscreen();
	} else if ((doc as any).mozRequestFullScreen) {
		// Firefox
		(doc as any).mozRequestFullScreen();
	} else if ((doc as any).webkitRequestFullscreen) {
		// Chrome, Safari, Opera
		(doc as any).webkitRequestFullscreen();
	} else if ((doc as any).msRequestFullscreen) {
		// IE/Edge
		(doc as any).msRequestFullscreen();
	}
	isFullscreen.value = true;
};

const exitFullscreen = () => {
	if (document.exitFullscreen) {
		document.exitFullscreen();
	} else if ((document as any).mozCancelFullScreen) {
		// Firefox
		(document as any).mozCancelFullScreen();
	} else if ((document as any).webkitExitFullscreen) {
		// Chrome, Safari, Opera
		(document as any).webkitExitFullscreen();
	} else if ((document as any).msExitFullscreen) {
		// IE/Edge
		(document as any).msExitFullscreen();
	}
	isFullscreen.value = false;
};

const handleFullscreenChange = () => {
	isFullscreen.value = !!(
		document.fullscreenElement ||
		(document as any).mozFullScreenElement ||
		(document as any).webkitFullscreenElement ||
		(document as any).msFullscreenElement
	);
};

onMounted(() => {
	document.addEventListener("fullscreenchange", handleFullscreenChange);
	document.addEventListener("mozfullscreenchange", handleFullscreenChange);
	document.addEventListener("webkitfullscreenchange", handleFullscreenChange);
	document.addEventListener("msfullscreenchange", handleFullscreenChange);
});

onBeforeUnmount(() => {
	document.removeEventListener("fullscreenchange", handleFullscreenChange);
	document.removeEventListener("mozfullscreenchange", handleFullscreenChange);
	document.removeEventListener("webkitfullscreenchange", handleFullscreenChange);
	document.removeEventListener("msfullscreenchange", handleFullscreenChange);
});
</script>

<style scoped>
.full-button {
	margin-right: 20px;
	cursor: pointer;
}
</style>

调用时:

<Fullscreen></Fullscreen>

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue 3是一种流行的JavaScript框架,而TypeScript是一种类型安全的JavaScript的超集。封装axios是在Vue 3项目中使用TypeScript封装axios库,以便更好地管理和使用网络请求。 在Vue 3 + TypeScript封装axios,可以按照以下步骤进行: 1. 安装axios和@types/axios: ``` npm install axios @types/axios ``` 2. 创建一个api.ts文件,用于封装axios请求: ```typescript import axios, { AxiosRequestConfig, AxiosResponse } from 'axios'; // 创建一个axios实例 const instance = axios.create({ baseURL: 'http://api.example.com', // 设置请求的基础URL timeout: 5000, // 设置请求超时时间 }); // 请求拦截器 instance.interceptors.request.use( (config: AxiosRequestConfig) => { // 在发送请求之前做一些处理,例如添加token等 return config; }, (error: any) => { // 处理请求错误 return Promise.reject(error); } ); // 响应拦截器 instance.interceptors.response.use( (response: AxiosResponse) => { // 对响应数据进行处理,例如统一处理错误码等 return response.data; }, (error: any) => { // 处理响应错误 return Promise.reject(error); } ); // 封装get请求 export function get(url: string, params?: any): Promise<any> { return instance.get(url, { params }); } // 封装post请求 export function post(url: string, data?: any): Promise<any> { return instance.post(url, data); } ``` 3. 在Vue组件中使用封装的axios请求: ```typescript import { defineComponent } from 'vue'; import { get, post } from './api'; export default defineComponent({ methods: { fetchData() { get('/api/data').then((response) => { // 处理响应数据 }).catch((error) => { // 处理请求错误 }); }, postData() { post('/api/data', { name: 'example' }).then((response) => { // 处理响应数据 }).catch((error) => { // 处理请求错误 }); }, }, }); ``` 以上就是在Vue 3 + TypeScript封装axios的基本步骤。通过封装,可以更好地管理和复用网络请求代码,并且可以在请求拦截器和响应拦截器中进行统一处理。同时,使用TypeScript可以提供类型检查和自动补全的功能,提高代码的可靠性和开发效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值