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

React toggle组件设置初始唯一默认状态/类且保留原有切换功能的问题

解决思路

现有逻辑用布尔值控制类名切换,只有两种状态,无法区分「未触发点击的初始状态」和「点击后收起状态」,我们只需要给state新增第三种初始状态,调整类名判断规则即可,原有点击切换逻辑可以完全保留,不会破坏现有功能。

具体修改点

  1. 将expandedTray的初始值从false改为null,用来标记从未触发过点击的初始状态
  2. 调整类名拼接逻辑,expandedTray为null时渲染默认类,其他情况按原有规则切换expanded-tray/minimize-tray

修改后完整代码

class ToggleIt extends Component {
  constructor(props) {
    super(props)
    this.state = {
      // 初始值改为null,标记未触发过点击
      expandedTray: null,
    }
    this.toggleExpandedTray = this.toggleExpandedTray.bind(this);
  }
  toggleExpandedTray() {
    // 原有切换逻辑不用改:!null = true,第一次点击默认切到展开状态,后续正常反转
    this.setState({ expandedTray: !this.state.expandedTray, });
  }
  render() {
    return (
        <div
          // 新增初始状态判断,default-tray可以替换成你需要的默认类名
          className={`something--isi-tray ${this.state.expandedTray === null ? 'default-tray' : this.state.expandedTray ? 'expanded-tray' : 'minimize-tray'}`}
          onClick={this.toggleExpandedTray}
        >
          <div className="something--isi-tray__content">
              <h3>{this.props.mainHeadingTitle}</h3>
           <div
                 data-rte-editelement
                 dangerouslySetInnerHTML={{
              __html: DOMPurify.sanitize(this.props.isiContent)
           }}
           />
          </div>
      </div>
    )
  }
}

如果需要第一次点击默认切到收起状态,只需要把toggle函数的逻辑改成this.setState({ expandedTray: this.state.expandedTray === null ? false : !this.state.expandedTray })即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 01:18:03