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

React TypeScript 中如何为State对象设置默认选中首个元素的初始值

解决方案

静态配置场景(你的当前代码属于该场景)

初始化useState时无法直接引用还未完成创建的state内部属性,只需要把固定的按钮配置抽为独立常量,即可直接取首项作为默认激活值,同时可以删掉每个配置项里重复的点击逻辑,精简后代码如下:

import React from 'react';

interface ActiveObject {
    id: number;
    title: string;
};

// 抽离静态按钮配置常量
const BUTTON_CONFIG: ActiveObject[] = [
    { id: 1, title: '1 Week' },
    { id: 2, title: '1 Month' },
    { id: 3, title: '3 Months' }
];

interface ButtonGroupState {
    // 确认数组永远非空可以去掉null类型,否则保留
    activeObject: ActiveObject;
    objects: ActiveObject[];
};

const ButtonGroup: React.FunctionComponent = () => {
    // 初始化时直接用常量首项作为默认激活对象
    const [active, setActive] = React.useState<ButtonGroupState>({
        activeObject: BUTTON_CONFIG[0],
        objects: BUTTON_CONFIG
    })

    const toggleActiveStyles = (index: number) => {
        return active.objects[index] === active.activeObject ? "btn-active" : "btn-plain"
    }

    return (
        <div className="wrapper">
            {active.objects.map((inner, index) => 
                <button 
                    type="button" 
                    className={toggleActiveStyles(index)} 
                    // 点击逻辑统一处理,不用冗余存储在每个配置项中
                    onClick={() => setActive({ ...active, activeObject: active.objects[index] })} 
                    key={inner.id}
                >
                    {inner.title}
                </button>
            )}
        </div>
    )
}

export default ButtonGroup;

如果你的配置数组可能为空,保留activeObject: ActiveObject | null的类型定义即可,初始化时写activeObject: BUTTON_CONFIG[0] ?? null做兜底。

动态配置场景(如果objects是异步获取的动态数据)

如果你的objects数组是接口请求等方式动态生成的,可以加useEffect监听数组变化,自动设置首项为默认激活值:

React.useEffect(() => {
  if (active.objects.length && !active.activeObject) {
    setActive(prev => ({
      ...prev,
      activeObject: prev.objects[0]
    }))
  }
}, [active.objects])

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 05:27:04