我正在try 创建数组的空array.

该 struct 需要是每行一个数组(比方说3),然后是每行x个列数(比方说5),例如:

[
   [false, false, false, false, false],
   [false, false, false, false, false],
   [false, false, false, false, false],
]

当在TouchableOpacity组件上单击onPress时,应该发生的情况是单个列的背景切换为红色,例如,如果我单击第二行中的第二列,则数组应变为以下内容:

[
   [false, false, false, false, false],
   [false, true, false, false, false],
   [false, false, false, false, false],
]

但如果我这样做,会发生什么呢?

[
   [false, true, false, false, false],
   [false, true, false, false, false],
   [false, true, false, false, false],
]

每行中的第二项(或我单击的任何列)正在更改,而不是特定行中的特定列.我不知道为什么.

export const  = ({
      numberOfRows,
      numberOfCols,
      dimens
    }: Props) => {
      const [rows, setRows] = useState<boolean[][]>(Array(numberOfRows).fill(Array(numberOfCols).fill(false)));
    
      const handleOnPress = (rowIdx: number, colIdx: number) => {
        const rowsData = [...rows];
        rowsData[rowIdx][colIdx] = !rowsData[rowIdx][colIdx];
        setRows(rowsData);
      };
    
      return (
        <View style={{ width: dimens.width, height: dimens.height }}>
          {rows.map((row, rowIdx) => {
            return (
              <View key={Math.random()} style={{ display: 'flex', flexDirection: 'row', marginBottom: 20 }}>
                {row.map((_col, colIdx) => (
                  <TouchableOpacity key={Math.random()} style={{ backgroundColor: rows[rowIdx][colIdx] ? 'red' : '', borderWidth: 1, flex: dimens.width / 5, height: 50 }} onPress={() => handleOnPress(rowIdx, colIdx)}>{colIdx}</TouchableOpacity>
                ))}
              </View>
            );
          })}
        </View>
      );
    };

推荐答案

这是因为您实际上只创建了两个array.创建一个包含numberOfCols个元素的内部数组,然后创建一个包含numberOfRows个元素的外部array.因此,外部数组内的所有数组都引用同一array.

因此,在初始化rows状态时,您需要为每一行创建新array.

const [rows, setRows] = useState<boolean[][]>(
    Array(numberOfRows)
    .fill(null)
    .map(_ => Array(numberOfCols).fill(false))
);

Javascript相关问答推荐

创建私有JS出口

JS生成具有给定数字和幻灯片计数的数组子集

没有输出到带有chrome.Devtools扩展的控制台

我不知道为什么setwritten包装promise 不能像我预期的那样工作

为什么这个JS模块在TypeScript中使用默认属性导入?""

如何从Intl.DateTimeFormat中仅获取时区名称?

Javascript json定制

我的角模板订阅后不刷新'

编辑文本无响应.onClick(扩展脚本)

在JS中动态创建对象,并将其追加到HTML表中

更新Redux存储中的对象数组

JS Animate()方法未按预期工作

在不扭曲纹理的情况下在顶点着色器中旋转UV

如何在Jest中模拟函数

如何使用puppeteer操作所有选项

Promise.race()返回已解析的promise ,而不是第一个被拒绝的promise

更新文本区域行号

AstroJS混合模式服务器终结点返回404

KeyboardEvent:检测到键具有打印的表示形式

每隔一行文本段落进行镜像(Boustrophedon)