【问题标题】:How to update the React state when a parameter of the state is a Map?当状态的参数是 Map 时如何更新 React 状态?
【发布时间】:2021-05-20 15:10:41
【问题描述】:

我的应用中的 React 组件的状态属于以下类型:

interface ComponentState {
    messages: Map<string, Messages[]>;
}

如何使用 setState 更新组件的状态?

我尝试了以下操作,但是它将 messagesMap 更改为 Object。此外,TypeScript 不会捕获以下内容。

this.setState((prevState) => ({
    messages: {
        ...prevState.messages,
        [someKeyAsString]: someValue,
    }
}));

有没有办法使用Map 作为状态属性并使用setState 以正确的方式更新它,并且也不会将参数的类型从Map 更改为Object

【问题讨论】:

    标签: javascript reactjs typescript dictionary redux


    【解决方案1】:

    虽然在 React 中使用 Map 是可能,但这很奇怪,因为克隆它所需的代码很复杂 - 你必须将 Map 转换为一个条目数组,然后添加额外的条目,然后将其转回 Map:

    this.setState((prevState) => ({
        messages: new Map([
          ...(prevState.messages.entries()),
         ['someKeyAsString', 'someValue']
        ])
    }));
    

    我强烈建议使用普通对象。

    【讨论】:

    • 由于任何性能原因,这种方法是否不好?
    • 我的 Map 中键的数量相当少,但是 Message[] 列表可能很大..
    • 呃,既然您使用的是 React,那么无论如何都无法为所有消息创建一个新容器。问题不在于性能影响,而在于代码的丑陋。
    • 替代语法:messages: new Map(prevState.messages).set('someKeyAsString', 'someValue')
    猜你喜欢
    • 2016-10-06
    • 1970-01-01
    • 1970-01-01
    • 2021-12-26
    • 2019-06-13
    • 2020-08-07
    • 2021-01-14
    • 2022-11-28
    • 1970-01-01
    相关资源
    最近更新 更多