【问题标题】:Getting image.map is not a function error while trying to render search list尝试呈现搜索列表时获取 image.map 不是函数错误
【发布时间】:2019-07-30 13:44:45
【问题描述】:

当我尝试对从父组件获取的图像进行 .map 以渲染从 unsplash 获取的图像时,出现类型错误 .map 不是函数错误。 我已经附上了问题的代码。 如果错误得到解决,则意味着显示搜索栏中的图像

import React, { useState } from 'react';
        import axios from 'axios';
        import SearchBar from '../SearchBar/SearchBar';
        import ImageList from '../ImageList/ImageList';

        const API_KEY = process.env.REACT_APP_ACCESS_KEY;

        const SearchPage = () => {
          const [searchText, setSearchTerm] = useState('');
          const [image, setImage] = useState([]);

          const onInputChange = (e) => {
            setSearchTerm(e.target.value);
          };

          const fetchImages = () => {
            axios.get('https://api.unsplash.com/search/photos', {
              params: { query: searchText },
              headers: {
                Authorization: API_KEY,
              },

            })
              .then((data) => {
                setImage(data.data);
              });
          };
          console.log(image);
          const onSubmitHandler = (e) => {
            e.preventDefault();
            fetchImages();
          };

          return (
            <div>
              <SearchBar
                onSubmitHandler={onSubmitHandler}
                onInputChange={onInputChange}
                searchText={searchText}
              />

              <ImageList image={image} />

            </div>

          );
        };
        export default SearchPage;
    ---------------------------------------------------------------------
    /* eslint-disable jsx-a11y/alt-text */
    /* eslint-disable react/prop-types */
    import React from 'react';

    const ImageList = ({ image }) => {
      const imgs = image && image.map(img => (
        <img
          key={img.id}
          src={img.urls.regular}
        />
      ));
      return (
        <div>
          {' '}
          {imgs}
          {' '}
        </div>
      );
    };

    export default ImageList;

当我尝试对从父组件获取的图像进行 .map 以渲染从 unsplash 获取的图像时,出现类型错误 .map 不是函数错误。 我已经附上了问题的代码。 如果错误得到解决,则意味着显示搜索栏中的图像

【问题讨论】:

  • 尝试console.log图片属性
  • 首先,尝试移除 axios 调用,如果没有错误显示,这意味着问题出在该调用的响应中。之后,在 axios 调用中,添加 console.log(data.data) 并将您看到的内容添加到您的问题中
  • 与 Unsplash 中的图像数组相同

标签: reactjs api axios


【解决方案1】:

因为你有异步调用,需要在.map之前检查一下。

  const imgs = image && image.map(img => (
    <img
      key={img.id}
      src={img.urls.regular}
    />
  ));

或者您可以将image 的默认值设置为一个数组。

// default value as an array []
const ImageList = ({ image = [] }) => {
  const imgs = image.map(img => (
    <img
      key={img.id}
      src={img.urls.regular}
    />
  ));
  return (
    <div>
      {' '}
      {imgs}
      {' '}
    </div>
  );
};

这可能不起作用,具体取决于父组件中image 的默认值。

更好的方法是将useState 的默认值设置为[]

const [image, setImage] = useState([])

编辑:

正如 OP 在 cmets 中所说的

我已经将父组件中的图像初始化为一个空数组。

所以这意味着当你做setImage(data.data);时,data.data 不是一个数组

请检查data.data 中的内容(可能使用console.log)并使用您想要使用.map 的正确数据。

【讨论】:

  • 我已经将父组件中的图像初始化为一个空数组。
  • @SImonHaddad 请检查我的编辑。如果它已经被初始化为一个空数组,这意味着data.data 可能不是一个数组。请检查一下
  • 我 console.logged 图像,它正在返回一个数组
  • 不,还是一样的问题,看来是从函数 .map 现在粘贴代码了
【解决方案2】:

使用 map 的一个好习惯是检查要映射的 Array 的一致性。因此,您可以进行简单的比较,以获得一致的字段数组 =]

只改变你的 ImageList 组件

const ImageList = ({ image }) => {

    const getImgs = () => (image.map(img => (
        <img
            key={img.id}
            src={img.urls.regular}
        />
    )));

    const imgs = typeof {} === 'object' && {}.length > 0 ? getImgs : <div>No images</div>;

    return (
        <div>
            {' '}
                {imgs}
            {' '}
        </div>
    );
};

【讨论】:

  • 它没有显示图像。所以我控制台记录了父组件中的类型图像,它显示了对象
  • 是的,我明白了。在我只回答如何获得地图一致性的情况下,我忽略了渲染测试。但是,如果解决的问题很好,我将始终尽力提供帮助!拥抱!
猜你喜欢
  • 2015-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-01
  • 1970-01-01
相关资源
最近更新 更多