You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React Native TypeScript 实现支持空格仅输入字母触发查询的搜索功能

解决方案

核心改动逻辑如下:

  • 保留原有的空格规范化逻辑:自动合并连续空格、移除首尾空格,不会禁止用户输入正常的间隔空格
  • 新增字母存在校验规则,通过正则判断输入内容是否包含至少一个大小写字母
  • 触发搜索前先做合法性校验,不符合规则时取消已排队的防抖搜索任务,避免无效请求,同时清空历史搜索结果

修改后的完整代码如下:

import debounce from 'lodash/debounce';
import React, { useState, useRef } from 'react';
import { Keyboard } from 'react-native'; // 补充原代码遗漏的Keyboard导入

const SearchScreen = () => {
  const [searchText, setSearchText] = useState('');
  const [searchedText, setSearchedText] = useState('');
  const delayedSearch = useRef(
    debounce((text: string) => {
      _search(text);
    }, 400),
  ).current;

  const _clearSearch = () => {
    if (searchText.length === 0) {
      Keyboard.dismiss();
    }
    setSearchText('');
    setSearchedText('');
    // 清空时取消待执行的搜索任务
    delayedSearch.cancel();
  };

  const _search = (text: string) => {
    setSearchedText(text);
  };

  // 空格规范化:仅合并连续空格、移除首尾空格,允许单个间隔空格
  const removeExtraSpace = (s: string) => s.trim().split(/ +/).join(' ');

  // 校验是否包含至少一个大小写字母
  const hasAtLeastOneLetter = (s: string) => /[a-zA-Z]/.test(s);
  // 如果需要支持中文等其他语言的字符,可以替换正则为 /\p{L}/u

  const _onSearchChange = (text: string) => {
    const processedText = removeExtraSpace(text);
    setSearchText(processedText);
    // 先取消之前排队的搜索任务
    delayedSearch.cancel();
    
    if (hasAtLeastOneLetter(processedText)) {
      // 符合条件才触发搜索
      delayedSearch(processedText);
    } else {
      // 不符合条件清空搜索结果
      setSearchedText('');
    }
  };

  return (
    <Container>
      <SearchBar
        text={searchText}
        onClearText={_clearSearch}
        onChangeText={_onSearchChange}
      />

      <ProductSearchResult
        queryString={searchedText}
      />
    </Container>
  );
};

export default SearchScreen;

内容的提问来源于stack exchange,提问作者user12494839

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 00:09:01