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

React中如何在嵌套组件和map循环场景下使用clsx

解决方案

完全可以用clsx解决该场景的需求,clsx本质是纯函数,无需固定在组件顶层调用,你可以在能访问到目标变量的任意作用域内调用。

两种常用实现方式

1. 直接内联调用clsx

如果类名逻辑比较简单,直接在className属性内调用即可,可同时组合全局状态、循环项变量、render props返回的open变量:

return ( 
  <div>
    <button onClick={doSomething}>{isOpened ? <Component1 /> : <Component2 />}</button>
    <div className={clsx(containerClasses)}>
        {myData.map((item, index) =>
          <OuterComponent as='div' key={item.name}>
            {({ open }) =>
              <>
                <InnerComponent
                  className={clsx(
                    'inner-base-class', // 固定类名
                    {
                      'inner-open': open, // 基于render props返回的open判断
                      'inner-closed': !open,
                      'global-active': isOpened, // 基于全局state判断
                      'item-highlight': item.isPriority // 基于循环的单个item判断
                    }
                  )}
                >
                {/* 剩余组件逻辑 */}

2. 回调内先定义类名配置再调用

如果类名逻辑复杂,可以在render props的回调作用域内先定义类名配置,再传入clsx,可读性更好:

{({ open }) => {
  // 该作用域可直接访问open、当前循环item、全局isOpened等所有可用变量
  const innerClassConfig = {
    'inner-base': true,
    'active': open,
    'disabled': item.disabled,
    'global-expanded': isOpened
  }
  return (
    <>
      <InnerComponent
        className={clsx(innerClassConfig)}
      >
      {/* 其他组件逻辑 */}
    </>
  )
}}

补充说明

clsx会自动过滤所有假值(false、undefined、null、空字符串等),你可以放心传入任意条件判断的类名组合,无需额外处理无效值。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 20:09:04