From c03143e15955adfc03f1be9e0481209121ec3fa2 Mon Sep 17 00:00:00 2001 From: ZhangWei Date: Fri, 30 May 2025 16:21:26 +0800 Subject: [PATCH] fix(find-replace): debounce find string input to improve performance (#5306) --- .../src/views/dialog/FindReplaceDialog.tsx | 10 ++++++---- .../find-replace/src/views/dialog/SearchInput.tsx | 13 +++++++++---- 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/packages/find-replace/src/views/dialog/FindReplaceDialog.tsx b/packages/find-replace/src/views/dialog/FindReplaceDialog.tsx index 070c4fc3a1..fe15fd9f7a 100644 --- a/packages/find-replace/src/views/dialog/FindReplaceDialog.tsx +++ b/packages/find-replace/src/views/dialog/FindReplaceDialog.tsx @@ -18,7 +18,7 @@ import type { IDisposable, Nullable } from '@univerjs/core'; import type { ForwardedRef } from 'react'; import { ICommandService, IContextService, LocaleService } from '@univerjs/core'; import { Button, Checkbox, FormDualColumnLayout, FormLayout, Input, MessageType, Select } from '@univerjs/design'; -import { ILayoutService, IMessageService, useDependency, useObservable } from '@univerjs/ui'; +import { ILayoutService, IMessageService, useDebounceFn, useDependency, useObservable } from '@univerjs/ui'; import { forwardRef, useCallback, useEffect, useImperativeHandle, useMemo, useRef } from 'react'; import { fromEvent } from 'rxjs'; import { ReplaceAllMatchesCommand, ReplaceCurrentMatchCommand } from '../../commands/commands/replace.command'; @@ -64,7 +64,9 @@ export const FindDialog = forwardRef(function FindDialogImpl(_props, ref) { commandService.executeCommand(OpenReplaceDialogOperation.id); }, [commandService]); - const onFindStringChange = useCallback((findString: string) => findReplaceService.changeFindString(findString), [findReplaceService]); + const onFindStringChange = useDebounceFn((findString: string) => { + return findReplaceService.changeFindString(findString); + }, 500); useFindInputFocus(findReplaceService, ref); @@ -77,7 +79,7 @@ export const FindDialog = forwardRef(function FindDialogImpl(_props, ref) { matchesPosition={matchesPosition} findReplaceService={findReplaceService} localeService={localeService} - findString={findString} + initialFindString={findString} onChange={onFindStringChange} />
@@ -183,7 +185,7 @@ export const ReplaceDialog = forwardRef(function ReplaceDialogImpl(_props, ref) matchesPosition={matchesPosition} findReplaceService={findReplaceService} localeService={localeService} - findString={inputtingFindString} + initialFindString={inputtingFindString} onChange={onFindStringChange} /> diff --git a/packages/find-replace/src/views/dialog/SearchInput.tsx b/packages/find-replace/src/views/dialog/SearchInput.tsx index 83b881bba2..f224317c69 100644 --- a/packages/find-replace/src/views/dialog/SearchInput.tsx +++ b/packages/find-replace/src/views/dialog/SearchInput.tsx @@ -18,6 +18,7 @@ import type { LocaleService } from '@univerjs/core'; import type { IInputProps } from '@univerjs/design'; import type { IFindReplaceService } from '../../services/find-replace.service'; import { Input, Pager } from '@univerjs/design'; +import { useState } from 'react'; export interface ISearchInputProps extends Pick { findCompleted: boolean; @@ -25,11 +26,12 @@ export interface ISearchInputProps extends Pick onChange?.(value)} + value={value} + onChange={(value) => { + setValue(value); + onChange?.(value); + }} slot={(