You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React Native中useState多关卡数组管理与切换实现求助

React Native 关卡切换数据适配问题解决

我是React Native初学者,现有存储各关卡图片、位置等参数的对象数组,当前代码仅固定调用level_0的数据,希望切换到其他关卡时能使用对应关卡的数组参数,但不知如何操作,可能数组结构或代码逻辑存在问题,请求协助解决。

现有代码:

状态定义:

const [findObjects, setfindObjects] = useState({
    level_0: [
      { img: require('../obj1.png'), w: 35, h: 50, left: 120, top: 10 },
      { img: require('../obj2.png'), w: 35, h: 50, left: 180, top: 40 },
    ],
    level_1: [
      { img: require('../obj1.png'), w: 35, h: 50, left: 0, top: 0 },
      { img: require('../obj1.png'), w: 35, h: 50, left: 70, top: 170 },
    ],
    level_2: [
      { img: require('../obj1.png'), w: 35, h: 50, left: 510, top: 7 },
      { img: require('../obj2.png'), w: 35, h: 50, left: 170, top: 120 },
  });

隐藏对象函数:

const hiddenObject2 = (index) => {
    let tempFindObjects = { ...findObjects };
    let tempPostList = [...tempFindObjects.level_0];
    tempPostList.splice(index, 1);

    tempFindObjects.level_0 = tempPostList;
    setfindObjects(tempFindObjects);

    if (tempFindObjects.level_0.length == 0) {
      lvl += 1;
      goToMessageScreen();
    }
};

渲染部分:

return (
  <View>
    {findObjects.level_0.map((item, index) => {
      return (
        <TouchableOpacity onPress={() => hiddenObject2(index)} key={Math.random()} style={{ width: "auto" }}>
          <Image
            source={item.img}
            style={[
              gStyle.imgObject,
              {
                width: item.w,
                height: item.h,
                left: item.left,
                top: item.top,
              },
            ]}
          />
        </TouchableOpacity>
      );
    })}
  </View>
)

解决方案:

核心思路是用状态变量跟踪当前关卡,替换所有硬编码的level_0,让代码动态适配当前关卡:

  1. 新增当前关卡状态
    添加状态变量记录当前关卡编号,动态生成对应关卡的key:

    // 初始关卡设为0,对应level_0
    const [currentLevelNum, setCurrentLevelNum] = useState(0);
    // 动态拼接当前关卡的key
    const currentLevelKey = `level_${currentLevelNum}`;
    
  2. 修改隐藏对象函数,适配动态关卡
    替换所有硬编码的level_0为currentLevelKey,同时把lvl改成状态变量(直接修改不会触发组件重渲染):

    // 将lvl转为状态变量
    const [lvl, setLvl] = useState(0);
    
    const hiddenObject2 = (index) => {
        let tempFindObjects = { ...findObjects };
        // 动态获取当前关卡的数组
        let tempPostList = [...tempFindObjects[currentLevelKey]];
        tempPostList.splice(index, 1);
    
        tempFindObjects[currentLevelKey] = tempPostList;
        setfindObjects(tempFindObjects);
    
        // 检查当前关卡对象是否清空
        if (tempFindObjects[currentLevelKey].length === 0) {
            const nextLevel = lvl + 1;
            setLvl(nextLevel);
            // 通关后可直接切换关卡,比如从提示页返回时调用setCurrentLevelNum(nextLevel)
            goToMessageScreen();
        }
    };
    
  3. 修改渲染逻辑,动态加载当前关卡对象
    替换固定的level_0为动态key,同时不要用Math.random()当key(会导致组件频繁重建),改用index或给每个对象添加唯一id:

    return (
      <View>
        {findObjects[currentLevelKey].map((item, index) => {
          return (
            <TouchableOpacity onPress={() => hiddenObject2(index)} key={index} style={{ width: "auto" }}>
              <Image
                source={item.img}
                style={[
                  gStyle.imgObject,
                  {
                    width: item.w,
                    height: item.h,
                    left: item.left,
                    top: item.top,
                  },
                ]}
              />
            </TouchableOpacity>
          );
        })}
      </View>
    )
    
  4. 关卡切换触发
    当需要切换关卡时,更新currentLevelNum即可自动加载对应关卡数据:

    // 比如从通关提示页返回时调用
    setCurrentLevelNum(nextLevel);
    

内容的提问来源于stack exchange,提问作者easyVJ

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 00:01:06