不可变列表的映射仅更新最后一个索引
Posted
技术标签:
【中文标题】不可变列表的映射仅更新最后一个索引【英文标题】:Map of immutable list is only updating the last index 【发布时间】:2021-07-27 21:03:55 【问题描述】:我有这个声明:
const players = immutable.fromJS(
enabled: true,
contract,
)
我有一个复选框,基本上将enabled
切换为true/false
。
我现在也有“全部启用”复选框:
playerKeys && playerKeys.map((playerKey, i) =>
players.set(playerKey, players.get(playerKey).set('enabled', e.target.checked))
)
我不确定我在使用这个函数时做错了什么,但它只会更改列表的最后一个索引。
有没有办法修复我的“全部启用”复选框,以便更新我列表中的所有项目?
【问题讨论】:
【参考方案1】:我有几乎相似的经历,但在我的情况下,直到我意识到什么都没有更新:更新不可变 Map 或 List 会返回另一个不可变 Map 或 List,不会修改原始 List 或 Map。显然这就是不可变的意思。
所以首先你应该创建 players
变量,然后
playerKeys && playerKeys.map((playerKey, i) =>
players = players.get(playerKey).set('enabled', e.target.checked)
)
这应该是理想的工作!
【讨论】:
【参考方案2】:你在设置一个值的同时设置一个值,你可能只是漏掉了一个“)”
players.set(playerKey, player.get(playerKey).set('enabled', e.target.checked))
这条指令 players.get(playerKey).set('enabled', e.target.checked) 不返回任何内容,因此您没有为父函数设置任何内容player.set
[编辑]
playerKeys && playerKeys.map((playerKey, i) =>
players.get(playerKey).set('enabled', e.target.checked)
)
【讨论】:
即使我使用 forEach 也一样 @ajbee 更新了答案。如果触发了 e.target.checked,只需将 event.target 的值设置为列表。无需从玩家那里获取价值,因为价值是绝对的,您想将其应用于所有玩家以上是关于不可变列表的映射仅更新最后一个索引的主要内容,如果未能解决你的问题,请参考以下文章