首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >React状态更新问题

React状态更新问题
EN

Stack Overflow用户
提问于 2021-02-05 20:46:03
回答 1查看 50关注 0票数 0

我尝试在状态中添加新的数组和值。我正在使用react-beautiful dnd来显示这个状态数据。

我的初始状态:

代码语言:javascript
复制
 const initialData = {
            users: {
                'user-1': { id: 'user-1', name: 'John'},
                'user-2': { id: 'user-2', name: 'Patrick'},
                'user-3': { id: 'user-3', name: 'Malorie'},
                'user-4': { id: 'user-4', name: 'Eric'},
                'user-5': { id: 'user-5', name: 'Bob'},
                'user-6': { id: 'user-6', name: 'Blob'}
            },
            areas: {
                'area-0': {
                    id: 'area-0',
                    title: 'Main Area',
                    userIds: ['user-1', 'user-2','user-3', 'user-4','user-5', 'user-6']
                },
                'area-1': {
                    id: 'area-1',
                    title: 'Area 1',
                    userIds: []
                },
                'area-2': {
                    id: 'area-2',
                    title: 'Area 2',
                    userIds: []
                }
            },
            areaOrder: ['area-0','area-1', 'area-2'],
        }
 
 class MyClass {
 constructor() {
    super();
    this.state = {
        data: initialData,
      }
   }
 ...
 }

我有一个下拉菜单来选择我想要显示的区域的总数,当我触发它时,我会尝试在' areas‘数组和'areOrder’数组中添加新的区域。如果我再次更新区域的数量,我需要将状态重置为'initialData‘。

MyClass中的代码:

代码语言:javascript
复制
 // apply is triggered by the dropdown menu
 apply = (numOfAreas) => {
     // clear state to initial data
     this.setState({
        data: initialData
    })
 
    for (let i = 3; i <= numOfBOR; i++ ) {
        this.addNewArea(i);
    }
 }
 
 addNewArea = (newRoomId) => {
    const areas = { ...this.state.data.areas };
    let p = "area-";
    let key = newAreaId;
    const newAreaKey = p.concat(key);
    const areaTitle = "Area ".concat(newAreaId);

    let obj = [];
    obj[newAreaKey] = { id: newAreaKey, title: areaTitle, userIds: [] };

    const currentAreas = { ...areas };
    const newAreaObj = Object.assign(currentAreas, obj);

    const newState = {
      ...this.state.data,
      areas: newAreaObj,
      areaOrder: [...this.state.data.areaOrder, newAreaKey]
    };
    this.setState({data: newState});
  };

当我使用上面的代码时,只显示最后一个区域(即当我选择8个区域时,区域8显示在区域2之后)我知道setState是异步的,所以我想知道哪种方法可以让我做我想做的事情。

EN

回答 1

Stack Overflow用户

发布于 2021-02-05 21:05:18

在本例中,setState不使用以前的状态,因此每个setState都将areas更改为其初始值加上一个新元素。您可以使用this.setState(prevState => newState)来获取以前的状态。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66063546

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档