在使用React时,会经常需要处理state里边设置的初始值以达到我们的实际需求,比如从接口获取到列表数据后要赋值给定义的列表初始值,然后数据驱动view视图进而呈现在我们眼前,这种最简单的赋值方式实现起来也很简单,如下:

this.setSate({
listData: res.data
})

其实VUE实现起来更简单,直接写成this.listData = res.data即可,这里不做过多vue的赘述。

那么在使用React时你有没有想过如果是给一个数组中的某一项重新赋值呢?如果给一个Object对象中的某一项单独重新赋值呢?还会这么简单吗?往下看。

this.state = {
listData: [
{name: "小坏", age: "20"},
{name: "小不", age: "21"},
],
obj: {
name: "小坏",
age: "22",
}
}

类似这种的,如果我只想修改listData数组第二项中的name值呢?如果我只想修改obj中的age值呢?最开始的那种赋值方法已经不能用了,否则会报错的。比如:

this.setSate({
listData[1].name: "陈小坏",
obj.age: 21
})

这种写法连编译都不能通过,更不用说将代码跑起来了,看图说话:

那么究竟该如何实现呢?

首先this.setSate({})赋值时,其中的key不接受类似listData[1].name的格式,只能是类似name或其他我可能还不知道的的格式,其次其中的value值也是要获取到相对应的key才能正确赋值。

具体实现代码:

change = (index) => {
const listData = [...this.state.listData]; //复制数组--浅拷贝
const obj = Object.assign({}, this.state.obj, { age: "21" }); this.setState({
listData: listData.map((item, idx) => idx === index ? {...item, name: "陈小坏"} : item),
obj: obj,
})
}

这才是这种特殊赋值方法的正确打开方式。

其中Object.assign()方法用于将所有可枚举属性的值从一个或多个源对象复制到目标对象并返回目标对象。如果目标对象中的属性具有相同的键,则属性将被源对象中的属性覆盖。后面的源对象的属性将类似地覆盖前面的源对象的属性。

{...item, name: "陈小坏"}中的三个点(...)是扩展运算符,它用于取出参数对象中的所有可遍历属性并拷贝到当前对象之中,在这里的作用就是将listData中的item展开,然后将name: "陈小坏"合并到对应的item中,相当于Object.assign({}, item, { name: "陈小坏" , age: 21})

还是再说一句VUE吧,VUE在这里实现起来就很简单,具体实现方式就不再赘述!

本文参考:

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/assign

https://www.jianshu.com/p/2b0929b66785

https://blog.csdn.net/qq_29819449/article/details/80435435

React修改state(非redux)中数组和对象里边的某一个属性的值的更多相关文章

  1. 小程序中监听textarea或者input输入的值动态改变data中数组的对象的值

    Page({ data: { todoLists:[ { detail:"", date:"", location:"", priority ...

  2. 小程序开发之改变data中数组或对象的某一属性值

    前言:在小程序的开发中,我们在view中便利data中数组或对象时,很多情况下需要在js中动态改变数组或者对象中某一香的属性值. 效果图: 我给大家总结了案例如下:   wxml如下: <scr ...

  3. python 四种方法修改类变量,实例对象调用类方法改变类属性的值,类对象调用类方法改变类属性的值,调用实例方法改变类属性的值,直接修改类属性的值

    三种方法修改类变量,实例对象调用类方法改变类属性的值,类对象调用类方法改变类属性的值,调用实例方法改变类属性的值,类名就是类对象,city就是类变量, #coding=utf-8 class empl ...

  4. 表单配置项写法,表单写成JSON数组套对象,一行是一个数组单位,一列是一个对象单位,然后再写一个公共组件读取这个配置,循环加载slot,外层载入slot的自定义部分,比如input select等,这种写法就是把组件嵌套改为配置方式

    表单配置项写法,表单写成JSON数组套对象,一行是一个数组单位,一列是一个对象单位,然后再写一个公共组件读取这个配置,循环加载slot,外层载入slot的自定义部分,比如input select等,这 ...

  5. 关于props和state以及redux中的state

    React的数据模型分为共有数据和私有数据,共有数据可以在组件间进行传递,私有数据为当前组件私有.共有数据在React中使用props对象来调用,它包含标签所有的属性名称和属性值,props对象有三个 ...

  6. react 修改state某一属性值

    1.state // 筛选框相关数据 searchSelect: { term: { value: '学期', key: '', options: [] }, type_of_personnel: { ...

  7. JavaScript中数组和对象的使用例程

    JavaScript数组 下面的代码创建名为 cars 的数组: //方式一: var cars = new Array(); cars[0] = "Volvo"; cars[1] ...

  8. java中数组是不是对象?

    [转自知乎]:http://www.zhihu.com/question/26297216 JAVA中的数组是对象吗? public class test { public static void m ...

  9. js中数组和对象的合并

    1 数组合并 1.1 concat 方法 1 2 3 4 var a=[1,2,3],b=[4,5,6]; var c=a.concat(b); console.log(c);// 1,2,3,4,5 ...

随机推荐

  1. Could not find a package configuration file provided by "Qt5Widgets"

    解决: sudo apt install qttools5-dev

  2. Visual Studio - File Properties (Build Action, Copy to Output Directory)

    Ref: MSDN (https://docs.microsoft.com/en-us/previous-versions/visualstudio/visual-studio-2010/0c6xyb ...

  3. AttributeError: 'module' object has no attribute 'enableTrace'

    Traceback (most recent call last): File "Long-lived-connection.py", line 29, in <module ...

  4. JUC--volatiley&CAS

    public class VolatileTest { public static void main(String[] args) { ThreadDemo td = new ThreadDemo( ...

  5. node 创建

    下载 node : 注意选项 ADD PATH 配置环境变量 node -v npm -v 检查创建一个服务器 : //创建一个服务器 127.0.0.1:8888 var http = requir ...

  6. LoadRunner HTTP+Json 接口性能测试

    接口的请求参数和返回结果均是JSON字符串,请求可以用POST或者GET方法.先说GET方法: 一.GET方法测试 Insert - New step -选择Custom Request - web_ ...

  7. powermock单元测试小结

    最近时不时的需要单元测试来写覆盖率.简单总结一下日常心得: 1.首先指明需要测试的类:@PrepareForTest({ RewardGoldServiceImpl.class }) 2.其次在测试类 ...

  8. react安装 项目构建

    1.nodejs安装 下载安装包,解压.如果是已编译文件,在/etc/profile中设置PATH(/etc/profile文件中的变量设置,所有用户可用,但需求重启服务器),并source /etc ...

  9. Flink写入kafka时,只写入kafka的部分Partitioner,无法写所有的Partitioner问题

    1. 写在前面 在利用flink实时计算的时候,往往会从kafka读取数据写入数据到kafka,但会发现当kafka多个Partitioner时,特别在P量级数据为了kafka的性能kafka的节点有 ...

  10. 《连载 | 物联网框架ServerSuperIO教程》- 17.集成Golden实时数据库,高并发保存测点数据。附:3.4 发布与版本更新说明。

    1.C#跨平台物联网通讯框架ServerSuperIO(SSIO)介绍 <连载 | 物联网框架ServerSuperIO教程>1.4种通讯模式机制. <连载 | 物联网框架Serve ...