在使用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. 学习笔记-ResNet网络

    ResNet网络 ResNet原理和实现 总结 一.ResNet原理和实现 神经网络第一次出现在1998年,当时用5层的全连接网络LetNet实现了手写数字识别,现在这个模型已经是神经网络界的“hel ...

  2. 搭建企业git代码版本管理所需工具

    此片文章纯属记录一下使用gitlab搭建私有git版本管理的一些工具及概念. 先记录一下概念 git         是一种版本控制系统,是一个命令,是一种工具 github   是一个基于git实现 ...

  3. 2018-2019-2 网络对抗技术 20165325 Exp3 免杀原理与实践

    2018-2019-2 网络对抗技术 20165325 Exp3 免杀原理与实践 实验内容(概要) 一.正确使用msf编码器,msfvenom生成如jar之类的其他文件,veil-evasion,自己 ...

  4. PMI-ACP练习题知识积累-打印版

    敏捷铁三角的参数:价值,质量,约束.传统的铁三角包括的参数是范围,进度和成本 敏捷计划的三个主要层级为:发布计划,迭代计划,每日计划 敏捷开发模型的特征包括 开发由多个迭代组成. 敏捷拥抱不确定性,而 ...

  5. Linux Input子系统浅析(二)-- 模拟tp上报键值【转】

    转自:https://blog.csdn.net/xiaopangzi313/article/details/52383226 版权声明:本文为博主原创文章,未经博主允许不得转载. https://b ...

  6. 011_TCP专项研究监控

    (1)In Segs 数据源: /proc/net/snmp; 采集方式:累计值,每10秒采集一次取差值: 指标:net.snmp.tcp (key: system); In Segs: tcp协议层 ...

  7. 各种手工DIY

    http://www.guokr.com/scientific/subject/diy/ 高仿宜家莲花灯 http://www.guokr.com/article/179863/ 做一只会发光的魔幻吊 ...

  8. Mysql常用命令大全 sql

    1.连接Mysql 格式: mysql -h主机地址 -u用户名 -p用户密码 1.连接到本机上的MYSQL.首先打开DOS窗口,然后进入目录mysql\bin,再键入命令mysql -u root ...

  9. windows环境安装phantomjs和pyspider遇到的问题

    1. 安装phantomjs 下载地址:http://phantomjs.org/download.html 解压后将phantomjs.exe文件放到python根目录 2.安装pyspider p ...

  10. C# Emgu 类型转换

    Bitmap: Bitmap位图文件,是Windows标准格式,也是.Net主要的图像存储格式. Bitmap类以System.Drawing为命名空间,继承抽象类Image,同时里面封装了非常多对图 ...