重复的JSON数据-React Native

时间:2019-12-31 06:07:16

标签: reactjs react-native react-native-android

有人可以向我解释为什么一遍又一遍地重复我的数据和标题,我该如何解决这个问题?

我也有一条黄色的错误消息,我认为这可能是相关的,它显示为“警告:列表中的每个孩子都应该有一个唯一的“键”道具。

这可能是基本的东西,但是我是新来的反应者,可以从这里的人们那里学到很多东西,并感谢您的帮助!

谢谢

Repeated data

import React from "react";
import { StyleSheet, FlatList, Text, View } from "react-native";
import styled from "styled-components";

export default class FetchExample extends React.Component {
  static navigationOptions = {
    header: null
  };

  constructor(props) {
    super(props);
    this.state = { isLoading: true };
  }

  componentDidMount() {
    const localMovieData = require("../assets/test.json");

    this.setState(
      {
        isLoading: false,
        dataSource: localMovieData.movies
      },
      function() {}
    );
  }

  _renderItem = info => {
    return (
      <View>
        <Title style={styles.title}> Contact Information </Title>
        {this.state.dataSource.map((movie, index) => (
          <Text style={styles.text}>
            {movie.name} - {movie.contact}
          </Text>
        ))}
      </View>
    );
  };

  render() {
    return (
      <View style={styles.container}>
        <FlatList
          data={this.state.dataSource}
          renderItem={this._renderItem}
          keyExtractor={({ id }, index) => id}
        />
      </View>
    );
  }
}
const Title = styled.Text`
  font-size= 16px;
  color: #b8bece;
  font-weight: 500;
  `;

const styles = StyleSheet.create({
  container: {
    paddingVertical: 50,

    backgroundColor: "#f0f3f5"
  },
  text: {
    fontSize: 15,
    color: "#008000",
    padding: 10
  },
  image: {
    width: 45,
    height: 45,
    borderRadius: 20,
    marginLeft: 20
  },
  title: {
    fontSize: 16,
    color: "black"
  }
});

JSON数据

{
  "title": "The Basics - Networking",
  "description": "Your app fetched this from a remote endpoint!",
  "movies": [
    { "id": "1", "name": "Tim ", "contact": "xxx@ymail.com" },
    { "id": "2", "name": "Bradley", "contact": "xxx@ymail.com" },
    { "id": "3", "name": "James", "contact": "outlook.com" },
    { "id": "4", "name": "Elle", "contact": "hotmail" },
    { "id": "5", "name": "Bob", "contact": "yahoo" }
  ]
}

2 个答案:

答案 0 :(得分:2)

问题出在您的“ renderItem”方法上

FlatList组件接收数据时,会自动将其分离为对象 并将其发送到“ renderItem”方法

所以您需要做的是: 在render函数中,获取每个项目的item属性,并将其发送到_renderItem

删除每个renderItem内的映射并按如下方式访问新项目:

_renderItem = item => {
    return (
      <View>
        <Text style={styles.title}> Contact Information </Text>         
          <Text>
            {item.name} - {item.contact}
          </Text>
      </View>
    );
  };

  render() {
    return (
      <View style={styles.container}>
        <FlatList
          data={this.state.dataSource}
          renderItem={(item)=>this._renderItem(item.item)}
          keyExtractor={(item, index) => {return item.id;}}  
      />
      </View>
    );
  }

主要警告:

您需要像这样返回密钥

keyExtractor={(item, index) => {
     return item.id;
    }}

您可以看到有效的代码here

答案 1 :(得分:1)

您不需要遍历 _renderItem 内部的数据源,因为 FlatList 将为每个数组项调用它的 renderItem 函数。 / p>

因此,如下更改 _renderItem 函数

_renderItem = el => {
  const movie = el.item;
  return (
    <View>
      <Title style={styles.title}> Contact Information </Title>  
      <Text style={styles.text}>
        {movie.name} - {movie.contact}
      </Text>
    </View>
  );
};