From 7c2a9d141e28b4d44715213e710d995e1fb7af6f Mon Sep 17 00:00:00 2001 From: Phantom <59059173+EurFelux@users.noreply.github.com> Date: Wed, 13 Aug 2025 10:05:40 +0800 Subject: [PATCH] fix: web search button memory leak (#9100) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * refactor(InputbarTools): 重命名getMenuItems为menuItems以提高可读性 * docs(Inputbar): 添加内存泄露风险注释 * Revert "refactor(InputbarTools): 重命名getMenuItems为menuItems以提高可读性" This reverts commit 6076d5b74c33e866268c16283ea0a9c1c67a4f3e. * perf(WebSearchButton): 使用startTransition优化性能并移除setTimeout 移除setTimeout延迟更新,减少内存泄露,改用startTransition来优化UI卡顿问题,提升用户体验 --- .../pages/home/Inputbar/WebSearchButton.tsx | 25 ++++++++++--------- 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/src/renderer/src/pages/home/Inputbar/WebSearchButton.tsx b/src/renderer/src/pages/home/Inputbar/WebSearchButton.tsx index 5f3b4b00a6..7a6a6e6334 100644 --- a/src/renderer/src/pages/home/Inputbar/WebSearchButton.tsx +++ b/src/renderer/src/pages/home/Inputbar/WebSearchButton.tsx @@ -7,7 +7,7 @@ import { Assistant, WebSearchProvider } from '@renderer/types' import { hasObjectKey } from '@renderer/utils' import { Tooltip } from 'antd' import { Globe } from 'lucide-react' -import { FC, memo, useCallback, useImperativeHandle, useMemo } from 'react' +import { FC, memo, startTransition, useCallback, useImperativeHandle, useMemo } from 'react' import { useTranslation } from 'react-i18next' export interface WebSearchButtonRef { @@ -29,23 +29,22 @@ const WebSearchButton: FC = ({ ref, assistant, ToolbarButton }) => { const enableWebSearch = assistant?.webSearchProviderId || assistant.enableWebSearch const updateSelectedWebSearchProvider = useCallback( - (providerId?: WebSearchProvider['id']) => { + async (providerId?: WebSearchProvider['id']) => { // TODO: updateAssistant有性能问题,会导致关闭快捷面板卡顿 - // NOTE: 也许可以用startTransition优化卡顿问题 - setTimeout(() => { - const currentWebSearchProviderId = assistant.webSearchProviderId - const newWebSearchProviderId = currentWebSearchProviderId === providerId ? undefined : providerId + const currentWebSearchProviderId = assistant.webSearchProviderId + const newWebSearchProviderId = currentWebSearchProviderId === providerId ? undefined : providerId + startTransition(() => { updateAssistant({ ...assistant, webSearchProviderId: newWebSearchProviderId, enableWebSearch: false }) - }, 200) + }) }, [assistant, updateAssistant] ) - const updateSelectedWebSearchBuiltin = useCallback(() => { + const updateSelectedWebSearchBuiltin = useCallback(async () => { // TODO: updateAssistant有性能问题,会导致关闭快捷面板卡顿 - setTimeout(() => { + startTransition(() => { updateAssistant({ ...assistant, webSearchProviderId: undefined, enableWebSearch: !assistant.enableWebSearch }) - }, 200) + }) }, [assistant, updateAssistant]) const providerItems = useMemo(() => { @@ -92,11 +91,13 @@ const WebSearchButton: FC = ({ ref, assistant, ToolbarButton }) => { const openQuickPanel = useCallback(() => { if (assistant.webSearchProviderId) { - return updateSelectedWebSearchProvider(undefined) + updateSelectedWebSearchProvider(undefined) + return } if (assistant.enableWebSearch) { - return updateSelectedWebSearchBuiltin() + updateSelectedWebSearchBuiltin() + return } quickPanel.open({