首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >这行代码`技能:{ ...this.state.skills,[name]:checked }`是什么意思?

这行代码`技能:{ ...this.state.skills,[name]:checked }`是什么意思?
EN

Stack Overflow用户
提问于 2021-09-17 13:02:57
回答 1查看 20关注 0票数 0
代码语言:javascript
复制
   class App extends React.Component {
  
    state = {
    firstName: "",
    lastName: "",
    email: "",
    country: "",
    tel: "",
    dateOfBirth: "",
    favoriteColor: "",
    weight: "",
    gender: "",
    file: "",
    bio: "",
    skills: {
      html: false,
      css: false,
      javascript: false,
    },
  };

  handleChange = (e) => {
     
    const { name, value, type, checked } = e.target;
    console.log(e)
   

    if (type === "checkbox") {
      
      this.setState({
        skills: { ...this.state.skills, [name]: checked },
      });
      
    } else if (type === "file") {
      console.log(type, "check here");
      this.setState({ [name]: e.target.files[0] });
    } else {
      this.setState({ [name]: value });
    }
    console.log(this.state.skills)
  };

这一行是做什么的?

代码语言:javascript
复制
skills: { ...this.state.skills, [name]: checked }

...this.state.skills可能正在使用扩展操作符复制对象,但我不知道[name]: checked的含义,它的目的是将技能obj中的键值更改为true,但我不知道它是如何实现的。

EN

回答 1

Stack Overflow用户

发布于 2021-09-17 13:05:50

这是一个非常好的问题,下面的内容很多。所以这是学习新东西的好机会。

代码语言:javascript
复制
skills: { ...this.state.skills, [name]: checked } 

命名属性

通常我们使用obj = { "abc": 3 },但是如果"abc“存储在一个变量name中呢?这就是这个[name]发挥作用的原因。否则我们不得不做obj[name] = 3,这需要额外的努力。还要注意它与obj["name"] = 3之间的区别。这两个版本非常不同。

扩展运算符

如果我们对一个对象执行a = b,它不会为a创建新的内存。

为了创建一个新的a,我们执行a = { ...b }。它从b中取出所有一级属性,并将它们借用到a的新内存空间中。本质上,扩展运算符意味着一个新变量。

但是,只有a是一个新变量,您从b借用的任何东西都不会重新创建,除非它们是原始变量。所以我们不能称扩散算子为深度拷贝。也许我们称它为肤浅的抄袭,我不知道正确的名称;)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69223907

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档