使用react在修改state中的数组和对象数据的时候(setState)

目录
  • react修改state的数组和对象数据的时候(setState)
    • 需要注意
  • react修改数组对象的注意事项
    • 删除数组中的指定元素
    • 合并两个对象
    • 修改多层级对象的值

react修改state的数组和对象数据的时候(setState)

首先在修改状态数据(state)的时候,我们要遵循react的规则,使用setState()方法去修改

此时修改的数据是一个数组或者是一个对象的时候,setState中传递一个对象是不能够满足的,此时就需要给setState中传递函数了!

此时函数中的参数state就是我们组件中的state数据,可以在方法中把参数中state改变后通过k:v return出来

handlerWorkType(item, index) {
  this.setState((state) => {
    for(let i = 0; i < state.submitWorksList.length; i++) {
      if(state.submitWorksList[i] == item.id) {
        state.submitWorksList.splice(i, 1)
        state.worksTypeList[index].activeShow = false
        return {
          submitWorksList: state.submitWorksList,
          worksTypeList: state.worksTypeList
        }
      }
    }
    state.submitWorksList.push(item.id)
    state.worksTypeList[index].activeShow = true
    return {
      submitWorksList: state.submitWorksList,
      worksTypeList: state.worksTypeList
    }
  })
}

需要注意

必须要在数据修改之后在通过k:v对return;

避免调用其它方法,将其它方法的返回值赋值给我们的变量;得不偿失!

react修改数组对象的注意事项

react开发主张使用函数式编程,函数式编程有个重要的特性就是不可变性。 你无法更改数据,也不能更改。 如果要改变或更改数据,则必须复制数据副本来更改。

看个例子,就是Vue和React两个框架实现给数组添加一个元素。

vue

export default {
    name: "home",
    data() {
        return {
            testArr: ['苹果','香蕉']
        };
    },
    created(){
        this.testArr.push('橘子')
    }
};
...

react

class App extends React.Component {
    constructor(props) {
        super(props);
        this.state = {
            testArr: ['苹果','香蕉']
        };
    }
    componentDidMount(){
        this.setState({
            testArr:[...this.state.testArr,'橘子']
        })
    }
    render(){
        return (
            <React.Fragment>
                <p>{this.state.testArr}</p>
            </React.Fragment>
        )
    }
}

这里会发现两个框架有个细微差别,Vue是直接修改的原数组,而React是不修改原数组,而是创建了一份新的数组,再通过setState赋值。刚接触React的时候的确会觉得挺奇怪,感觉会无形增加代码复杂度。接下来看下为何React要如此设计。

React遵循函数式编程规范。在函数式编程中,不推荐直接修改原始数据。 如果要改变或更改数据,则必须复制数据副本来更改。所以,函数式编程中总是生成原始数据的转换副本,而不是直接更改原始数据。

这里是一些常见的React修改数组或者对象的例子,所有这些函数都不改变现有的数据,而是返回新的数组或对象。

删除数组中的指定元素

//删除testArr中的樱桃
...
constructor(props) {
    super(props);
    this.state = {
        testArr: ['苹果','香蕉','橘子','樱桃','橙子']
    };
}
componentDidMount(){
    this.setState({
        testArr:this.state.testArr.filter(res=>res!=='樱桃')
    })
}
...

合并两个对象

...
constructor(props) {
    super(props);
    this.state = {
        testObj1:{
            chineseName:'橘子',
            englishName:'orange'
        },
        testObj2:{
            color:'yellow',
            shape:'circle'
        },
        testObj:{}
    };
}
componentDidMount() {
    this.setState({
        testObj: Object.assign(this.state.testObj1,this.state.testObj2)
    })
}
...

修改多层级对象的值

