【问题标题】:React-Native fetch JSON from rest service and store it as an array in stateReact-Native 从 rest 服务获取 JSON 并将其存储为 state 中的数组
【发布时间】:2018-10-27 21:26:00
【问题描述】:

大家好 StackoverFlow,

我正在开发一个后端 (Laravel) 和一个前端 (React-Native)。问题出在前端,我试图将 JSON 响应分配给状态。但由于某种原因,我不能将“this.state.data”设置为一个数组,因为它始终是一个字符串,而不是一个对象,我一次得到一个字符。

我想将数据设置为 API 响应中所有路由的数组。

React-Native 代码:(OBS:由于服务器处于开发模式,URL 已删除)

async getData() {
var token =  await AsyncStorage.getItem("token");
this.setState({ "token": token });

fetch('myurl', {
  method: 'POST',
  headers: {
    'Accept': 'application/json',
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    token: this.state.token
  })
}).then((response) => {

    if (response != null) {
      //console.log(response.json());
      console.log(response);

      this.setState({
        //data: response._bodyInit,
        data: JSON.stringify(response._bodyInit),
        loading: false
      });
    }
    return this.state.data;
  })
  .catch((error) => {
    console.error(error);
  });

}

URL 响应结构如下所示:

{
    routes: [
      {
        id: '15',
        uuid: '26-10-2018',
        start_address: 'Krogshøj Alle 3',
        end_address: 'Lindevangs Alle 16',
        arrival: '27-10-2018 10:00',
      },
      ...
      ]
 }

如果我像这样对数据进行硬编码,它就可以工作。

this.setState({
  data: 
    [
      {
        id: '15',
        uuid: '26-10-2018',
        start_address: 'Krogshøj Alle 3',
        end_address: 'Lindevangs Alle 16',
        arrival: '27-10-2018 10:00',
      },
    ]
});

这是我使用数据的地方:

return (
  <View style={styles.container}>
    <Toolbar
      isHidden={phase !== 'phase-0'}
      onBackPress={this.onBackPressed}
    />

    <FlatList
      key={item => item.id}
      data={this.state.data}
      dataExtra={{ phase, opacityOfSelectedItem }}
      keyExtractor={item => item.id}
      renderItem={this.renderItem}
    />

  </View>
);

【问题讨论】:

    标签: reactjs react-native fetch


    【解决方案1】:
    fetch('myurl', {
      method: 'POST',
      headers: {
        Accept: 'application/json',
        'Content-Type': 'application/json',
      },
      body: JSON.stringify({
        token: this.state.token,
      }),
    })
      .then(response => response.json())
      .then((data) => {
        this.setState({
          data: data.routes,
          loading: false,
        });
      })
      .catch((error) => {
        console.error(error);
      });
    

    【讨论】:

    • 是的,感谢您指出这一点。但由于某种原因,react-native 中的响应如下所示:{ type: 'default', status: 200, ok: true, statusText: undefined, headers: { map: { 'content-type': 'application/json' ,日期:'星期六,2018 年 10 月 27 日 21:33:58 GMT','content-encoding':'gzip','content-length':'992',变化:'Accept-Encoding,User-Agent',' x-powered-by': 'PHP/7.1.23', 'x-ratelimit-limit': '60' } }, url: 'myurl', _bodyInit: '{"routes":[{"id":15 "uuid":"bdc31630-d7db-11e8-b45f-d76be65679f3"...
    • 当我使用 Postman 调用 API 时,它会返回,如我在问题中所述。
    • 哇,非常感谢!我想我需要更多地使用 react-native 才能真正抓住这一点。但再次感谢,你是生命的救星。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-26
    • 2018-01-17
    • 2016-05-20
    • 2019-12-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多