当前位置: 首页 > 知识库问答 >
问题:

从AsyncStorage呈现数据时,无法读取Undefined“的属性”map“

佟翰林
2023-03-14

我正试图通过从AsyncStorage获取值来呈现数据数组。但首先调用render,并在我试图映射数组时显示未定义的映射。代码如下:

null

const [myCosts, setMyCosts] = useState([]);

    useEffect(() => {
        console.log('useeffect')
        readData();
      }, [])

      
const readData = async () => {
        try {
          const expenseValue =  await AsyncStorage.getItem('COSTLIST')
          setMyCosts(expenseValue);
       
        } catch (e) {
          alert('Failed to fetch the data from storage')
        }
      }
if (myCosts === []) {
  return (
    <View style={styles.activityIndicatorContainer}>
      <ActivityIndicator animating={true}/>
    </View>
  );
} else {
 return(
  <View>
  {myCosts.map(cost => {
       return (
          <Text style={{backgroundColor:'#f2e3df',color:'#000',padding:10}}>
             {cost.name}
           </Text>
        )
  })
  }
  </View>
 )
}

null

我也加了条件。但它仍然给出了错误。还能做什么?


共有2个答案

谭富
2023-03-14

当你可以做这样的事情时,为什么你要设置状态;useState set方法是一个异步调用,它可能不会立即反映更改

let myCosts = [];

useEffect(() => {
    readData();
}, [])
      
const readData = async () => {
        try {
          myCosts =  await AsyncStorage.getItem('COSTLIST') || [];
        } catch (e) {
          alert('Failed to fetch the data from storage')
        }
}

if (myCosts.length) {
  return (
    <View style={styles.activityIndicatorContainer}>
      <ActivityIndicator animating={true}/>
    </View>
  );
} else {
 return(
  <View>
  {myCosts.map(cost => {
       return (
          <Text style={{backgroundColor:'#f2e3df',color:'#000',padding:10}}>
             {cost.name}
           </Text>
        )
  })
  }
  </View>
 )
}
苏乐
2023-03-14

在将AsyncStorage设置为State之前,您需要确保它不为空。

这应该可以帮助您修复错误。

const expenseValue =  await AsyncStorage.getItem('COSTLIST')

setMyCosts(expenseValue || []);

但是,您希望确保在AsyncStorage中正确设置了CostList以便它不会返回undefined

 类似资料:
  • 问题内容: 当我尝试使用Promise从AngularUI-Bootstrap获取typeahead值时,出现以下错误。 我的HTML标签是: 用我的功能执行以下操作: 我不明白AngularUI- Bootstrap抱怨什么是不确定的。如果我删除最顶部的注释,则这些值会很好显示。中的输出还返回数组中我期望的所有值。 我缺少什么会导致AngularUI-Bootstrap看不到返回的数组? 问题答

  • 因此,我现在使用的代码给了我一个TypeError:无法为我的ping命令读取undefined的属性'send',然后是TypeError:无法为我的ban命令读取undefined的属性'users',由于我做了什么或忘记了做什么,我还有其他命令不能正常工作,代码一直在工作,直到我向代码添加了权限,然后它就走下坡路了,我不知道在权限之前和之后哪里不工作/它是如何工作的,但后来只是停止工作,我不

  • 我试图只显示一个覆盖,如果我的搜索输入包含任何文本。 这是我的模板,其中我的输入字段是: : 当我在控制台中进行检查时,会更新我在输入字段中写入的任何文本。 然后,我尝试将此变量传递给另一个组件,该组件保存我的overlay div: Overlay.vue: 然而,这给我下面的错误: [Vue warn]:呈现错误:“TypeError:无法读取未定义的属性'length'” 我到底做错了什么?

  • 我是新来的node.js.我正在尝试创建一个注册页面,并使用mysql将输入的值保存在数据库中。 我可以通过在请求头上传递参数来实现这一点。但是,在请求头中传递参数始终不是一个好主意。所以尝试在请求体上传递参数。 我使用邮差测试我的node.js服务。 下面是我的演示应用程序的github链接 https://github.com/debasish283/node_gulp 我还需要做什么来传递请

  • 我在我的Gatsby应用程序中得到了这个错误,该应用程序为作者提取places数据。当author.social的map()点为null时,该错误将显示 谢谢

  • 我试图在Springboot应用程序中使用logback-spring.xml创建日志记录功能,但是无法读取logback-spring.xml文件中的属性值(例如:log.dest.path)。 我通过@PropertySource基于概要文件动态加载不同环境(开发、阶段、生产)的属性文件(YAML)。概要分析工作正常,并且加载了正确的YAML文件(例如:- application.dev.ym