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

如何将NavLink的isActive属性直接传递给其子组件?

问题分析与解决方案

你遇到的渲染错误,根源是在NavLink的style回调里调用setActive——这个回调的作用是返回样式对象,而你在这里触发状态更新,会导致组件反复重渲染,形成循环。

完全不需要额外维护active状态,NavLink支持通过children函数直接获取isActive状态,直接传给子组件就行:

function NavigationLink({ to, title, exactPath, Icon }) {
  const resolved = useResolvedPath(to);
  const match = useMatch({
    path: resolved.pathname,
    end: exactPath,
  });

  return (
    <StyledNavLink linkSelected={match}>
      <NavLink to={to}>
        {/* 用children函数接收isActive参数 */}
        {({ isActive }) => (
          <>
            <Title>{title}</Title>
            <SelectedContainerIcon active={isActive}>
              <Icon />
            </SelectedContainerIcon>
          </>
        )}
      </NavLink>
    </StyledNavLink>
  );
}

另外,你已经通过useMatch拿到了match值,如果match和isActive是等价的(通常情况是一致的),甚至可以直接把match传给SelectedContainerIcon,省掉NavLink内部的状态判断:

function NavigationLink({ to, title, exactPath, Icon }) {
  const resolved = useResolvedPath(to);
  const match = useMatch({
    path: resolved.pathname,
    end: exactPath,
  });

  return (
    <StyledNavLink linkSelected={match}>
      <NavLink to={to}>
        <Title>{title}</Title>
        <SelectedContainerIcon active={!!match}>
          <Icon />
        </SelectedContainerIcon>
      </NavLink>
    </StyledNavLink>
  );
}

这两种写法都能避免状态更新导致的循环渲染问题,直接把激活状态传给子组件。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 20:26:16