feat(common): ✨ 添加工具
This commit is contained in:
@@ -24,7 +24,6 @@ export function getCurrentPage() {
|
||||
return pages[pages.length - 1];
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 使用 TypeScript 工具类型实现自动类型推断的 toPromise
|
||||
*
|
||||
@@ -39,10 +38,17 @@ export function getCurrentPage() {
|
||||
// type ExtractFirstParameter<T> = Parameters<T>[0]; // 这样也可以,但需要T是函数类型
|
||||
|
||||
// 方法2:使用条件类型实现(更灵活,等价于 Parameters<T>[0])
|
||||
type ExtractFirstParameter<T> = T extends (arg: infer P, ...args: unknown[]) => unknown ? P : never;
|
||||
type ExtractFirstParameter<T> = T extends (
|
||||
arg: infer P,
|
||||
...args: unknown[]
|
||||
) => unknown
|
||||
? P
|
||||
: never;
|
||||
|
||||
// 提取 success 回调的参数类型(类似 ReturnType 的思路,但提取回调参数)
|
||||
type ExtractSuccessResult<T> = T extends { success?: (result: infer R) => void } ? R : never;
|
||||
type ExtractSuccessResult<T> = T extends { success?: (result: infer R) => void }
|
||||
? R
|
||||
: never;
|
||||
|
||||
// 提取函数参数类型并排除回调函数(用于args参数)
|
||||
type ExtractOptions<T> = T extends (options: infer P) => unknown
|
||||
@@ -103,7 +109,6 @@ export function toPromise<F extends (options: Record<string, unknown>) => void>(
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
export function showToast(
|
||||
title: string,
|
||||
icon: "success" | "loading" | "error" | "none" = "none",
|
||||
@@ -139,12 +144,9 @@ export async function getCanvasImageData(
|
||||
) {
|
||||
const context = uni.createCanvasContext(canvasId, thisArg);
|
||||
|
||||
const imgRes = await toPromise(
|
||||
uni.downloadFile,
|
||||
{
|
||||
url,
|
||||
},
|
||||
);
|
||||
const imgRes = await toPromise(uni.downloadFile, {
|
||||
url,
|
||||
});
|
||||
|
||||
console.log(imgRes);
|
||||
context.drawImage(imgRes.tempFilePath, x, y, width, height);
|
||||
@@ -243,3 +245,45 @@ export function checkAndroidPermission(permissionList: string[]) {
|
||||
});
|
||||
// #endif
|
||||
}
|
||||
|
||||
/**
|
||||
* 异步计算元素距离
|
||||
*/
|
||||
export async function calculateDistanceBySelectorAsync(
|
||||
scrollViewSelector: string,
|
||||
selector: string,
|
||||
offsetTop = 0,
|
||||
): Promise<number> {
|
||||
const scrollViewScrollOffsetPromise = new Promise<UniApp.NodeInfo>(
|
||||
(resolve) => {
|
||||
const query = uni.createSelectorQuery();
|
||||
query.select(scrollViewSelector).scrollOffset((res) => {
|
||||
resolve(res as UniApp.NodeInfo);
|
||||
});
|
||||
query.exec();
|
||||
},
|
||||
);
|
||||
|
||||
const targetElementPromise = new Promise<UniApp.NodeInfo>((resolve) => {
|
||||
const query = uni.createSelectorQuery();
|
||||
query.select(selector).boundingClientRect((rect) => {
|
||||
resolve(rect as UniApp.NodeInfo);
|
||||
});
|
||||
query.exec();
|
||||
});
|
||||
|
||||
const [scrollViewScrollOffset, targetElementRect] = await Promise.all([
|
||||
scrollViewScrollOffsetPromise,
|
||||
targetElementPromise,
|
||||
]);
|
||||
|
||||
if (!scrollViewScrollOffset || !targetElementRect) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
const distance =
|
||||
(targetElementRect.top ?? 0) +
|
||||
(scrollViewScrollOffset.scrollTop ?? 0) -
|
||||
offsetTop;
|
||||
return Math.max(0, Math.round(distance));
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user