数组的不变性更新助手中的动态键

tir*_*adc 33 javascript ecmascript-6 reactjs

https://facebook.github.io/react/docs/update.html

我有一个更新函数,它接收索引以及事件,以便更改数组中该特定项的值.

index在这种情况下,如何评估而不是将其视为集合键?它甚至可能吗?

updateValue: function(index, e) {
  var items = React.addons.update(this.state.items, {
   index: {
     amount: {$set: e.target.value}
   }
  });
  this.setState({
    items: items
  })
}
Run Code Online (Sandbox Code Playgroud)

现在这显然不起作用,因为this.state.items['index']['amount']当我想修改this.state.items[1]['amount']索引为1 时,它正在尝试更新未设置的内容.

Jon*_*nan 44

您可以使用ES6计算的属性名称,这与您的index变量看起来如下:

updateValue(index, e) {
  var items = React.addons.update(this.state.items, {
    [index]: {
      amount: {$set: e.target.value}
    }
  })
  this.setState({items})
}
Run Code Online (Sandbox Code Playgroud)

根据这个ES6兼容性表,当它的Harmony转换被启用时,React的JSX转换器支持它们,或者你可以使用Babel(因为反应工具正在被弃用,无论如何都支持Babel).

如果不这样做,您可以使用辅助函数来创建具有给定命名属性的对象:

function makeProp(prop, value) {
  var obj = {}
  obj[prop] = value
  return obj
}

// ...

updateValue: function(index, e) {
  var items = React.addons.update(this.state.items, makeProp(
    index, {
      amount: {$set: e.target.value}
    }
  ))
  this.setState({items: items})
}
Run Code Online (Sandbox Code Playgroud)

  • 我对辅助函数示例感到困惑.`this.state.items`是一个数组,你将它更新为`{1:{amount:$ set:e.target.value}}`.我还在学习更新插件是如何工作的,但在我看来这应该不起作用.假设它以某种方式工作,他不能刚刚完成`更新(this.state.items [index],{amount:{$ set:e.target.value}})`?更新是否有一些特殊情况允许这个工作? (2认同)