简体   繁体   English

React Native Deck Swiper

[英]React Native Deck Swiper

I am trying to make a GET request to an enpoint using the two functional components below to display in my react native deck swipper我正在尝试使用下面的两个功能组件向 enpoint 发出 GET 请求,以显示在我的 react native 甲板扫描器中

 //using fetch
const getDataUsingFetch = () => {
 fetch(latestNews+ApiKey)
   .then((response) => response.json())
   .then((responseJson) => {
     // set the state of the output here
       console.log(responseJson);
    setLatestNews(responseJson);
   })
   .catch((error) => {
     console.error(error);
   });
}

  //using anxios
  //asynchronous get request call to fetech latest news
const getDataUsingAnxios = async () => {

    //show loading
    setLoading(true);
    setTimeout(async () => {
      //hide loading after the data has been fetched
    setLoading(false);
    try {
      const response = await axios.get(latestNews+ApiKey);
      setLatestNews(response.data);
                setLoading(false);
        console.log(getLatestNews);
    } catch (error) {
      // handle error
      alert(error.message);
      }
    }, 5000);
};

Data returned when logged from console:从控制台记录时返回的数据:

Array [
  Object {
    "category_id": "8",
    "content": "Hi",
    "created_at": "2020-11-12T12:43:03.000000Z",
    "featured_image": "splash-background_1605184983.jpg",
    "id": 19,
    "news_url": "doerlife.com",
    "title": "I m good how about you",
    "updated_at": "2020-11-12T12:43:03.000000Z",
  }....]

I now save the data into a state array我现在将数据保存到 state 数组中

const [getLatestNews, setLatestNews] = useState([]);

Here is my swipper(some code ommited - not necessary)这是我的 swipper(省略了一些代码 - 没有必要)

  <Swiper
    ref={useSwiper}
    //cards={categoryID(docs, "2")}
    cards={getLatestNews}
    cardIndex={0}
    backgroundColor="transparent"
    stackSize={2}
    showSecondCard
    cardHorizontalMargin={0}
    animateCardOpacity
    disableBottomSwipe
    renderCard={(card) => <Card card={card} />}
    .....

When I try to access any data in the array from my Card reusable component, eg card.featured_image当我尝试从我的卡可重用组件访问数组中的任何数据时,例如card.featured_image

I WILL GET THIS ERROR - TypeError: undefined is not an object (evaluating 'card.featured_image') .我会得到这个错误 - TypeError: undefined is not an object (evaluating 'card.featured_image') PLEASE CAN SOMEONE HELP ME.请有人帮助我。

//Card reusable component for deck swipper
import React from 'react'
import { View, Text, Image, ImageSourcePropType } from 'react-native'
import styles from './Card.styles'
const Card = ({ card }) => (
  <View activeOpacity={1} style={styles.card}>
    <Image
      style={styles.image}
      source={card.featured_image}
      resizeMode="cover"
    />

    <View style={styles.photoDescriptionContainer}>
      <Text style={styles.title}>{`${card.title}`}</Text>
      <Text style={styles.content}>{`${card.content}`}</Text>
      <Text style={styles.details}>
        Swipe Left to read news in details
      </Text>
    </View>
  </View>
);
export default Card

I've done something similar to this before so I think I can help a bit.我以前做过类似的事情,所以我想我可以提供一些帮助。 The problem here is that your getLatestNews state has not been updated yet before the cards render.这里的问题是您的getLatestNews state 在卡片渲染之前尚未更新。 You can fix the problem by having another state called "isDataReturned".您可以通过另一个名为“isDataReturned”的 state 来解决此问题。 Then, have a useEffect that triggers whenever getLatestNews 's length changes.然后,有一个useEffect每当getLatestNews的长度改变时触发。 If getLatestNews 's length is > 0, then you can set isDataReturned to be true and render the deck only when isDataReturned is true.如果getLatestNews的长度 > 0,那么您可以将isDataReturned设置为 true,并且仅在isDataReturned为 true 时才渲染卡片组。

Here's a code sample that I made:这是我制作的代码示例:

const [getLatestNews, setLatestNews] = useState([]);
const [dataIsReturned, setDataIsReturned] = useState(false)

  useEffect(() => {
    const fetchData = async () => {
      const result = await axios(
        'https://cat-fact.herokuapp.com/facts',
      );
      setLatestNews(result.data);
    };

    fetchData();
  }, []);

  useEffect(() => {
    if (getLatestNews.length > 0) {
      setDataIsReturned(true)
    } else {
      setDataIsReturned(false)
    }
  }, [getLatestNews.length])

    if( dataIsReturned === true) {
      return (
      <View style={styles.container}>
         <Swiper
            cards={getLatestNews}
            renderCard={(card) => {
                return (
                  <View style={styles.card}>
                    <Text>{card.text}</Text>
                  </View>
                    
                )
            }}
            onSwiped={(cardIndex) => {console.log(cardIndex)}}
            onSwipedAll={() => {console.log('onSwipedAll')}}
            cardIndex={0}
            backgroundColor={'#4FD0E9'}
            stackSize= {3}>
        </Swiper>
    </View>)
    } else {
     return(<Text>Loading</Text>)
    }

In the renderCard attribute, i changed it from在 renderCard 属性中,我将其从

 renderCard={(card) => <Cardz card={card} />}

to

 renderCard={(card) => (card && <Cardz card={card} />) || null}

and it worked.它奏效了。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM