Reactjs setState() 带有动态键名?

IT技术 javascript reactjs computed-properties
2021-02-02 08:10:29

编辑:这是重复的,请参见此处

我找不到在设置状态时使用动态键名的任何示例。这就是我想要做的:

inputChangeHandler : function (event) {
    this.setState( { event.target.id  : event.target.value } );
},

其中 event.target.id 用作要更新的状态键。这在 React 中是不可能的吗?

6个回答

感谢@Cory 的提示,我使用了这个:

inputChangeHandler : function (event) {
    var stateObject = function() {
      returnObj = {};
      returnObj[this.target.id] = this.target.value;
         return returnObj;
    }.bind(event)();

    this.setState( stateObject );    
},

如果使用 ES6 或Babel 转译器来转换您的 JSX 代码,您也可以使用计算属性名称来完成此操作

inputChangeHandler : function (event) {
    this.setState({ [event.target.id]: event.target.value });
    // alternatively using template strings for strings
    // this.setState({ [`key${event.target.id}`]: event.target.value });
}
如果您使用 bablejs 构建代码,那么还有一种新的语法。您可以使用computed property names
2021-03-25 08:10:29
谢谢trad,这就是我正在寻找的,以避免<Radio />实现代码重复
2021-03-26 08:10:29
第二种方法会导致 WINdows 上的浏览​​器(IE、Chrome)出现语法错误。有没有人注意到?
2021-04-05 08:10:29
如何得到陈述?
2021-04-06 08:10:29
如果您使用这样的计算属性名称设置状态:this.setState({ [event.target.id]: event.target.value });那么您将如何使用this.state......?
2021-04-07 08:10:29

当需要处理多个受控输入元素时,可以为每个元素添加一个name属性,让处理函数根据event.target.name的值来选择要做什么。

例如:

inputChangeHandler(event) {
  this.setState({ [event.target.name]: event.target.value });
}

与像 this.setState({ userName: e.target.value }); 这样单独命名每个元素的通常方法相比;这会将表单的多个元素作为数组处理,无需设置每个单独的元素
2021-03-17 08:10:29
但我仍然如何以相同的方式访问该状态?喜欢this.state([event.target.name])
2021-03-29 08:10:29
[event.target.name] 周围的括号表示什么?为什么需要它们?
2021-04-06 08:10:29
我认为MDN 网络文档这篇文章解释了为什么我们需要括号。
2021-04-11 08:10:29

我是如何做到这一点的...

inputChangeHandler: function(event) {
  var key = event.target.id
  var val = event.target.value
  var obj  = {}
  obj[key] = val
  this.setState(obj)
},
我做了类似的方法,但问题是它仍然没有渲染组件,我跑了柱子来发布(包括这个:D),并在某处发现了这个:this.forceUpdate();最新的 React 不应该是这种情况。稍后看看是什么问题!!
2021-04-09 08:10:29

我只是想补充一点,您还可以使用解构来重构代码并使其看起来更整洁。

inputChangeHandler: function ({ target: { id, value }) {
    this.setState({ [id]: value });
},

我有一个类似的问题。

我想设置第二级密钥存储在变量中的状态。

例如 this.setState({permissions[perm.code]: e.target.checked})

但是,这不是有效的语法。

我使用以下代码来实现这一点:

this.setState({
  permissions: {
    ...this.state.permissions,
    [perm.code]: e.target.checked
  }
});