【前端工具类】002-监听窗口尺寸变化工具类:WindowSizeTracker
一、ts 传统写法
1、工具类
interface WindowSize {
width: number;
height: number;
}
type WindowSizeChangeListener = (size: WindowSize) => void;
export class WindowSizeTracker {
private listeners: WindowSizeChangeListener[] = [];
private size: WindowSize = {
width: window.innerWidth,
height: window.innerHeight,
};
public addListener(listener: WindowSizeChangeListener): void {
listener(this.size);
this.listeners.push(listener);
}
public removeListener(listener: WindowSizeChangeListener): void {
const index = this.listeners.indexOf(listener);
if (index !== -1) {
this.listeners.splice(index, 1);
}
}
private notifyListeners(): void {
this.listeners.forEach((listener) => {
listener(this.size);
});
}
private handleResize(): void {
this.size = {
width: window.innerWidth,
height: window.innerHeight,
};
this.notifyListeners();
}
constructor() {
window.addEventListener("resize", () => {
this.handleResize();
});
}
}
2、使用示例
import {WindowSizeTracker} from "@/utils/WindowSizeTracker";
const tracker = new WindowSizeTracker();
tracker.addListener((size) => {
console.log(`窗口尺寸已改变为:${size.width} x ${size.height}`);
});
tracker.removeListener((size) => {
console.log(`窗口尺寸已改变为:${size.width} x ${size.height}`);
});
二、Vue3 usexxx 写法
1、代码
import { ref, onMounted, onUnmounted } from 'vue';
export function useWindowSize() {
const width = ref(window.innerWidth);
const height = ref(window.innerHeight);
const handleResize = () => {
width.value = window.innerWidth;
height.value = window.innerHeight;
};
onMounted(() => {
window.addEventListener('resize', handleResize);
});
onUnmounted(() => {
window.removeEventListener('resize', handleResize);
});
return {
width,
height,
};
}
2、使用示例
<script lang="ts" setup>
import { useWindowSize } from "@/utils/WindowSizeTracker";
import {watch} from "vue";
const { width, height } = useWindowSize();
watch([width, height], ([width, height]) => {
console.log(width, height);
});
</script>