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

React Native TypeScript点击Add自动生成带序号键的路由对象

修改方案

总共调整3处核心逻辑:类型定义、初始状态值、新增方法,同时修复原有onAdd的语法问题。

  • 第一步:调整类型定义
    保留原有单条路由详情的IRoute结构,新增数组元素的包装类型,匹配「数字序号为键、路由对象为值」的存储结构:
// 单条路由详情结构保持原有定义不变
export interface IRoute {
  amount?: string;
  id?: number;
  location?: string
}

// 新增:路由数组元素的包装类型,key为从0开始递增的数字序号
type TRouteItem = {
  [key: number]: IRoute
}
  • 第二步:修正初始状态
    初始第一条路由需要套上序号0的键包装,同时把useState的泛型从IRoute[]改成TRouteItem[],和实际存储结构对齐:
export const initialRoute: IRoute = {
  amount: '',
  id: 0,
  location: ''
}

// 泛型改为TRouteItem[],初始值套上0序号的外层包装
const [route, setRoute] = useState<TRouteItem[]>([{0: initialRoute}]);
  • 第三步:重写onAdd新增逻辑
    原onAdd存在语法错误(未调用setRoute、存在冗余text属性、未用函数式更新易拿到陈旧状态),修改后直接取当前数组长度作为下一个序号(数组长度和已有元素的最大序号刚好差1,比如已有2个元素对应序号0、1,下一个序号就是2,天然保证递增不重复),新项按{[序号]: 路由对象}的结构组装后追加到数组:
const onAdd = () => {
  setRoute(prevState => {
    // 当前数组长度即为下一个元素的序号
    const nextIndex = prevState.length;
    // 替换为实际业务需要的路由字段值即可
    const newRouteItem: IRoute = {
      amount: '54',
      id: nextIndex,
      location: 'Test'
    }
    // 新项套上序号键后追加到数组末尾
    return [...prevState, {[nextIndex]: newRouteItem}]
  })
}

修改后点击Add生成的数组结构和预期完全一致,且函数式更新的写法可以规避闭包导致的状态陈旧问题,不会出现序号重复。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 09:39:57