hejianhao
2026-04-20 ee4374cb2aa55c6fc6bd1159bf1c432af51ff30d
refactor(站点搜索): 替换防抖实现以修复组件卸载时的内存泄漏

移除对通用防抖工具的依赖,改用组件内手动管理定时器
在组件卸载时清理定时器,避免潜在的内存泄漏
在清空搜索结果时增加防抖定时器清理和请求序号推进
1个文件已修改
29 ■■■■■ 已修改文件
src/robotaxi/pages/site-search/hooks/use-site-search.ts 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/robotaxi/pages/site-search/hooks/use-site-search.ts
@@ -1,7 +1,6 @@
import Taro from '@tarojs/taro';
import { useEffect, useMemo, useRef, useState } from 'react';
import { getStartPoints, getEndPoints, queryPointByName } from '../../../api/site-search';
import { debounce } from '../../../../utils/Robotaxi-public-method';
import { checkOtp } from '../../../../utils/tools';
import { getNearestSite } from '../../../api/home';
import { _AMAP_KEY } from '../../../../constants/api';
@@ -35,6 +34,7 @@
  // 最近一次完成搜索的关键词
  const [lastCompletedKeyword, setLastCompletedKeyword] = useState('');
  const searchSeqRef = useRef(0);
  const debounceTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);
  // 拉取附近站点
  const fetchNearbySites = async (lat: number, lon: number, electronicAreaId?: string) => {
@@ -137,18 +137,39 @@
  searchSiteRef.current = searchSite;
  // 搜索输入防抖
  const debouncedSearch = useMemo(() => debounce((val) => {
    searchSiteRef.current(val);
  }, 300), []);
  const debouncedSearch = useMemo(() => {
    return (val: string) => {
      if (debounceTimerRef.current) {
        clearTimeout(debounceTimerRef.current);
      }
      debounceTimerRef.current = setTimeout(() => {
        searchSiteRef.current(val);
      }, 300);
    };
  }, []);
  // 清空搜索结果列表
  const clearSearchResults = () => {
    if (debounceTimerRef.current) {
      clearTimeout(debounceTimerRef.current);
      debounceTimerRef.current = null;
    }
    // 推进请求序号,使清空前已发出的请求结果失效
    searchSeqRef.current += 1;
    setSiteList([]);
    setNonOperationalSite([]);
    setIsSearching(false);
    setLastCompletedKeyword('');
  };
  useEffect(() => {
    return () => {
      if (debounceTimerRef.current) {
        clearTimeout(debounceTimerRef.current);
      }
    };
  }, []);
  // 初始化:拉取附近站点、历史记录、页面类型
  useEffect(() => {
    const { pageType: type, latitude: lat, longitude: lon, electronicAreaId } = deps.router.params;