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

React中基于isManager状态实现侧边栏列表条件渲染的问题

核心注意点

不要直接使用splice处理原links数组,splice是原地修改方法,会污染原数组导致其他依赖该数组的逻辑出错,更推荐使用非原地修改的slice方法实现截取需求。如果必须用splice,需要先拷贝一份原数组再操作。

实现方式(两种可选)

方式1:直接在JSX表达式内处理(适合逻辑简单的场景)

直接在map调用前通过三元运算对数组做条件处理,修改原代码中map的调用主体即可:

return (
    <div className="flex-item--fill flex--column scops-sidebar-content-container">
      <ul>
        {/* 三元运算先处理要遍历的数组,再执行map渲染 */}
        {(isManager ? links : links.slice(0, links.length - 3)).map((link) => (
          <li
            key={link.id}
            className="pad-half--left"
            style={{
              backgroundColor: `${
                activeTabId === link.id ? '#4065d0' : 'var(--color-primary)'
              }`,
            }}
          >
            <button
              className="btn--plain full-width align--left unpad"
              style={{ color: 'white' }}
              onClick={(e) => tabHandler(e, link.id)}
            >
              {link.name}
            </button>
          </li>
        ))}
      </ul>
    </div>
  );

方式2:提前在return外计算待渲染数组(推荐,可读性更高)

把数组处理逻辑提前放到组件return语句之前,JSX部分只负责渲染,代码更易维护:

// return 之前添加这行逻辑
const renderLinks = isManager ? links : links.slice(0, links.length - 3);

return (
    <div className="flex-item--fill flex--column scops-sidebar-content-container">
      <ul>
        {/* 直接遍历提前处理好的数组即可 */}
        {renderLinks.map((link) => (
          <li
            key={link.id}
            className="pad-half--left"
            style={{
              backgroundColor: `${
                activeTabId === link.id ? '#4065d0' : 'var(--color-primary)'
              }`,
            }}
          >
            <button
              className="btn--plain full-width align--left unpad"
              style={{ color: 'white' }}
              onClick={(e) => tabHandler(e, link.id)}
            >
              {link.name}
            </button>
          </li>
        ))}
      </ul>
    </div>
  );

补充说明

如果必须使用splice实现,需要先对原数组做浅拷贝避免修改原数据,写法如下:

// 拷贝数组后再用splice截取,splice第二个参数是截取长度,这里取总长度减3
const renderLinks = isManager ? links : [...links].splice(0, links.length - 3);

内容的提问来源于stack exchange,提问作者fra.mstr

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 01:09:02