【问题标题】:Map is not a function when passing data to populate child component传递数据以填充子组件时,映射不是函数
【发布时间】:2020-12-25 14:05:57
【问题描述】:

下面我有一个父反应组件,其中包括一个子组件,我将通过迭代响应数据来填充子组件的数量。

在我尝试映射时的渲染中,它显示 ma​​p 不是函数。

export default class Products extends Component {
  state = {
    allComics: []
  };

 
  render() {
    return (
      <section className=" py-4 py-lg-6">
        <div className="site-content" id="content">
          <div className="container">
            <div className="row">
              <div id="primary" className="content-area order-2">
                <div className="shop-control-bar d-lg-flex justify-content-between ">
                  <h5>Showing 1–12 of 126 results</h5>
                  <ul
                    class="nav justify-content-md-center nav-gray-700 mb-5 flex-nowrap flex-lg-wrap overflow-auto overflow-lg-visible"
                    role="tablist"
                  >
                    <li class="nav-item mx-2 mb-1 flex-shrink-0 flex-lg-shrink-1">
                      <div style={{ minWidth: 280 }}>
                        <Select options={category} defaultValue={category[0]} />
                      </div>
                    </li>
                    <li class="nav-item mx-2 mb-1 flex-shrink-0 flex-lg-shrink-1">
                      <div style={{ minWidth: 280 }}>
                        <Select options={universe} defaultValue={universe[0]} />
                      </div>
                    </li>
                  </ul>
                </div>

                <div className="tab-content" id="pills-tabContent">
                  <div
                    className="tab-pane fade show active"
                    id="pills-one-example1"
                    role="tabpanel"
                    aria-labelledby="pills-one-example1-tab"
                  >
                    <ul className="products list-unstyled row no-gutters row-cols-2 row-cols-lg-3 row-cols-xl-5 border-top border-left mb-6">
                      {
                      this.state.allComics.map((comic) => (
                        <div key={comic.id}>
                          <AllProductsProduct
                            key={comic.id}
                            data={comic}
                            onNavigate={() => this.navigateToComic(comic.id)}
                          />
                        </div>
                      ))}
                    </ul>
                  </div>
                </div>
              </div>
            </div>
          </div>
        </div>
      </section>
    );
  }

  async componentDidMount() {
    let {comicData} = await axios.get("http://localhost:5000/allcomics");
    console.log(comicData);
    let state = "";
    if (comicData) {
      state = comicData.map((comic) => {
        return {
          id: comic._id,
          seriesname: comic.seriesname,
          issuenumber: comic.issuenumber,
          description: comic.name,
          imageref: comic.imageref,
        };
      });
    }
    console.log(state);
    console.log(this.state.allComics);
    this.setState({ allComics: state });
  }

  async navigateToComic(comicId) {}
}

我在这里得到的响应是这样的

[
    {
        "_id": "5f5468fbc0c3f82c586b14d8",
        "seriesname": "Dr Doom",
        "issuenumber": 1,
        "description": "THE CRACK OF DOOM!",
        "imageref": "https://res.cloudinary.com/sdjsandssadsadsa/dsadsa",
        "publishdate": "2020-09-06T04:43:39.566Z"
    },
    {
        "_id": "5f5497151cc5391a9ce88420",
        "seriesname": "Dr Doom",
        "issuenumber": 2,
        "description": "THE CRACK OF DOOM!",
        "imageref": "https://res.cloudinary.com/sdjsandssadsadsa/dsadsa",
        "publishdate": "2020-09-06T08:00:21.384Z"
    },
    {
        "_id": "5f54972d1cc5391a9ce88421",
        "seriesname": "Dr Doom",
        "issuenumber": 3,
        "description": "THE CRACK OF DOOM!",
        "imageref": "https://res.cloudinary.com/sdjsandssadsadsa/dsadsa",
        "publishdate": "2020-09-06T08:00:45.452Z"
    }
]

【问题讨论】:

  • comicData 是字符串吗?如果是这样,则需要先将其解析为数组
  • 就在你之前 return 在你的渲染函数中,当你 console.log("--&gt;",this.state.allComics); 时你会得到什么
  • 尝试使用componentDidMount中的数组初始化state:let state = [];
  • 调试您的代码,检查comicData 的确切值。我不太确定为什么您的代码中有解构:let {comicData} = await axios.get(),通常所有数据都在响应的data 属性中传递。也许你的意思是let { data: comicData } = await axios.get(...)?
  • 我将它映射到它的 response.data 并且我启动了组件内部的状态确实像 Ericgio 所说的那样挂载

标签: javascript reactjs axios


【解决方案1】:

在componentDidMount 中,您正在使用字符串初始化state:

let state = "";

如果comicData 是假的,你最终会用字符串而不是数组来设置你的状态,并且字符串没有map 方法。要解决此问题,请改为使用数组初始化 state:

let state = [];

或者,由于您的组件状态已经初始化,请将 setState 调用移到条件中,以便仅在有数据时设置它:

async componentDidMount() {
  let {comicData} = await axios.get("http://localhost:5000/allcomics");

  if (comicData) {
    let state = comicData.map((comic) => {
      return {
        ...
      };
    });

    this.setState({ allComics: state });
  }
}

【讨论】:

  • 这行得通,我正在获得comicData.data 中的数据
猜你喜欢
  • 1970-01-01
  • 2019-08-16
  • 2011-04-18
  • 2021-09-25
  • 1970-01-01
  • 2020-01-05
  • 1970-01-01
  • 2014-09-17
  • 2018-08-05
相关资源
最近更新 更多