javascript - 无法读取未定义的属性 'map' (ReactJS-Apollo-Graphql)

标签 javascript reactjs graphql react-apollo map-function

我正在尝试使用 React JS 创建一个虚拟项目,并且我从 SpaceX Graphql API 获取数据。我有两个组件(主页、详细信息),这两个组件都应该从 API 获取数据。但是,我查询在“主页”组件中有效,但在“详细信息”组件中不起作用。我用了完全相同的方法,但似乎不起作用。请帮我解决这个问题。

您可以在 https://github.com/affiqzaini/react-apollo-spacex 尝试整个操作。如果你愿意的话。

这是我的主页组件,它可以工作:

import React from 'react';
import { Query } from 'react-apollo';
import gql from 'graphql-tag';
import { BrowserRouter, NavLink } from 'react-router-dom';
import Route from 'react-router-dom/Route';
import 'react-bulma-components/dist/react-bulma-components.min.css';
import './App.css';
import Details from './Details';

const POSTS_QUERY = gql`
  {
    rockets {
      name
      country
      id
    }
  }
`;

function Home() {
  return (
    <BrowserRouter>
      <Route
        path='/'
        exact
        strict
        render={() => {
          return (
            <div
              className='tile is-ancestor'
              style={{
                justifyContent: 'space-evenly',
                alignItems: 'center',
                margin: 25
              }}
            >
              <Query query={POSTS_QUERY}>
                {({ loading, data }) => {
                  if (loading) return <p className='Loading'>Loading...</p>;
                  const { rockets } = data;
                  return rockets.map(post => (
                    <NavLink to={{ pathname: `/${post.id}` }}>
                      <div class='tile is-parent'>
                        <article
                          class='tile is-child box'
                          key={post.id}
                          style={{
                            backgroundColor: 'whitesmoke',
                            borderRadius: 10,
                            height: 400,
                            width: 300
                          }}
                        >
                          <figure
                            class='image container is-1by1'
                            style={{ marginBottom: 15 }}
                          >
                            <img
                              src={require(`./Images/${post.id.toString()}.jpg`)}
                              className='Rocket-Img'
                              alt='Rocket'
                            />
                          </figure>
                          <h2>{post.name}</h2>
                          <h4>{post.country}</h4>
                        </article>
                      </div>
                    </NavLink>
                  ));
                }}
              </Query>
            </div>
          );
        }}
      />
      <Route path='/:id' exact strict component={Details} />
    </BrowserRouter>
  );
}

export default Home;

这是我的详细信息组件,该组件不起作用:

import React from 'react';
import { useParams } from 'react-router';
import { Query, ApolloProvider } from 'react-apollo';
import gql from 'graphql-tag';
import ApolloClient from 'apollo-boost';
import './App.css';

function Details() {
  const rocketId = useParams();
  const QUERY_ROCKET = gql`
    {
      rocket(id: "${rocketId}") {
        id
        active
        boosters
        company
        cost_per_launch
        name
        stages
        success_rate_pct
        type
        wikipedia
        first_flight
        country
        description
      }
    }
  `;

  return (
    <Query query={QUERY_ROCKET}>
      {({ loading, data }) => {
        if (loading) {
          return <p className='Loading'>Loading...</p>;
        } else {
          const { detailsData } = data;
          return detailsData.map(post => (
            <div>
              <p>{post.id}</p>
            </div>
          ));
        }
      }}
    </Query>
  );
}
export default Details;

这是我收到的错误: Error Image

更新: 我发现我在两个查询中得到了不同类型的数据。在 Home(有效)中,我得到了一组数据。在我的详细信息组件中,我得到一个对象。这就是我无法使用 map 功能的原因吗?

最佳答案

根据查询文档https://www.apollographql.com/docs/react/v2.5/essentials/queries/ 此后您不需要使用“else”:

if (loading) return <p className='Loading'>Loading...</p>;

并且您不会在有效的 Home 组件中执行此操作。尝试在“详细信息”组件中也删除“else”:

<Query query={QUERY_ROCKET}>
  {({ loading, data }) => {
    if (loading) return <p className='Loading'>Loading...</p>;
    const { detailsData } = data;
    return detailsData.map(post => (
      <div>
        <p>{post.id}</p>
      </div>
    ));
  }}
</Query>

关于javascript - 无法读取未定义的属性 'map' (ReactJS-Apollo-Graphql),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60861832/

相关文章:

javascript - 比较和匹配两个对象列表时防止结果列表重复

javascript - 无法为动态创建的图像分配样式

reactjs - default.auth(...).collection 不是函数

JavaScript/GraphQL 有条件地添加片段

javascript - 在 react 中将 FormData 从模态发送到父组件的方法

javascript - Cordova 6.5.0 无法使用 cordova-plugin-media 录制音频失败重命名/存储/模拟/0/tmprecording-1489806941198.3gp

reactjs - React Formik 给出 Cannot read properties of undefined (reading 'fullName') 错误

css - 如何在使用 Material UI 的 React 中设置全局字体颜色

python - 在 django-graphql-jwt 中使用 @login_required 进行查询/变更会导致 graphql.error.located_error.GraphQLLocatedError

java - 如何为GraphQLObjectType的GraphQLList定义Relay片段?