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

React Todo List应用搜索框内容更新时的条件渲染实现问题

React To Do List 搜索过滤功能实现方案

现有代码问题

  • 正则创建逻辑错误:使用new RegExp()构造函数时不需要手动添加左右斜杠,你写的"/" + searchValue + "/gt"会把斜杠也识别为匹配规则的一部分,同时gt是无效正则标志位,常规搜索场景只需添加i标志即可实现忽略大小写匹配。
  • 不符合React最佳实践:不建议将JSX元素存入state,更合理的做法是state仅存储原始待办数据、搜索关键词,渲染时动态计算匹配列表,性能更优且便于维护。

修正方案

首先添加正则特殊字符转义逻辑,避免用户输入.+*?[]()等正则保留字符时触发语法错误:

const escapeRegExp = (str) => str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');

在组件渲染前动态计算匹配的待办列表:

// 假设搜索关键词已存储在searchValue state中
const getFilteredList = (list) => {
  const trimedSearch = searchValue.trim()
  // 搜索值为空时返回全部内容
  if (!trimedSearch) return list
  const searchRegex = new RegExp(escapeRegExp(trimedSearch), 'i')
  return list.filter(item => searchRegex.test(item.title))
}

const filteredItems = getFilteredList(items)
const filteredDeletedItems = getFilteredList(deletedItems)

渲染环节直接使用过滤后的数组即可,无需调用setContent存储JSX:

return (
  <div>
    {/* 搜索输入框,绑定onChange事件更新searchValue */}
    <input
      type="text"
      placeholder="搜索待办事项"
      value={searchValue}
      onChange={e => setSearchValue(e.target.value)}
    />

    {filteredItems.map(item => (
      <ToDoPane
        key={item.id}
        item={item}
        delFunc={deleteItem}
        done={addToDeletedItems}
        edit={editItem}
      />
    ))}

    <div className="doneWalaDiv">
      {filteredDeletedItems.map(item => (
        <ToDoPane
          key={item.id}
          item={item}
          delFunc={deleteFromDeletedItems}
          done={addItem}
          edit={editItem}
          type="checked"
        />
      ))}
    </div>
  </div>
)

如果需要严格区分大小写匹配,删除RegExp构造函数的第二个参数i即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 18:27:02