在使用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. 一、Python学习之路

    基础篇 第一章         Python介绍.安装.使用 Python 简介 Python 安装 第一个Python程序 Python 解释器 字符编码与解码 动态语言与静态语言的区别 变量及简单 ...

  2. Excel如何快速统计一列中相同数值出现的个数--数据透视表

    excel如何快速统计一列中相同数值出现的个数_百度经验 --这里介绍了两种解决方式,用第一种https://jingyan.baidu.com/article/9113f81b2c16822b321 ...

  3. springboot格式化时间

    使用@RestController注解,返回的java对象中若含有date类型的属性,则默认输出为TIMESTAMP时间戳格式,可以在配置文件加入下面配置 spring.jackson.date-fo ...

  4. Pytorch学习笔记(二)---- 神经网络搭建

    记录如何用Pytorch搭建LeNet-5,大体步骤包括:网络的搭建->前向传播->定义Loss和Optimizer->训练 # -*- coding: utf-8 -*- # Al ...

  5. dotnet core使用开源组件FastHttpApi进行web应用开发(转)

      FastHttpApi相对于asp.net mvc来说有着更轻量和性能上的优势,性能上面就不在这里介绍了(具体可查看 https://github.com/IKende/FastHttpApi). ...

  6. iptables系列

    详情请参考:http://www.zsythink.net/archives/tag/iptables/page/2/

  7. git 命令笔记

    切换 git 远程仓库HEAD分支 $ git remote set-head origin some_branch

  8. Lua模式匹配

    Lua并不使用POSIX规范的正则表达式[4](也写作regexp)来进行模式匹配.主要的原因出于程序大小方面的考虑:实现一个典型的符合POSIX标准的regexp大概需要4000行代码,这比整个Lu ...

  9. @RunWith注解作用

    @RunWith就是一个运行器 @RunWith(JUnit4.class)就是指用JUnit4来运行 @RunWith(SpringJUnit4ClassRunner.class),让测试运行于Sp ...

  10. SpringBoot相关错误

    1.org.springframework.boot.builder.SpringApplicationBuilder.<init>([Ljava/lang/Object;)V 搭建spr ...