javascript - 您试图在一个本来是不可变且已被冻结的对象上设置键 'left' 的值为 '50'
问题描述
在本机反应中,当我想用数组更新 useState 时出现此错误。
import React, {useState, useEffect} from 'react';
import { StyleSheet, View, Text} from 'react-native';
var generatecubes = true;
var cubesarr = [];
const Cubes = ({cubeHeight, cubeMover}) => {
const maxspikes = Math.ceil(global.canvasWidth/(global.cubesWidth + global.spacebetweencubes)+1);
const cubesstyle = StyleSheet.create({
cube:{
position: 'absolute',
width: global.cubesWidth,
height: cubeHeight,
transform: [
{translateX: cubeMover},
],
backgroundColor: 'blue',
}
})
var [cubes, setCubes] = useState([]);
if(generatecubes == true){
generatecubes = false;
var i;
for(i=0; i<maxspikes; i++){
cubesarr.push(
{
key: i,
position:{
left:i*global.spacebetweencubes+global.cubesWidth+global.canvasWidth,
}
}
);
}
setCubes(cubesarr);
}
if(global.cubechangeposition == true){
var newarr = cubesarr;
newarr[0].position.left = 50;
console.log(newarr[0].position.left);
/*console.log(cubesarr[0].position.left);
cubesarr[0].position.left = (cubesarr.length)*global.spacebetweencubes+global.cubesWidth+global.canvasWidth;
cubesarr.push(cubesarr.shift());
setCubes(cubesarr);*/
global.cubechangeposition = false;
}
return(
cubes.map((cube) => {
return(
<View key={cube.key} style={[cubesstyle.cube,cube.position]}>
<Text style={{color: "white", fontSize: 20}}>{cube.key}</Text>
</View>
);
})
);
}
export default Cubes;
所有这些东西每秒都会从 App.js 更新。我试图用包含旧数组但仍然相同的错误的新数组来更新数组。
解决方案
您必须将多维数据集和 setCubes 声明为 const。您需要在useEffect
hook 中生成并设置 cubes 数组请参考以下代码:
const [cubes, setCubes] = useState([]);
useEffect(() => {
if(generatecubes == true){
generatecubes = false;
var i;
for(i=0; i<maxspikes; i++){
cubesarr.push(
{
key: i,
position:{
left:i*global.spacebetweencubes+global.cubesWidth+global.canvasWidth,
}
}
);
}
setCubes(cubesarr);
}
}, []);
而且我认为您的代码中不需要以下代码块请删除它
if(global.cubechangeposition == true){
var newarr = cubesarr;
newarr[0].position.left = 50;
console.log(newarr[0].position.left);
/*console.log(cubesarr[0].position.left);
cubesarr[0].position.left = (cubesarr.length)*global.spacebetweencubes+global.cubesWidth+global.canvasWidth;
cubesarr.push(cubesarr.shift());
setCubes(cubesarr);*/
global.cubechangeposition = false;
}
推荐阅读
- r - R上的合并问题
- android - Android - 应用程序可能在其主线程上做太多工作 - Fragment,RecyclerView
- python - 将一个非常大的数据框的列拆分为两个(或更多)新列
- cmake - 错误:未定义对 cv::imwrite 的引用,这里有什么问题?
- reactjs - 如何在更改时更新 React State
- emulation - 加倍位 gb-emu
- python - 层 max_pooling2d 的输入 0 与层不兼容:预期 ndim=4,发现 ndim=5。收到的完整形状:[None, 4, 10, 8, 32]
- amazon-web-services - 在 AWS 上查看我的免费套餐的使用量
- python - malloc():未排序的双链表损坏中止(核心转储)python
- css - Angular:将类添加到跨度选择器