【问题标题】:REACT NATIVE : How to fetch API data (JSON) and insert into Flatlist, API ImageREACT NATIVE:如何获取 API 数据 (JSON) 并插入到 Flatlist、API Image
【发布时间】:2021-02-13 15:07:31
【问题描述】:

大家好,我从 https:list of all breeds, and inserted already into FlatList 得到API data,现在我想insert their picture from : 这里附上what i did already的截图:

useEffect(() => {

            
  [2]: https://i.stack.imgur.com/6e7IW.jpg

【问题讨论】:

  • 您是否尝试在外部测试 API 并确保它确实适用于其他项目?
  • 我没有得到你的问题,你的意思是它是否工作正常,但只是无法为每个品种自己的图片获取它
  • 您的图像 URI 从 dog API 返回一个 JSON“图像列表”。此 URL 不返回图像。正常吗?
  • 那么我该如何转换呢?你有什么想法吗?

标签: javascript reactjs react-native react-redux


【解决方案1】:

我无法真正测试下面的内容,因为我不知道您的 collapse 组件来自哪里,但这是我认为的工作流程:

const [breedImage, setBreedImage] = useState();

useEffect(() => {
  fetch('https://dog.ceo/api/breeds/list/all')
    .then((response) => response.json())
    .then((json) => setData(Object.keys(json.message)))
    .catch((error) => console.error(error))
    .finally(() => setLoading(false));
}, []);

const getImage = breedId => {
  // Do you call to get the image
  return fetch(...)
  .then(result => {
    // ...Do your things
    // Set your image in a local state
    setBreedImage(result);
  });
}

return (
  <View style={styles.container}>
  {isLoading ? <ActivityIndicator/> : (
      <FlatList
        data={data}
        keyExtractor={({ id }, index) => index.toString()}
        renderItem={({ item }) => (

          <Pressable onPress={() => getImage(breedId)}>
          <Collapse>
          {breedImage &&
            (
              <CollapseHeader>
                <Card title="Local Modules">
                  <Text>{item} </Text>
                </Card>
              </CollapseHeader>

              <CollapseBody style={{alignItems:'center',justifyContent:'center',padding:10}}>
                <Card title="Local Modules">
                <Image
                    style={styles.tinyLogo}
                    source={{ 
                      uri: breedImage,
                    }}
                  />
                </Card>
              </CollapseBody>
            )}
          </Collapse>
          </Pressable>
        )}
      />
    )}
  </View>
  
);

这个想法是当您单击一个品种时触发另一个 api 调用(请参阅可能是 TouchableOpacity 或其他东西的&lt;pressable ... /&gt;),当它被加载时,您可以显示图像。

现在,请注意,这取决于折叠组件的行为方式。如果你触发了一个渲染,collpase 可能会自行关闭,所以你需要用你的代码对其进行测试。

此外,您可以通过在 getImage 运行时显示加载程序来改进这一点。例如,如果 api 调用太长,则实现第二个加载器。

【讨论】:

  • 这里例如折叠不是那么重要,我可以删除它们并只放置文本和图像,但问题是我无法将每张图片提取到每个品种平面列表中
  • 是的,但您可以默认显示 api 返回的第一张图像。如果您检查 imge url 的列表,它们都是关于 retriever-chesapeake 的,这是列表的第一个元素(当您要求 retriever 品种时),所以这不是问题。现在,如果它不符合您的需求,您将不得不创建一个品种的子列表,以便您可以获得相应的图片(您仍然需要获得第一张图片,因为一个子品种有多个图像)
  • 天哪,为什么这么难(无论如何,谢谢!
  • @Feliks_JS 是的,有时 API 并不能让前端开发人员的生活变得轻松,但我可以向您保证,大多数时候它是强制性的。对于您的应用程序,这取决于您想向用户提供多少信息。你必须做一些选择,关于你将展示什么以及你将如何做。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-25
  • 2021-09-09
  • 2020-04-16
  • 1970-01-01
相关资源
最近更新 更多