perf: cache listen functions to prevent always repeatedly remove and re-add listener on useLayoutEvents hook

This commit is contained in:
oomeow 2025-12-14 13:06:34 +08:00
parent 195f470bca
commit ee6b857336
No known key found for this signature in database
GPG Key ID: B7BC3926B326F37B

View File

@ -1,20 +1,20 @@
import { event } from "@tauri-apps/api"; import { event } from "@tauri-apps/api";
import { listen, UnlistenFn, EventCallback } from "@tauri-apps/api/event"; import { listen, UnlistenFn, EventCallback } from "@tauri-apps/api/event";
import { useRef } from "react"; import { useCallback, useRef } from "react";
export const useListen = () => { export const useListen = () => {
const unlistenFns = useRef<UnlistenFn[]>([]); const unlistenFns = useRef<UnlistenFn[]>([]);
const addListener = async <T>( const addListener = useCallback(
eventName: string, async <T>(eventName: string, handler: EventCallback<T>) => {
handler: EventCallback<T>, const unlisten = await listen(eventName, handler);
) => { unlistenFns.current.push(unlisten);
const unlisten = await listen(eventName, handler); return unlisten;
unlistenFns.current.push(unlisten); },
return unlisten; [],
}; );
const removeAllListeners = () => { const removeAllListeners = useCallback(() => {
const errors: Error[] = []; const errors: Error[] = [];
unlistenFns.current.forEach((unlisten) => { unlistenFns.current.forEach((unlisten) => {
@ -33,13 +33,13 @@ export const useListen = () => {
} }
unlistenFns.current.length = 0; unlistenFns.current.length = 0;
}; }, []);
const setupCloseListener = async function () { const setupCloseListener = useCallback(async () => {
await event.once("tauri://close-requested", async () => { await event.once("tauri://close-requested", async () => {
removeAllListeners(); removeAllListeners();
}); });
}; }, [removeAllListeners]);
return { return {
addListener, addListener,