如何在反应中改变状态?

How to mutate state in react?

我正在尝试更改嵌套在数组中的对象字段的值。我不断收到此错误消息,“无法分配给对象‘[object Array]’的只读 属性‘0’”

状态如下

{
    "school stuffs": [
        {
            "_id": "629332e33f0e48af3d626645",
            "completed": false,
            
        },
        {
            "_id": "629425fc9c50b142dff947a9",
            "completed": true,
            
        }
    ],
    "household and furniture": [
        {
            "_id": "629334424709234a344c0189",
            "completed": false,
            
        },
        {
            "_id": "629334f12da7859af0828c9a",
            "completed": false,
            
        }
    ]
}

这是我用来改变状态并将“完成”的值更改为当前布尔值的相反值的代码。

const newArray = { ...productArray,  [value]: {...productArray}[value]  }
const index = productArray[value].findIndex(index => index._id === innerElement._id)
newArray[value][index].completed = !newArray[value][index].completed
console.log(newArray[value][index].completed); 

关于 React 的事情是,你不应该改变状态,为此目的存在 useState 和纯函数方法,如下一个例子所示: 假设您有一个购物车。

const [cart, setCart] = useState([]);

而你想添加一个产品,你可以这样做:

const addCart = product => {
  setCart([...cart, product]) // Using spread syntax.
  setCart(cart.concat(product)) // Using pure functions.
}

如果你想改变状态内对象中的道具,你可以这样做:

const increaseQuantity = id => {
  const mappedCart = cart.map(prd => prd.id === id ? {...prd, quantity: prd.quantity + 1} : prd);
  setCart(mappedCart)
}

当然你可以使用简单的 for 循环,或其他方式,但这里的问题是你不能在 react 中改变状态。

希望能帮到你