Pikk
Pikk

Reputation: 2743

How to add variables to graphQL query?

I am using Gatsby. I need to increase the limit of 3 to each onCLick. I've tried to follow this post, but with no success, so I removed the edits, and here is the original code...

This will help me to load more posts.

export const LatestNews = ({data}) => {
console.log(data);

  return (
    <section id="news_posts_section">
<p>some data</p>
    </section>
  );
};

export const latestNewsQuery = graphql`
query myquery{
  allMarkdownRemark(
    filter: { frontmatter: { layout: { eq: "news" } } }
    sort: { fields: frontmatter___date, order: DESC }
    limit: 2
  ) {
    nodes {
      frontmatter {
        layout
        title
        path
        date
        featuredImage
        thumbnail
      }
      excerpt(pruneLength: 325)
    }
  }
}
`;

Here is my gatsby-node:

exports.createPages = ({ actions, graphql }) => {
  const { createPage } = actions;

  const blogPostTemplate = path.resolve('src/templates/blog-post/BlogPost.js');
  const newsTemplate = path.resolve('src/templates/news-single/NewsSingle.js');
  const latestNewsPage = path.resolve(
    'src/components/pages-implementation/news/sections/LatestNews.js',
  );

  const blog = graphql(`
    {
      blog: allMarkdownRemark(
        filter: { frontmatter: { layout: { eq: "blog" } } }
      ) {
        edges {
          node {
            frontmatter {
              path
            }
          }
        }
      }
    }
  `).then((result) => {
    if (result.errors) {
      result.errors.forEach((e) => console.error(e.toString()));
      return Promise.reject(result.errors);
    }
    const posts = result.data.blog.edges;

    posts.forEach((edge) => {
      const { path } = edge.node.frontmatter;
      createPage({
        path: path,
        component: blogPostTemplate,
        context: {},
      });
    });
  });

  const news = graphql(`
    {
      news: allMarkdownRemark(
        filter: { frontmatter: { layout: { eq: "news" } } }
      ) {
        edges {
          node {
            frontmatter {
              path
            }
          }
        }
      }
    }
  `).then((result) => {
    if (result.errors) {
      result.errors.forEach((e) => console.error(e.toString()));
      return Promise.reject(result.errors);
    }
    const news = result.data.news.edges;

    news.forEach((edge) => {
      const { path } = edge.node.frontmatter;
      createPage({
        path: path,
        component: newsTemplate,
        context: {},
      });
    });

    
    news.forEach(edge => {
      createPage({
        path: `/news/`,
        component: latestNewsPage,
        context: {
          // This time the entire product is passed down as context
          product: edge
        }
      });
    });


  });

  return Promise.all([blog, news]);
};

Edit 21 November:

With the above configuration it says:

warning The GraphQL query in the non-page component "/home/user/projectname/src/components/pages-implementation/news/sections/LatestNews.js" will not be run.
Exported queries are only executed for Page components. It's possible you're
trying to create pages in your gatsby-node.js and that's failing for some
reason.

Upvotes: 3

Views: 1086

Answers (1)

Ferran Buireu
Ferran Buireu

Reputation: 29320

useStaticQuery (hence the name) does not allow to receive variables. If you take a look at the docs:

useStaticQuery does not accept variables (hence the name “static”), but can be used in any component, including pages

The only way to pass variables in a GraphQL query is by using the context API in the gatsby-node.js. For example:

  queryResults.data.allProducts.nodes.forEach(node => {
    createPage({
      path: `/products/${node.id}`,
      component: productTemplate,
      context: {
        // This time the entire product is passed down as context
        product: node
      }
    });
  });
};

In the snippet above, will be a product variable in the context with the whole node. It can be accessed through pageContext prop in the destination template or used as a query parameter.

Upvotes: 2

Related Questions