【问题标题】:Can not map over a response json array无法映射响应 json 数组
【发布时间】:2019-05-13 08:23:21
【问题描述】:

我有来自以下格式的 api 的 Json 响应

[ 
  {
    id: 1,
    class: '10',
    section: 'A',
    subject: 'Social'
  },
  { 
    id: 2,
    class: '8',
    section: 'C',
    subject: 'Social'
  },
  {
  id: 3,
  class: '9',
  section: 'A',
  subject: 'Social'
  } 
]

我将 json 响应存储在状态变量中,并且能够成功打印上述 json 数组。

async ListAllTodaysClasses() {
    try {
      let data = new FormData();
      data.append('id', this.state.id)
      data.append('year',this.state.year)
      data.append('month',this.state.month)
      data.append('day', this.state.day)
      var url = this.state.url;
      console.log(url);
      let response = await fetch(url, {
          method: 'POST',
          body: data
      });
      let res = await response.json();
      this.setState({
        subjects: res
      })
      console.log(this.state.subjects)
    } catch(error) {
      this.setState({error: error});
      console.log("error " + error);
    }
  }

这里我试图循环一个 json 响应数组。

this.state.subjects.map((item, key) => (
  <TouchableOpacity key={key}>
    <View>
      {
        <Text style={styles.textColor2}>{item.class}th-{item.section}/ {item.subject}</Text>
      }
    </View>
  </TouchableOpacity>
))

但我收到 Typeerror: undefined is not a function

【问题讨论】:

  • “我将 json 响应存储在一个状态变量中……” 向我们展示这一点。如果您字面上将 JSON 响应存储为状态变量,则您存储的是字符串,而字符串没有 map。但希望您没有这样做,您正在解析 JSON 并存储结果,而不是 JSON。请记住,JSON 是一种用于数据交换的文本符号(More here.) 如果您正在处理 JavaScript 源代码,而不是处理 string,那么您就不是在处理 JSON。
  • 你能发布你的完整组件吗?除非您展示如何获取 JSON 以及如何显示它,否则无法对此进行详细说明。请使用正确的代码更新您的帖子
  • 我已经更新了代码@T.J.Crowder
  • 我在代码中添加了api方法@AnkushRishi

标签: json react-native dictionary


【解决方案1】:

您的问题与 JSON 无关。您正在存储调用 response.json() 的结果,它会解析响应中的 JSON 并返回解析结果。

您存储它的代码是正确的:

this.setState({
  subjects: res
})

所以我怀疑问题出在您设置 initial 状态的构造函数中。 subjects 的正确初始状态如下:

// In your constructor
this.state = {
    /*...any other state you have...*/,
    subjects: []
};

注意subjects 是一个空数组。我怀疑您将其设置为{}(一个空对象)或""(一个空字符串)或类似的。 (你显然没有初始化失败,也没有使用null,因为这会产生不同的错误。)


旁注:虽然你的setState 调用是正确的,但它后面的不是:

  this.setState({
    subjects: res
  })
  console.log(this.state.subjects) // <=== Will not see the updated state

记住state updates are asynchronous

【讨论】:

  • @Swati - 很高兴有帮助!只是出于好奇,您之前将其设置为什么?
  • 主题:'' :( @T.J.Crowder
  • @Swati - :-) 谢谢!编码愉快!
【解决方案2】:

你可能需要初始化你的state.subjects:

class YourClassName extends React.Component {
  constructor() {
    this.state = {
      subjects: []
    }
  }
}

【讨论】:

  • 正如我在my answer 中所说,他们正在清除使用 something 对其进行初始化(否则错误会有所不同),但不是使用数组。
  • 是的,我也是这么想的。但是只有一半的代码很难分辨。
猜你喜欢
  • 1970-01-01
  • 2019-02-12
  • 2017-04-09
  • 1970-01-01
  • 1970-01-01
  • 2020-02-05
  • 1970-01-01
  • 1970-01-01
  • 2016-12-20
相关资源
最近更新 更多