javascript - 访问要在 React Native Text 组件中显示的对象数组

标签 javascript json reactjs react-native

我无法访问我的 JSON 数据中的对象数组以显示在 React Native Text 组件中。

JSON 数据

{
    "name": "Pizza Joint",
    "when": [{
        "day": ["Sat", "Sun"],
        "start_time": "11:00",
        "end_time": "23:00"
    }]
}

代码

<View style={styles.container}>
    <Text style={styles.name}>{venue.name}</Text>
    <Text style={styles.time}>{venue.when[0].start_time}</Text>
</View>

这会引发错误 Undefined is not an object (evaluating 'venue.when') 我不明白,因为 console.log(type of venue.when) 返回 object

如何在此处访问when 对象属性?

附加说明

我从 this tutorial 复制了应用结构.

这是 VenueList.js:

'use strict';

var React = require('react-native');
var VenueDetail = require('./VenueDetail');

var {
    Image,
    StyleSheet,
    Text,
    View,
    Component,
    ListView,
    TouchableHighlight,
    ActivityIndicatorIOS
   } = React;

var styles = StyleSheet.create({
    container: {
        flex: 1,
        flexDirection: 'row',
        justifyContent: 'center',
        alignItems: 'center',
        backgroundColor: '#F5FCFF',
        padding: 10
    },
    thumbnail: {
        width: 53,
        height: 81,
        marginRight: 10
    },
    rightContainer: {
        flex: 1,
    },
    title: {
        fontSize: 20,
        marginBottom: 8
    },
    author: {
        color: '#656565'
    },
    separator: {
        height: 1,
        backgroundColor: '#dddddd'
    },
    listView: {
           backgroundColor: '#F5FCFF'
       },
   loading: {
       flex: 1,
       alignItems: 'center',
       justifyContent: 'center'
   }
});

// var REQUEST_URL = 'https://www.googleapis.com/books/v1/volumes?q=subject:fiction';
var REQUEST_URL = 'http://apib.miniguide.es/wall/today';

class VenueList extends Component {

  render() {
    if (this.state.isLoading) {
      return this.renderLoadingView();
    }
    console.log(this.state.dataSource);

    return (
      <ListView
        dataSource={this.state.dataSource}
        renderRow={this.renderVenue.bind(this)}
        style={styles.listView}
      />
    );
  }

  renderLoadingView() {
    return (
      <View style={styles.loading}>
        <ActivityIndicatorIOS
          size='large'/>
          <Text>
            Loading venues...
          </Text>
      </View>
    );
  }

  constructor(props) {
    super(props);
    this.state = {
      isLoading: true,
      dataSource: new ListView.DataSource({
        rowHasChanged: (row1, row2) => row1 !== row2
      })
    };
  }

  componentDidMount() {
    this.fetchData();
  }

  fetchData() {
    fetch(REQUEST_URL)
    .then((response) => response.json())
    .then((responseData) => {
      this.setState({
        dataSource: this.state.dataSource.cloneWithRows(responseData),
        isLoading: false
      });
    })
    .done();
  }

  renderVenue(venue) {
    console.log(venue);
    return (
      <TouchableHighlight onPress={() => this.showVenueDetail(venue)} underlayColor='#dddddd'>
        <View>
          <View style={styles.container}>
            <Image
//              source={{uri: venue.images[0].url}}
              style={styles.thumbnail} />
            <View style={styles.rightContainer}>
              <Text style={styles.title}>{venue.name}</Text>
              <Text style={styles.author}>{venue.subtitle}</Text>
            </View>
          </View>
          <View style={styles.separator} />
        </View>
      </TouchableHighlight>
    );
  }
}

module.exports = VenueList;

console.log(venue) 生成以下格式的数据(出于示例的目的,我在此处简化了输出):

{
    name: 'Pizza Joint',
        when: [{
            day: ['Sat', 'Sun'],
            start_time: '11:00',
            end_time: '23:00'
        }]
}

我注意到上面不是 JSON,因为键上的引号已被删除。

最佳答案

好吧,我明白了。问题是我们的 API 生成的 JSON 数据集有一些文档和另一个定义数据的定义(例如,第一个是指示 featured 的文档)。所以 React 在第一个文档上抛出错误,它缺少我试图访问的属性。

为了解决这个问题,我向 React 组件添加了三元表达式来检查属性是否存在:

  renderVenue(venue) {
    console.log(venue);
    return (
      <TouchableHighlight onPress={() => this.showVenueDetail(venue)} underlayColor='#dddddd'>
        <View>
          <View style={styles.container}>
            <Image source={ 'images' in venue ? { uri: 'http://' + venue.images[0].url } : null}       
              style={styles.thumbnail} />
            <View style={styles.rightContainer}>
              <Text style={styles.title}>{venue.name}</Text>
              <Text style={styles.author}>{venue.subtitle}</Text>
              <Text style={styles.author}>{ 'when' in venue ? venue.when[0].start_date : null}</Text>
            </View>
          </View>
          <View style={styles.separator} />
        </View>
      </TouchableHighlight>
    );
  }
}

也许我们应该修改我们的 API 输出。

无论如何感谢您的评论,它们很有帮助。

关于javascript - 访问要在 React Native Text 组件中显示的对象数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36901009/

相关文章:

javascript - 在 ReactJS 中使用 jQuery 是一种不好的做法吗?

javascript - 使用 AJAX 和跨站点脚本读取 header

javascript - 谷歌热图显示红色 block

javascript - js Date 太多聪明的行为

jquery - 如何解析像 geo :point? 这样的 JSON

ruby-on-rails - 是否可以使用dotenv将JSON文件存储到ENV变量中?

ios - YouTube API/JSON/swift

javascript - 迁移到 Vite : Uncaught TypeError: Cannot read property 'attrs' of undefined

javascript - 如何让对象返回一个不是对象本身的值

javascript - 图像未在 React Native 应用程序中显示 : URI source with local path