hejianhao
2026-04-21 d9502fdec15f4fb782602f9113458e9db1b35b19
fix(站点搜索): 修复mr的P0、P1问题
2个文件已修改
47 ■■■■■ 已修改文件
src/robotaxi/pages/site-search/hooks/use-site-search.ts 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/robotaxi/pages/site-search/index.tsx 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/robotaxi/pages/site-search/hooks/use-site-search.ts
@@ -37,9 +37,15 @@
  const [isInitLoaded, setIsInitLoaded] = useState(false);
  const searchSeqRef = useRef(0);
  const debounceTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);
  const pendingSearchValueRef = useRef('');
  // 拉取附近站点
  const fetchNearbySites = async (lat: number, lon: number, electronicAreaId?: string) => {
  const fetchNearbySites = async (
    lat: number,
    lon: number,
    electronicAreaId?: string,
    canUpdate?: () => boolean
  ) => {
    const selectedCity = Taro.getStorageSync('selectedCity');
    try {
      const res = await getNearestSite({
@@ -48,9 +54,15 @@
        longitude: Number(lon),
        electronicAreaId
      });
      if (canUpdate && !canUpdate()) {
        return;
      }
      const points = Array.isArray(res?.points) ? res.points : [];
      setNearbySiteList(points.map(normalizeSiteItem));
    } catch {
      if (canUpdate && !canUpdate()) {
        return;
      }
      setNearbySiteList([]);
    }
  };
@@ -141,10 +153,12 @@
  // 搜索输入防抖
  const debouncedSearch = useMemo(() => {
    return (val: string) => {
      pendingSearchValueRef.current = val;
      if (debounceTimerRef.current) {
        clearTimeout(debounceTimerRef.current);
      }
      debounceTimerRef.current = setTimeout(() => {
        debounceTimerRef.current = null;
        searchSiteRef.current(val);
      }, 300);
    };
@@ -156,6 +170,19 @@
      clearTimeout(debounceTimerRef.current);
      debounceTimerRef.current = null;
    }
    pendingSearchValueRef.current = '';
  };
  // 立即执行待触发的防抖搜索
  const flushDebouncedSearch = () => {
    if (!debounceTimerRef.current) {
      return;
    }
    const pendingValue = pendingSearchValueRef.current;
    clearTimeout(debounceTimerRef.current);
    debounceTimerRef.current = null;
    pendingSearchValueRef.current = '';
    searchSiteRef.current(pendingValue);
  };
  // 清空搜索结果列表
@@ -182,7 +209,14 @@
      const { pageType: type, latitude: lat, longitude: lon, electronicAreaId } = deps.router.params;
      const initTasks: Promise<unknown>[] = [];
      if (lat && lon) {
        initTasks.push(fetchNearbySites(Number(lat), Number(lon), electronicAreaId));
        initTasks.push(
          fetchNearbySites(
            Number(lat),
            Number(lon),
            electronicAreaId,
            () => !isUnmounted
          )
        );
      }
      initTasks.push((async () => {
        try {
@@ -227,6 +261,7 @@
    searchSite,
    debouncedSearch,
    cancelDebouncedSearch,
    flushDebouncedSearch,
    clearSearchResults
  };
}
src/robotaxi/pages/site-search/index.tsx
@@ -43,6 +43,7 @@
    searchSite,
    debouncedSearch,
    cancelDebouncedSearch,
    flushDebouncedSearch,
    clearSearchResults
  } = useSiteSearch({
    router,
@@ -240,8 +241,11 @@
        <View className='search-input-box'>
          <Input className='search-input' placeholder={pageType == 'start' ? '请输入上车点' : '请输入目的地'} value={searchValue}
            onInput={(e) => changeSearchValue(e)}
            onBlur={cancelDebouncedSearch}
            onConfirm={() => searchSite()}
            onBlur={flushDebouncedSearch}
            onConfirm={() => {
              cancelDebouncedSearch();
              searchSite();
            }}
            confirmType='search'
            autoFocus
          />