如何简化反应js中的状态长度

Posted

技术标签:

【中文标题】如何简化反应js中的状态长度【英文标题】:how to simplify the length of the state in react js 【发布时间】:2021-11-03 05:06:42 【问题描述】:
import  OrderSummary  from "@/services/order/data";

以下是我的状态声明

let [orderSummary, setOrderSummary] = useState<OrderSummaryResponse>(
    Id: 0,
    TableId: 0,
    TableName: '',
    MerchantId: 0,
    StoreId: 0,
    StoreName: '',
    BrandName: '',
    IsUnifyQR: false,
    Discount: 0,
    ServiceCharge: 0,
    GST: 0,
    RoundingAdjustment: 0,
    TotalAmount: 0,
    SubTotalAmount: 0,
    ServiceChargeAmount: 0,
    GSTAmount: 0,
    CreatedAt: '',
    Items: [
        
            MerchantId: 0,
            StoreId: 0,
            StoreName: '',
            ItemId: 0,
            ProductId: 0,
            ProductName: '',
            TotalAmount: 0,
            Quantity: 0,
            Note: '',
            Choices: [
                
                    OptionSelectedName: '',
                    ProductOptionId: 0,
                    OptionSelected: null,
                    MultiOptionsSelected: null,
                    OneChoiceWithValueSelected: 
                        OptionSelected: 0,
                        Quantity: 0,
                        Price: 0,
                    ,
                    MultioptionWithValueSelected: [],
                ,
            ],
        ,
    ],
    Categories: [''],
);

如果我有几个像上面那样的usestate,我的代码看起来很长,如何简化它。

如果我这样使用会出错

let [orderSummary, setOrderSummary] = useState<OrderSummary>()

【问题讨论】:

您的OrderSummary 是类型还是实际对象? 【参考方案1】:
let [orderSummary, setOrderSummary] = useState<OrderSummary>( as any)

【讨论】:

上面的代码正在运行,但是当我从响应中获取一些详细信息时出现错误(未捕获的类型错误:无法读取未定义的属性“长度”),当我尝试这样时 - orderSummary.Items.length,如果我评论这部分它的工作,但我需要检查项目。长度 您应该使用可选链来访问您的属性,例如 orderSummary.Items?.length 以防止 orderSummary 或 orderSummary.items 为 null 或未定义。 那是因为 orderSummary 在 api fetch 完成之前没有 items 属性。 另一种方法是为你将首先使用的属性设置初始值,像这样let [orderSummary, setOrderSummary] = useState&lt;OrderSummary&gt;( Items: [] as any) useState&lt;OrderSummary&gt;( Items: [] as any) - 正在工作,谢谢...【参考方案2】:

你可以像这样使用类型:

let [orderSummary, setOrderSummary] = useState<OrderSummary | null>(null)

当你想使用orderSummary。您可以像这样添加optional chaining

orderSummary?.StoreId

【讨论】:

如果我使用上面的代码得到错误--类型''上不存在属性'StoreId'。 我得到相同的@Viet 现在出现 TypeError: Cannot read property 'StoreId' of null",我按照下面的代码,现在可以工作了,谢谢你的支持。

以上是关于如何简化反应js中的状态长度的主要内容,如果未能解决你的问题,请参考以下文章

如何访问在另一个 js 文件中的反应挂钩中完成的状态值

如何将状态值从一个组件访问到位于单独文件中的其他功能(不是组件)?反应js

在反应js中的TextField中放置长度约束

基于api调用的反应js中的按钮不改变状态

如何正确更新反应钩子状态中的数组

如何根据反应中的状态属性对数组中的元素进行分组?