首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >未定义不是对象(计算“”this.state.events[i].summary“”)

未定义不是对象(计算“”this.state.events[i].summary“”)
EN

Stack Overflow用户
提问于 2018-03-30 10:42:31
回答 1查看 681关注 0票数 0

我是一个本机反应的新手,试图找出哪里出了问题,但我找不到任何解决方案。我正在使用google日历api从日历中获取数据,我能够获取数据,但当我尝试解析并呈现它时,我会遇到这个错误。

代码语言:javascript
复制
import React from 'react';
import { SafeAreaView, View, Text, StatusBar, Image, AppRegistry, ScrollView, StyleSheet, TouchableHighlight, FlatList } from 'react-native';
import glamorous from "glamorous-native";
import { Calendar, Agenda } from 'react-native-calendars';
import { bColor, pColor } from "../style/colors"
import request from 'superagent'

import PostItem from "../elements/PostItem"

export default class AppCalendar extends React.Component {
    static navigationOptions = ({ navigation }) => ({
        title: "Calendar",
    });

    componentWillMount() {
        this.setState({
            events:[]
        })
    }

    componentDidMount(){
        let postsUrl = "https://www.googleapis.com/calendar/v3/calendars/calendarId/apiKey
        fetch(postsUrl)
            .then((response) => response.json())
            .then((response) => {
                this.setState({
                    events: response
                })
            })
    }


    fetchData(){
            let e = []
            if (this.state.events != null) {
                for (let i = 0; i < 3; i++) { 
                    let newEvent = {}
                    newEvent.title = this.state.events[i].summary
                    newEvent.location = this.state.events[i].location
                    newEvent.startDate = this.state.events[i].start.date || this.state.events[i].start.dateTime
                    newEvent.endDate = this.state.events[i].end.date || this.state.events[i].end.dateTime
                    if(newEvent.startDate)
                    e.push(newEvent)
                }
                    return e

            }
            else {
                return 'yanlis'
            } 
    }


    render() {
        console.log('length is', this.state.events.length)
        return (
            <View>
                   <Text>{this.fetchData()}</Text>
            </View>    
        );
    }
}
EN

回答 1

Stack Overflow用户

发布于 2018-03-30 10:53:16

fetchsetState是异步的。当你渲染时,this.state.events将只是一个空数组,因为数据还不会被设置为更新。因此,当你在fetchData()的for循环中使用access it时,你会得到undefined,因为this.state.events将是你的[]的初始值。

另外,您的if语句:

代码语言:javascript
复制
if (this.state.events != null)

由于this.state.events已初始化为[],因此不执行任何操作。它将始终执行,并且永远不会执行else语句中的操作。

我建议回顾一下异步代码在JavaScript中是如何工作的,因为它在React / React Native (fetchsetState等)中被大量使用。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49567705

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档