【问题标题】:Passing params from React-router to query component in Apollo Client 2.1将参数从 React-router 传递到 Apollo Client 2.1 中的查询组件
【发布时间】:2018-09-20 18:57:15
【问题描述】:

如何将路由中的match.params 传递给新的 Apollo 查询组件? 我正在尝试在 Apollo 2.1 之前构建 React 组件并使用新的查询组件来学习如何使用它们。

我之前的代码:

const Post = ({ data: { loading, error, post } }) => {
  if (error) return <h1>Error fetching the post!</h1>
  if (!loading) {
    return (
      <article>
        <h1>{post.title}</h1>
        <div className='Post-placeholder'>
          <img
            alt={post.title}
            src={`https://media.graphcms.com/resize=w:650,h:366,fit:crop/${post.coverImage.handle}`}
          />
        </div>
        <Markdown
          source={post.content}
          escapeHtml={false}
        />
      </article>
    )
  }
  return <h2>Loading post...</h2>
}

export const singlePost = gql`
  query singlePost($slug: String!) {
    post: Post(slug: $slug) {
      id slug title
      coverImage { handle }
      content dateAndTime
    } }`

export default graphql(singlePost, {
  options: ({ match }) => ({
    variables: {
      slug: match.params.slug
    }
  })
})(Post)

这是新代码:

const Post = (slug) => (
  <Query query={singlePost} variables={{slug: slug.match.params.slug}}>
    {({ loading, error, post }) => { 
      if (loading || !post) return <h2>Loading post...</h2>
      if (error) return <h1>Error fetching the post!</h1>
      return (
        <article>
        <h1>{post.title}</h1>
        <div className='Post-placeholder'>
          <img
            alt={post.title}
            src={`https://media.graphcms.com/resize=w:650,h:366,fit:crop/${post.coverImage.handle}`}
          />
        </div>
        <Markdown
          source={post.content}
          escapeHtml={false}
        />
      </article>
      )
    }}
  </Query>
)

export const singlePost = gql`
      query singlePost($slug: String!) {
        post: Post(slug: $slug) {
          id slug title
          coverImage { handle }
          content dateAndTime
        } }`

export default Post;

我 console.log post 得到一个空对象,我 console.log slug.match.params.slug 我得到了 React-router 传递的帖子的 slug。控制台中也没有错误,我得到加载屏幕然后是黑页。 Apollo Dev 工具还会在缓存中显示来自查询的数据。

【问题讨论】:

    标签: javascript graphql react-router-v4 react-apollo apollo-client


    【解决方案1】:

    我认为应该是data,而不是渲染回调中的post

      <Query query={singlePost} variables={{slug: slug.match.params.slug}}>
        {({ loading, error, data /* <=== This one */ }) => {
          console.log(data.post); // I think your post will be in data.post
    

    【讨论】:

    • 谢谢,我真的以为我的问题是没有从路由器正确传递 slug。我解构了data,所以我仍然可以只使用post&lt;Query query={singlePost} variables={{slug: slug.match.params.slug}}&gt; {({ loading, error, data: {post} }) =&gt; {
    猜你喜欢
    • 1970-01-01
    • 2018-02-04
    • 2023-01-24
    • 2018-01-01
    • 2017-10-24
    • 2018-06-27
    • 2018-02-27
    • 2018-09-26
    • 2017-08-28
    相关资源
    最近更新 更多