无法在已卸载的组件上执行React状态更新。要修复,请取消使用useEffect清理功能中的所有订阅和异步任务

时间:2020-10-18 05:08:19

标签: javascript reactjs react-native use-effect asyncstorage

这是我的第一个问题!我试图通过类似的问题来解决我的问题,但是我无法使其适应我的代码(我承认我根本不理解这个问题的含义)

我正在制作一个小的RN项目,一个游戏,而且效果很好。我可以在0级开始游戏。该游戏有两个提示按钮,一个调用一个函数并显示答案的第一个字母,另一个显示完整的答案,然后更新状态为levelNumber,因此它将更新新问题,新答案等。

虽然这是一个很酷的代码,但是很酷,然后我添加了使用异步存储的函数“ readStoredLevel”。 它开始运行良好,因此,我的游戏从0级开始,然后在1秒后更改为1级(因为它是readStoredLevel函数的默认值)。 因此可见元素更新良好。然后,当我按下调用showFirstLetter函数的按钮时,它正常工作,但是当我按下调用showAnswer功能的按钮时,它得到了错误。请注意,在可行的情况下,这两个函数使用相同的变量ActualGame.Answer [firstletter];在程序中断的情况下,使用actualGame.Answer(这对我来说有点奇怪)

在我的仿真器中,我得到以下错误:Typeerror:未定义其不是objetc(评估ActualGame.Answer) 在我的控制台中,我收到错误消息:“无法在已卸载的组件上执行React状态更新。要修复,取消使用useEffect清理功能的所有订阅和异步任务”

我不知道如何解决。我试图将ActualLevel状态放入异步函数或.then()中。但它没有用。我尝试使用发现的useEffect()的示例,但我根本不了解发生了什么以及如何使用useEffect()。

在我的代码下面(我来自阿根廷,我引入了变量名,所以希望您能理解它,否则,对不起我的英语水平!!

import React, {useState,useEffect } from 'react';    
import AsyncStorage from '@react-native-community/async-storage';    
import trivia from '../data/trivia.json'

const gameScreen = props => {
  const [actualLevel, setactualLevel] = useState(0); 
  const readStoredLevel = async () => {
   
    try {    

      storedLevel = await AsyncStorage.getItem('storedLevel') || '1';
    } catch (error) {
      // Error retrieving data
      console.log(error.message);
    }  return storedLevel;
  }
  readStoredLevel().then(()=>{setactualLevel(storedLevel)})
  
   
  const gameNumber = props.navigation.getParam('id');
  const gameName = props.navigation.getParam('gameName');
  const gameQuestion = props.navigation.getParam('gameQuestion');
    var selectedGame=[];
    
    if (gameName === "trivia") {
    selectedGame=trivia;
    }

  const actualGame=selectedGame[actualLevel];

const showFirstLetter=()=>{
   Alert.alert ("La letra nº"+(firstletter+1)+" es :",
  actualGame.Answer[firstletter],
   [
    {
      text: 'Gracias',
      
    }],);
  
   const seeAnswer= ()=> {
    Alert.alert ("La Answer es:", actualGame.Answer, [
      {
        text: 'Gracias',
        onPress: toNextLevel()
      }],);
  } 
  

 
 return (
);

export default gameScreen;

0 个答案:

没有答案