React中修改State数组与对象的正确方式

作者:渲染笔记

时间:2026-10-25

浏览:370

本文详解React中如何正确修改State中的数组和对象。通过setState接收函数的方式,确保基于最新状态进行更新,避免直接修改原数据。结合Vue与React对比,阐述函数式编程中不可变性的核心原则,并提供删除元素、合并对象及修改深层属性等常见场景的代码示例。

文章目录

在React中修改State中的数组或对象数据时,需要特别注意更新机制。

首先,在修改状态数据(State)时,必须遵循React的规则,使用setState()方法进行更新。

当需要修改的数据是数组或对象时,仅传递一个对象给setState往往无法满足需求,此时应当传递一个函数。

在React中修改State中的数组或对象数据时,需要特别注意更新机制。

该函数的参数state即为组件当前的State数据。你可以在函数内部对参数中的state进行修改,然后通过键值对的形式返回新的状态。

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
    }
  })
}

需要注意以下几点关键事项:

必须在完成数据修改后,再通过键值对返回结果。

避免调用其他方法并将返回值赋值给变量,这种做法往往得不偿失。

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修改数组或对象的示例,所有函数均不改变现有数据,而是返回新的数组或对象。

删除数组中的指定元素:

//删除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'
            }
        }
    })
}
...

以上为个人经验总结,希望能为大家提供参考。

实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›
相关文章