【问题标题】: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))
        })

我不确定我在使用这个函数时做错了什么,但它只会更改列表的最后一个索引。

有没有办法修复我的“全部启用”复选框,以便更新我列表中的所有项目?

【问题讨论】:

    标签: javascript reactjs typescript immutability immutable.js


    【解决方案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 的值设置为列表。无需从玩家那里获取价值,因为价值是绝对的,您想将其应用于所有玩家
      猜你喜欢
      • 2010-11-22
      • 1970-01-01
      • 2017-03-11
      • 2014-11-09
      • 2021-10-06
      • 2017-12-29
      • 2012-11-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多