Frontity Tutorial
  • 👋Welcome
  • ✔️Checking your progress
  • 1️⃣ Creating a custom theme
    • Create a Frontity Project
    • Create a Theme Package
    • Modify the <Root> component
    • Connect the <Root> component to the state
  • 2️⃣ Adding a menu
    • Use the <Link> component
  • 3️⃣ Displaying posts
    • Understanding the Frontity state
    • Display the list of posts
    • Display the post content
    • Display posts and pages separately
    • Formatting the date
  • 4️⃣ Adding styling
    • Global styles
    • Styled components
    • Styling the links
    • Styling the post info
    • Add dynamic styling
  • 5️⃣ Adding behaviour
    • Use 'state' and 'actions'
    • Add pagination
  • 6️⃣ Custom Post Types
    • Add support for Custom Post Types
  • 7️⃣ Finishing touches
    • Add a <Loading> component
    • Add a 404 page
    • Use the <html2react> component
    • SEO and head tags
    • Other things to do
  • 8️⃣ Deploying the project
    • Deploy to Vercel
  • 9️⃣ Next Steps
    • Learning resources
    • Getting help and support
    • Contributing to Frontity
Powered by GitBook
On this page
  1. 7️⃣ Finishing touches

Add a <Loading> component

One great thing about Frontity is that a lot of the content is pre-fetched into the state so page transitions are virtually instant. Sometimes, however, the content is not already in the state and Frontity must fetch it from the WordPress REST API.

Doing this is not instant. You can see this by selecting the About Us menu option. Depending on your network speed you may notice a slight delay and the content area of our page remains empty.

If you're not noticing this delay you could try emulating a slow network connection in the network tab of your browser's Dev Tools.

Also don't forget to reload the home page so that the state is cleared and refreshed.

Whenever there's a delay such as occurs while data is being fetched it's a good idea to indicate to the user that something is actually happening, so let's add a <Loading> component.

Create a new file in the components directory and call it loading.js. Add the following code:

// File: /packages/my-first-theme/src/components/loading.js

import React from "react"
import { styled, keyframes } from "frontity"

const Loading = () => <Spinner />

export default Loading

const spin = keyframes`
  0% { transform: rotate(0deg); }
  100% { transform: rotate(360deg); }
`

const Spinner = styled.div`
  border: 12px solid #eee;
  border-top: 12px solid steelblue;
  border-radius: 50%;
  width: 80px;
  height: 80px;
  animation: ${spin} 2s linear infinite;
`

Here we're passing in the animation frames that we want, and assigning it to a variable spin which we then go on to use in the animation property of our <Spinner> component.

Note that the <Loading> component doesn't need to access the state so we don't need to pass it to the connect higher order component when we export it.

Now we need to display it. Let's add it as the first item in the <Switch> component that's within our <Root> component. Remember that we also need to import the component.

// File: /packages/my-first-theme/src/components/index.js

// ...
import Loading from "./loading"

// ...
  <Main>
    <Switch>
      <Loading when={data.isFetching} />
      <List when={data.isArchive} />
      <Page when={data.isPage} />
      <Post when={data.isPost} />
      <Page when={data.isDestinations} />
    </Switch>
  </Main>
// ...

Now as we transition between pages our loading spinner is displayed whenever data is being fetched in the background. Sweet! 👌

Previous7️⃣ Finishing touchesNextAdd a 404 page

Last updated 4 years ago

As well as styled we also import keyframes from frontity. This function works in a similar way to styled and takes a tagged template literal as it's argument. See for more info.

Frontity in the browser

By the way, our loader was based on .

Check you're on the right track by comparing your changes with .

our docs
the one described here
the ones in this commit