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

React如何让图标与HighlightSearch组件内容在同一帧渲染?

解决图标与高亮文本不同步渲染的问题

问题根源

你遇到的延迟是因为HighlightSearch里的useEffect是组件挂载/更新完成后才执行的:第一次渲染时,组件先输出空的(或未处理的)内容,等useEffect跑完高亮逻辑、更新state后才会触发二次渲染,所以文本会比图标晚出现。

解决方案:同步计算高亮内容

把高亮处理逻辑从useEffect移到渲染阶段,让文本和图标在同一次渲染中生成:

基础版(同步计算)

修改HighlightSearch组件,直接在渲染时生成高亮后的HTML字符串:

function HighlightSearch({ query, children }) {
  let highlightedText = children;
  
  if (query) {
    // 生成匹配查询的正则,全局不区分大小写
    const regex = new RegExp(`(${query})`, 'gi');
    // 替换匹配内容为高亮标签
    highlightedText = children.replace(regex, '<span class="highlight">$1</span>');
  }

  return <span dangerouslySetInnerHTML={{ __html: highlightedText }} />;
}

优化版(缓存计算结果)

如果文本很长或正则逻辑复杂,用useMemo缓存计算结果,避免重复计算:

import { useMemo } from 'react';

function HighlightSearch({ query, children }) {
  const highlightedText = useMemo(() => {
    if (!query) return children;
    const regex = new RegExp(`(${query})`, 'gi');
    return children.replace(regex, '<span class="highlight">$1</span>');
  }, [query, children]); // 只有query或children变化时才重新计算

  return <span dangerouslySetInnerHTML={{ __html: highlightedText }} />;
}

为什么这样可行?

同步计算(或useMemo缓存的计算)会在组件渲染的同步阶段完成,HighlightSearch会和SomeIcon一起输出内容,不会有二次渲染的延迟,自然就能实现同时渲染。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 17:06:05