wangzhibo
2026-07-16 b57020623cf0c946706573bf102e548c3a544423
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
import { useEventListener } from '@vueuse/core';
import { reactive, watch } from 'vue';
import { getBrowser } from '../utils';
 
// 使用 reactive 创建一个响应式的浏览器对象
const browser = reactive(getBrowser());
 
// 存储屏幕变化事件的回调函数数组
const events: (() => void)[] = [];
 
// 监听浏览器屏幕属性的变化
watch(
    () => browser.screen, // 监听的属性
    () => {
        // 当屏幕属性变化时,执行所有注册的回调函数
        events.forEach(ev => ev());
    }
);
 
// 监听窗口的 resize 事件,并更新浏览器对象
useEventListener(window, 'resize', () => {
    // 使用 Object.assign 更新响应式对象的属性
    Object.assign(browser, getBrowser());
});
 
// 导出一个自定义的 hook
export function useBrowser() {
    return {
        browser, // 返回响应式的浏览器对象
        // 注册屏幕变化的回调函数
        onScreenChange(ev: () => void, immediate = true) {
            // 将回调函数添加到事件数组中
            events.push(ev);
 
            // 如果 immediate 为 true,立即执行回调函数
            if (immediate) {
                ev();
            }
        }
    };
}