//testObj的apple的color改成green
...
constructor(props) {
    super(props);
    this.state = {
        testObj: {
            banner: {
                name: '香蕉',
                color: 'yellow'
            },
            apple: {
                name: '苹果',
                color: 'red'
            }
        }
    };
}
componentDidMount() {
    this.setState({
        testObj: {
            ...this.state.testObj,
            apple:{
                ...this.state.testObj.apple,
                color:'green'
            }
        }
    })
}
...

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • 详解React setState数据更新机制

    为什么使用setState 在React 的开发过程中,难免会与组件的state打交道.使用过React 的都知道,想要修改state中的值,必须使用内部提供的setState 方法.为什么不能直接使用赋值的方式修改state的值呢?我们就分析一下,先看一个demo. class Index extends React.Component { this.state = { count: 0 } onClick = () => { this.setState({ count: 10 }) } re

  • react学习笔记之state以及setState的使用

    在react中通过 state 以及 setState() 来控制组件的状态. state state 是 react 中用来存储组件数据状态的,可以类比成 vue 中的 data. 1.state的作用 state是React中组件的一个对象.React把用户界面当做是状态机,想象它有不同的状态然后渲染这些状态,可以轻松让用户界面与数据保持一致. React中,更新组件的state,会导致重新渲染用户界面(不要操作DOM).简单来说,就是用户界面会随着state变化而变化. 2.state工作

  • React 组件中的state和setState()你知道多少

    目录 state的基本使用 setState()修改状态 解决方法: 总结 state的基本使用 状态(state)即数据,是组件内部的私有数据,只能在组件内部使用 state的值是对象,可以通过this.state来获取状态. setState()修改状态 状态是可变的,可以通过this.setState({要修改的数据})来改变状态 注意:跟vue语法不同,不要直接修改state中的值,这时错误的! //正确 this.setState({ count:this.state.count+1

  • 使用react在修改state中的数组和对象数据的时候(setState)

    目录 react修改state的数组和对象数据的时候(setState) 需要注意 react修改数组对象的注意事项 删除数组中的指定元素 合并两个对象 修改多层级对象的值 react修改state的数组和对象数据的时候(setState) 首先在修改状态数据(state)的时候,我们要遵循react的规则,使用setState()方法去修改 此时修改的数据是一个数组或者是一个对象的时候,setState中传递一个对象是不能够满足的,此时就需要给setState中传递函数了! 此时函数中的参数s

  • vuex state中的数组变化监听实例

    前言 首先,因为我有一个需求就是vue组件中有一组多选框,选中多选框的内容,要在另一个组件中进行视图更新,这个就设计的兄弟组件之间的通信了,兄弟组件之前通信我首先选用的vuex这个解决办法. 问题 vuex的state用来放数据,我就把数组放在了vuex中,然后设置了修改的函数.最终store.js中的代码如下: import Vue from 'vue' import Vuex from 'vuex' Vue.use(Vuex) const state = { messArray:[] } c

  • python mongo 向数据中的数组类型新增数据操作

    我就废话不多说了,大家还是直接看图吧~ 补充知识:pymongo插入数据时更新和不更新的使用 (1)update的setOnInsert 当该key不存在的时候执行插入操作,当存在的时候则不管,可以使用setOnInsert db.test.update({'_id': 'id'}, {'$setOnInsert': {'a': 'a'}, true) 当id存在的时候,忽略setOnInsert. (2)update的set 当key不存在的时候执行插入操作,当存在的时候更新除key以外的se

  • Vue中对数组和对象进行遍历和修改方式

    目录 对数组和对象进行遍历和修改 1.对数组进行循环 2. 修改数组的时候,不能直接通过下标去增加修改删除 3.对对象进行循环 4.增加对象的时候 修改数组和对象的特殊情况以及修改方法 修改数组的两个特殊情况 修补方法 对数组和对象进行遍历和修改 1.对数组进行循环 v-for进行循环,有两个参数(item,index) 注意:template可以成为占位符,在DOM里面不显示 2. 修改数组的时候,不能直接通过下标去增加修改删除 (1)可以用过push/pop/shift/unshift/sp

  • php中显示数组与对象的实现代码

    1. 使用 print_r ( $array/$var ) print 是打印的意思,而r则取自Array的单词,那么该函数的功能就是打印数组内容,它既可以打印数组内容,也可以打印普通的变量. print_r ($_REQUEST) ; print_r ($_GET) ; /* 打印使用GET方法传递的表单内容*/ print_r($_POST) ; /* 打印使用表单POST方法传递过的数组内容*/ 2. 使用 var_dump ($object/$array/$var) var 代表变量(V

  • Django中更新多个对象数据与删除对象的方法

    更新多个对象 例如说我们现在想要将Apress Publisher的名称由原来的"Apress"更改为"Apress Publishing".若使用save()方法,如: >>> p = Publisher.objects.get(name='Apress') >>> p.name = 'Apress Publishing' >>> p.save() 这等同于如下SQL语句: SELECT id, name, a

  • react如何修改循环数组对象的数据

    目录 修改循环数组对象的数据 问题描述 解决办法 案例说明 react使用循环并实现删除和修改 总结 修改循环数组对象的数据 问题描述 做一个消息评论列表,针对具体某一个消息,里面有“收藏”和“点赞”功能,但是发现直接修改对象的树形,无法改变视图,因此做了笔记,方便后续学习 解决办法 循环遍历所有的对象,然后修改对应的值,重新设置 数组对象 案例说明 import * as React from 'react'; import { Icon, Button, Input, Form, } fro

  • 在vue中使用vuex,修改state的值示例

    1. 安装 vuex npm install vuex -S 2.在目录下创建store文件 3. 在store.js编辑一个修改state的方法 然后在mian.js中全局引入 最后在组件中使用 这个的功能是运用mutations 修改state中的值 以上这篇在vue中使用vuex,修改state的值示例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们.

  • react如何获取state的值并更新使用

    目录 react获取state值并更新使用 在视图层处理 在model层处理 react中state基本使用 有状态组件和无状态组件 state的基本使用 setState修改状态 从JSX中抽离事件处理程序 事件绑定this指向 react获取state值并更新使用 react获取state的值并且修改分为两种情况: 在视图层处理 //在 state 中饭设置初始值 state={       name:'',       age:''  } //通过 控制一个事件触发然后setState 去

  • php多层数组与对象的转换实例代码

    多层数组和对象转化的用途很简单,便于处理WebService中多层数组和对象的转化 简单的(array)和(object)只能处理单层的数据,对于多层的数组和对象转换则无能为力. 通过json_decode(json_encode($object)可以将对象一次性转换为数组,但是object中遇到非utf-8编码的非ascii字符则会出现问题,比如gbk的中文,何况json_encode和decode的性能也值得疑虑.下面上代码: 复制代码 代码如下: <?php function object

随机推荐