ChatGPT解决这个技术问题 Extra ChatGPT

具有动态键名的 Reactjs setState()?

编辑:这是重复的,请参阅 here

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

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

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

这是有关动态对象键的任何问题的副本。不具体反应
var newstate = {};新状态[event.target.id] = event.target.id; this.setState(newstate);
谢谢,我一般没有很好地使用对象。
@trad 我遇到了这个问题,但是,你在你的初始状态上放了什么?没关系,对吧?

D
Daniel Ruf

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

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

    this.setState( stateObject );    
},

如果使用 ES6 或 Babel transpiler 转换您的 JSX 代码,您也可以使用 computed property names 完成此操作:

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
第二种方法会导致 WINdows(IE、Chrome)上的浏览器出现语法错误。有没有人注意到?
如何得到陈述?
感谢 trad,这是我为避免 <Radio /> 实现的代码重复而寻找的。
如果您使用这样的计算属性名称设置状态:this.setState({ [event.target.id]: event.target.value });,那么您将如何使用 this.state...... 访问该状态?
v
vikram jeet singh

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

例如:

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


[event.target.name] 周围的括号表示什么?为什么需要它们?
与通常的方法相比,像 this.setState({ userName: e.target.value }); 这样分别命名每个元素这会将表单的多个元素作为数组处理,无需设置每个单独的元素
但我仍然如何以同样的方式访问该状态?像 this.state([event.target.name])
我认为 MDN web docsthis post 解释了为什么我们需要括号。
s
sintaxi

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

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 不应该是这种情况。以后看看是什么问题!!
c
connect2Coder

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

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

M
Matthew Holtom

我有一个类似的问题。

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

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

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

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

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

j
javatar
this.setState({ [`${event.target.id}`]: event.target.value}, () => {
      console.log("State updated: ", JSON.stringify(this.state[event.target.id]));
    });

请注意引号字符。


正是我需要的。
谢谢你,它奏效了。但是,您能解释一下 [ ] 的作用吗?为什么 react 需要这个?
y
yanckst

.map 的循环中工作如下:

{
    dataForm.map(({ id, placeholder, type }) => {
        return <Input
            value={this.state.type}
            onChangeText={(text) => this.setState({ [type]: text })}
            placeholder={placeholder}
            key={id} />
    })
}

请注意 type 参数中的 []。希望这可以帮助 :)


C
Catalina

我一直在寻找一个漂亮而简单的解决方案,我发现了这个:

this.setState({ [`image${i}`]: image })

希望这可以帮助


J
Jujhar Singh

使用 ES6+,您只需执行 [${variable}]


R
Reinaldo EP

当给定元素是对象时:

handleNewObj = e => {
        const data = e[Object.keys(e)[0]];
        this.setState({
            anykeyofyourstate: {
                ...this.state.anykeyofyourstate,
                [Object.keys(e)[0]]: data
            }
        });
    };

希望它可以帮助某人


m
manoj patel

您的状态与字典更新一些键而不会丢失其他值

state = 
{   
    name:"mjpatel"  
    parsedFilter:
    {
      page:2,
      perPage:4,
      totalPages: 50,
    }
}

解决方案如下

 let { parsedFilter } = this.state
 this.setState({
      parsedFilter: {
        ...this.state.parsedFilter,
        page: 5
      }
  });

此处更新值为 5 的键“页面”的值


H
Hacı Celal Aygar

请试试这个。

状态在这里作为例子

 this.state = {
            name: '',
            surname: '',
            username: '',
            email: '',
  }

Onchange 功能在这里。

onChangeData = (type, event) => {
    const stateData = this.state;
    if (event === "" || event === "Seçiniz")
        stateData[type] = undefined
    else
        stateData[type] = event

    this.setState({ stateData});
}

s
sta

可以使用扩展语法,如下所示:

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

React 会为你合并对象,这是不好的做法。
基本上,如果您有一些内部对象并且您想更改该内部对象的一个属性,您可以这样做: this.setState({selectedItems:{...selectedItems,[item.id]:true}})
@Rohmer:为什么这被认为是不好的做法?如果一个对象有多个键,使用扩展运算符似乎可以保留所有其他键,除了被修改的键。还是我们应该使用 prevState ?请解释。
如果您有像 @EranOr 提到的嵌套状态,那么进行传播是有意义的,但您必须使用 prevState 否则您将无法保证您使用的是最新状态。但是,如果您只是像@sta 的答案那样设置一个单一的顶级状态值,那么您不需要传播状态,因为 React 会为您合并它。 reactjs.org/docs/…