How do I create a statically generated header for nextJS

Viewed 1354

I want to statically generate my navbar, so that it does not need to fetch from client side.

I am using appollo graphql and my current _app.js looks like this:

import React from 'react';
import Head from 'next/head';
import { ApolloProvider } from '@apollo/react-hooks';
import withData from '../utils/apollo';
import Header from '../components/Header';
import '../assets/css/tailwind.css';

const App = (props) => {
    const { Component, pageProps, apollo } = props;
    return (
        <ApolloProvider client={apollo}>
            <Head>
                <title>...</title>
                <meta name="viewport" content="initial-scale=1.0, width=device-width" />
                <meta charset="utf-8"></meta>
            </Head>
            <Header />
            <Component {...pageProps} />
        </ApolloProvider>
    );
};

export default withData(App);

And my Header component looks like this

import React, { useEffect, useState } from 'react';
import Link from 'next/link';
import Query from '../components/query';
import CATEGORIES_QUERY from '../apollo/queries/category/categories';

const Header = () => {
    const [isExpanded, setIsExpanded] = useState(false);
    const expandedClasses = isExpanded ? 'flex ' : 'hidden ';

    return (
        <Query query={CATEGORIES_QUERY} id={null}>
            {({ data: { categories } }) => {
                return (
                    <React.Fragment>
                        <nav
                            className={`${expandedClasses}`}
                        >
                            {categories.map((category, i) => {
                                return (
                                    <Link
                                        href="/category/[cid]"
                                        as={`/category/${category.id}`}
                                        passHref
                                        key={`nav-link-${i}`}
                                    >
                                        <a className="text-gray-800">
                                            {category.name}
                                        </a>
                                    </Link>
                                );
                            })}
                        </nav>

                        <button
                            className="flex"
                            onClick={() => {
                                setIsExpanded(!isExpanded);
                            }}
                        >
                            <span className="mb-1 bg-orange-500"></span>
                            <span className="mb-1 bg-orange-500"></span>
                            <span className="mb-1 bg-orange-500"></span>
                        </button>
                    </React.Fragment>
                );
            }}
        </Query>
    );
};

export default Header;

Next.js only allows getStaticProps on page components, I am trying to get a similar functionality on my Header Component. I tried adding getStaticProps on header component and also on _app.js that did not work. How can I achieve this?

1 Answers
Related