/**
* 自适应宽度构造器
*
* @time 2022-4-8
* @author sunjianlei
*/
import { ref } from 'vue';
import { useDebounceFn, tryOnUnmounted } from '@vueuse/core';
import { useEventListener } from '/@/hooks/event/useEventListener';
// key = js运算符+数字
const defWidthConfig: configType = {
'<=565': '100%',
'<=1366': '800px',
'<=1600': '600px',
'<=1920': '600px',
'>1920': '500px',
};
type configType = Record<string, string | number>;
/**
* 自适应宽度
*
* @param widthConfig 宽度配置,可参考 defWidthConfig 配置
* @param assign 是否合并默认配置
* @param debounce 去抖毫秒数
*/
export function useAdaptiveWidth(widthConfig = defWidthConfig, assign = true, debounce = 50) {
const widthConfigAssign = assign ? Object.assign({}, defWidthConfig, widthConfig) : widthConfig;
const configKeys = Object.keys(widthConfigAssign);
const adaptiveWidth = ref<string | number>();
/**
* 进行计算宽度
* @param innerWidth
*/
function calcWidth(innerWidth) {
let width;
for (const key of configKeys) {
try {
// 通过js运算
let flag = new Function(`return ${innerWidth} ${key}`)();
if (flag) {
width = widthConfigAssign[key];
break;
}
} catch (e) {
console.error(e);
}
}
if (width) {
adaptiveWidth.value = width;
} else {
console.warn('没有找到匹配的自适应宽度');
}
}
// 初始计算
calcWidth(window.innerWidth);
// 监听 resize 事件
const { removeEvent } = useEventListener({
el: window,
name: 'resize',
listener: useDebounceFn(() => calcWidth(window.innerWidth), debounce),
});
// 卸载组件时取消监听事件
tryOnUnmounted(() => removeEvent());
return { adaptiveWidth };
}
/**
* 抽屉自适应宽度
*/
export function useDrawerAdaptiveWidth() {
return useAdaptiveWidth(
{
'<=620': '100%',
'<=1600': 600,
'<=1920': 650,
'>1920': 700,
},
false
);
}