frontity
API reference of `frontity` package
Apart from being the package that executes the Frontity commands in the terminal, frontity
also exports functions, objects, etc. to be imported and used by other Frontity packages.
You can import any of these utils using:
Table of Contents
Overview
React
Use connect
to inject state
, actions
and libraries
in your React components.
If you are familiar with React hooks, you can use also useConnect
to do the same.
Use the Head
component whenever you want to add HTML tags inside the <head>
of any of your site's pages. You can read more in the Head page of the Core Concepts section.
Use the Slot
component whenever you want to add a 'placeholder' to your theme which will be filled with a Fill
. Fills are added to the state in the state.fills
namespace.
CSS in JS
styled
creates new React components from HTML tags, or other React components, with styles attached to them. css
lets you to add inline styles to an element if you don't want to create a new component. If you want to add styles for the whole app, use Global
. And keyframes
is used to define and use animations in your CSS.
You can read more in the Styles page of the Core Concepts section of the docs.
Code Splitting
Use loadable
in order to separate you code into different bundles that will be dynamically loaded at runtime. This helps you to reduce your page size.
You can read more in this Code Splitting page of the docs.
fetch
and URL
fetch
and URL
Frontity exports fetch
and URL
with the same API they have in the browser, but they work the same both in the client and in the server.
API Reference
connect
connect
It's a function that receives a React component and returns the same component but connected to the Frontity state, actions and libraries. Any instance of that component will receive three new props: state
, actions
and libraries
, allowing the component to read the state, manipulate it through actions or use any code other packages have exposed in libraries.
Also, that instance will re-render automatically whenever any value from the state
which the component is using is changed.
If you don't want to inject the Frontity state props in your connected components, you can use the injectProps
option set to false
. Components will still be reactive to changes in the state but without receiving more props.
For these components to access the state use the useConnect
hook.
Syntax
Arguments
Name
Object Property
Type
Required
Description
Component
React component
yes
Link representing a REST API endpoint or custom handler
options
object
no
options object
options
injectProps
boolean
-
If false
, the state
, actions
and libraries
won't be passed as props to the component. Default is true
Return value
The same component as passed in as the first argument but connected to the Frontity state
Example
useConnect
useConnect
It's a React hook that returns the Frontity state, allowing the component to consume state
, actions
and libraries
in components without passing them as props.
You still need to use connect
when using useConnect
properly.
By using connect
:
Your components get optimized with memo, so they won't re-render whenever a parent component re-renders
Your components get reactive, so they will re-render when the parts of state they use are changed
Syntax
Return value
The Frontity state (
state
,actions
andlibraries
)
Example
Use Case of { injectProps: false }
with connect
{ injectProps: false }
with connect
Most of the times you'll use useConnect
in this way:
But if you want to pass down props to a HTML tag, like in this case:
You'll end up passing actions
and libraries
to <input>
as well, because they are injected by connect
.
To avoid this you can:
Add
{ injectProps: false }
toconnect
Use
const { state, actions, libraries } = useConnect();
styled
styled
styled
is a function that receives an HTML tag or a React component as the argument and returns a function that can be used as a tagged template literal. Inside, you write the CSS code for your component.
The styled
tag function returns a styled component with the CSS you wrote.
Also, styled
has built-in tag functions for every HTML tag so in those cases it is not necessary to call styled
directly.
Syntax
Arguments
A template literal containing CSS code
Return value
A React component with the styles defined
Example
css
css
It's a tagged template literal to add an inline style to React Components.
The usage is quite similar to styled
except that css
doesn't return a React Component but a special object that can be passed to a component through the css
prop.
Syntax
Arguments
A template literal containing CSS code
Return value
A style object to be passed to a
css
prop or to the<Global>
'sstyles
prop
Example
Global
Global
It's a React component that creates global styles for the whole Frontity site.
Using <Global>
for other than HTML tags is not recommended because Frontity is not able to optimize it. That means you can use it for tags like html
, body
, a
, img
, and so on... But avoid it for classes. Use either the CSS prop or styled-components instead.
Syntax
Props
styles
: an style object created withcss
Example
keyframes
keyframes
It's a function used to define and use animations in your CSS.
Syntax
Arguments
A template literal containing CSS @keyframes code
Return value
Example
loadable
loadable
It's a function that loads a component asynchronously generating a different bundle for it. Frontity has integrated and configured Loadable Components, in case you want to check its docs.
You can also take a look at the Code Splitting page of the docs.
Syntax
Arguments
Name
Object Property
Type
Required
Description
importFunction
function
yes
a function that executes a dynamic import and returns a Promise
that will contain the imported module
options
object
no
options object
options
fallback
React component
-
component displayed until the Promise
resolves
options
ssr
boolaan
-
if false
, it will not be processed server-side (default to true
)
Return value
A React component
Example
Head
Head
Syntax
It's a React component that injects their children in the HTML <head>
tag. It allows you to change the title while navigating, add meta tags, scripts, etc.
As we use react-helmet
under the hood, you may check its reference guide.
Props
children
: the HTML tags you want to appear inside<head>
Example
useFills
useFills
A React hook to ease the creation of Slot
components.
Syntax
Arguments
Name
Type
Required
Description
slotName
string
yes
A string that refers to the name of the Slot.
Return value
Fill[]
An array of configuration objects for the fills that want to fill the slot passed by the slotName
parameter. The values in those objects will come from the fills defined by the user of the slot in state.fills
.
Mind that a user might define more than one fill for a particular slot. Because of this, we always return a list of slots sorted in ascending order by their priority
.
Each configuration object has this structure:
Name
Type
Description
Fill
ReactComponent
The component that should be rendered for this fill.
slot
string
The name of the slot. Mind that a user can define multiple fills that fill the same slot, so there might exist more than one object with the same slot
property. Defined in state.fills.namespace.fillName.slot
.
props
object
The props that should be passed down to the component. Defined in state.fills.namespace.fillName.props
.
library
string
The name of the library that is using the fill. defined in state.fills.namespace.fillName.library
.
priority
number
The priority of the fill. By default, the fills are sorted in ascending order according to this value. Defined in state.fills.namespace.fillName.priority
.
key
string
This is a unique value that identifies the particular fill. It's a combination of the namespace
and the fillName
.
Example
Import the hook in your React component and use it to create a component:
You need to wrap the component that uses the useFills
hook with connect()
in order for that component to work.
Debug mode
If you want to see all the slots added to a theme/package without having to add fills for all of them, you can turn the debug mode on:
If you want to do this on the console, remember that you need to access the state
using frontity.state
, like this:
fetch
fetch
It's a function with the WHATWG API for fetching a resource from the network.
This function is safe to use both server and client-side, but you have to import it first.
Syntax
Arguments
Name
Type
Required
Description
resource
string
yes
a string containing the direct URL of the resource you want to fetch
init
object
no
an options object containing any custom settings that you want to apply to the request (go to this link for the complete list of available settings)
Return value
A
Promise
that resolves to aResponse
object
Example
URL
URL
Syntax
It's a constructor with the WHATWG API to create URL
objects.
This constructor is safe to use both server and client side, but you have to import it first.
Arguments
Name
Type
Required
Description
url
string
yes
Absolute or relative URL.
base
string
If url
is a relative URL, base
is required
Base URL to use in case url
is a relative URL
Return value
A
URL
object
Example
error
& warn
error
& warn
The frontity
package exports an error
and warn
helpers to be used by package developers when they need to either throw an error or log a warn in the console.
error
error
This error
method throws an error. In development, it adds a message that encourage users to visit the Frontity community if they need help.
Syntax
Arguments
Name
Type
Required
Description
message
string
yes
The message that describes the error.
options
object
no
Options object.
options.throw
boolean
no
Indicate if the function should throw or just log the error in the console using console.error
.
warn
warn
Logs a warning in the console, adding a message that indicates users to visit the Frontity community if they need help. It's intended to be used by Frontity packages.
Syntax
Arguments
Name
Type
Required
Description
message
string
yes
The message that describes the warning..
decode
decode
An entity decoder that decodes HTML numeric entities and XML named entities. It works both in the server and the client and it's optimized to be both lightweight and performant.
Syntax
Arguments
Name
Type
Required
Description
text
string
yes
HTML to be escaped.
Return value
string
Example
Slot
Slot
The <Slot />
component enables the use of a powerful pattern called Slot and Fill. This allows for any React component to be inserted into, or hooked onto, different places within the app, thereby improving extensibility.
This component allows a theme developer to insert named <Slot>
components in various places in a theme. Other package developers are then able to add 'fill' components which will be hooked onto the named slots.
Rationale
When developing a site the developer is often required to make certain customisations to the structure and/or appearance of the site. This can be difficult to do and necessitates modifying the core code of the theme.
Theme developers are able to facilitate such customisations by adding <Slot />
components at various places in the theme, e.g. above the header, below the header, before the content, etc...
These 'slots' can then be filled with custom components that have been added by the site developer and which are then 'hooked' onto a particular 'slot' to insert the content in that place on the page.
An example might be as follows - the site developer wants to place a third party ad above the content of each page. The theme developer has thoughtfully provided a slot in that position in the theme:
The site developer is now able to 'hook' a component that returns an ad onto that slot, so that the ad gets rendered in that position on the page. This component is referred to as a 'fill'.
Syntax
or
Props
All the following props can be passed to the <Slot/>
component.
Name
Type
Default
Required
Description
name
string
undefined
yes
The name of the Slot. The user of this Slot will have to specify this name in order to insert a Fill component.
children
ReactNode
undefined
no
The component that will be used as a fallback in case that no fill is specified for a particular Slot. You can use any type of data that is a valid React element.
data
ReturnType
state.source.get(state.router.link)
no
Any data that you might want to pass to the Fill. Normally used for passing route data fetched in the parent component. If you don't pass any value, the <Slot/>
component will set the value of this prop to state.source.get(state.router.link)
for you automatically.
any other prop
any
undefined
no
Any other custom prop. The theme can specify other props and they will be passed down to the Fill.
Examples
The simplest example of a Slot would be:
Slots can also pass data to the Fill
components that will be inserted in place of those slots:
Slots can also pass arbitrary props to the Fill
components that will be inserted in place of those slots. In this example we're using 'index' to pass the value of index
to the Fills:
The Slot component supports optional children that are rendered if no fills are present. You can use any type of data that is valid as a react element:
Fills
Fills are added to the state
, to a common namespace called fills
. Each fill consists of a configuration object that should be given a unique key and assigned to a namespace. To learn more about namespaces see this section of the docs.
More than one Fill can be hooked onto any single Slot, and these can be ordered according to a priority
attribute assigned to the Fill.
Fills configuration objects structure:
Name
Description
Required
object key
Name of your fill, must be unique.
yes
slot
Name of the slot they want to fill.
yes
library
Name of the component they want to use. This is obtained from libraries.fills
(see below).
yes
priority
Priority of the fill. Default is 10. (lower value means higher priority)
no
props
Object with props that will be passed to the component.
no
Fills configuration objects can have a false value. This is useful if a package creates a fill by default and a user (or another package) wants to turn it off.
The actual components that will be hooked onto a <Slot>
should be exposed in libraries.fills
by Frontity packages. They can be defined anywhere you like, as long as you can import them and pass to libraries.fills
. For example:
Note that libNamespace.ComponentName
here matches the value of state.fills.namespace.nameOfTheFill.library
above. FillComponent
here is the actual component which is defined elsewhere and may be imported. The return value of this component, i.e. FillComponent
, is the content that will be inserted into HTML at the position of the <Slot>
that it is attached to.
Last updated