使用useState React Native将获取数据传递给组件

时间:2020-02-17 20:49:36

标签: javascript react-native react-hooks fetch-api use-state

我是React Native的新手。其实这是我的第一个应用。

我一直试图将数据从Fetch传递到组件,但是在那里没有运气。我已经上下左右地研究了Google,尝试了上百万种方法,但仍然行不通。

这是我的App.js

import React, {useState, useEffect} from 'react';
import { View, StyleSheet, ScrollView } from 'react-native';

import Header from './parts/header';
// import BigNews from './parts/big-news';
import Index from './screens/index.js';

const authorization = { authorization: '1234aa' };

export default function App() {
  const [fetchApiData, setApiData] = useState();

  useEffect(() =>
  fetch('https://example.com/get-app-home.php', {
    method: 'POST', // or 'PUT'
    headers: {
      'Content-Type': 'application/json',
    },
    body: JSON.stringify(authorization),
  })
  .then(res => res.json())
  .then(res => {
    this.setState({ setApiData: res })
  })
  .catch(() => this.setState({ hasErrors: true }))
  );
  return (
    <View style={styles.viewport}>
      <Header />
      <ScrollView style={styles.contentHolder}>
        <Index content={fetchApiData}/>
      </ScrollView>
    </View>
);


}

这是我的index.js文件

import React from 'react';
import { View, Text } from 'react-native';

import BigNews from '../parts/big-news';
import SmallNews from '../parts/small-news';
import Colors from '../constants/colors'

const Index = props => {

    return (
      <View>
        <BigNews
        image={props.content.first.image}
        pretitle={props.content.first.pretitle}
        title={props.content.first.title}
        introduction={props.content.first.introduction}
        style={{color: props.content.first.mark}}/>

        <SmallNews
        image={props.content.second.image}
        pretitle={props.content.second.pretitle}
        title={props.content.second.title}
        style={{color: props.content.first.mark}}/>

        <SmallNews
        image={props.content.second.image}
        pretitle={props.content.second.pretitle}
        title={props.content.second.title}
        style={{color: props.content.first.mark}}/>

        <SmallNews
        image={props.content.second.image}
        pretitle={props.content.second.pretitle}
        title={props.content.second.title}
        style={{color: props.content.first.mark}}/>
      </View>
    );
}
export default Index;

我不断收到TypeError:undefined不是一个对象(正在评估'props.content.first')

我尝试了数百万种方法,但大多数情况下这是我所看到的错误。如果我执行console.log状态,则会得到未定义或为空。

2 个答案:

答案 0 :(得分:1)

您没有为类组件设置数据this.setState。将this.setState替换为setApiData()

useState返回初始状态和更新该值的功能。

const [ hasError, setHasErrors] = useState(false);

.then(res => res.json())
.then(res => {
  setApiData(res)
})
.catch(() => setHasErrors(true))
);

正如George指出的那样,初始状态设置为空,执行props.content.first.image将导致错误。将初始值设置为类似

的对象
const [ fetchApiData, setApiData ] = useState({
   first: {},
   second: {}
});

或验证组件中的值。

const Index = props => {

  return (
   <View>
    <BigNews
    image={props && props.content && props.content.first && props.content.first.image}
    pretitle={props && props.content && props.content.pretitle && props.content.first.pretitle}
    title={props && props.content && props.content.title && props.content.first.title}
    introduction={props && props.content && props.content.introduction && props.content.first.introduction}
    style={{color: props && props.content && props.content.first && props.content.first.mark}}/>

    ...
  </View>
  );
}
export default Index;

答案 1 :(得分:1)

Index组件中,content道具最初是未定义的,因为您没有将任何值(通常称为“初始状态”)传递给函数中的useState函数App组件。

相反,请尝试:

const [ fetchApiData, setApiData ] = useState({
    first: {},
    second: {}
});

请注意,我已经用firstsecond项填充了初始状态,因为尝试访问树中更下方的元素(imagepretitle,等)仍会引发错误。