Table of Contents
- Add Semantic UI to a React with Semantic UI React
- Use Semantic UI React Components
- Build Authentication Pages with Semantic UI React
- Conclusion
Add Semantic UI to a React App with Semantic UI React
Semantic UI is an open-source framework used to build User Interfaces. It provides a set of UI components and flexible theming support that helps to build web applications. In other words, Semantic UI makes our life easier as we do not have to create components from scratch every time we build web applications. We just need to compose our UI using pre-defined components from the Semantic UI framework and customize them as we like.
However, Semantic UI uses jQuery to manipulate the DOM. But as you know, the whole point of using React to build your web application is its declarative nature. To put it simply, there is no point in having jQuery alongside React. React is handling the DOM manipulation for us. So, jQuery is simply not compatible and useless when working with React.
But wait! How do I use Semantic UI components in my React application?
Thankfully, Semantic UI provides integration with React through Semantic UI React. This library provides a React implementation of the original Semantic UI framework. It is jQuery-free and declarative. Just what we wanted.
The best way to integrate Semantic UI to our React application is by installing Semantic UI React package via npm
or yarn
:
yarn add semantic-ui-react
// or
npm install semantic-ui-react
This package provides us with the React version of the Semantic UI components.
Semantic UI React also needs a Semantic UI theme to style the React components properly. It is provided by Semantic UI from the Semantic UI CSS package. This package provides a lightweight CSS only version of Semantic UI, and can be installed via npm
or yarn
:
yarn add semantic-ui-css
// or
npm install semantic-ui-css
Then, we can import the stylesheets in our React application from the entry point file:
import React from 'react';
import ReactDOM from 'react-dom';
import 'semantic-ui-css/semantic.min.css';
import App from './App';
ReactDOM.render(<App />, document.getElementById('root'));
We are all set! Semantic UI can now be used anywhere in our React application.
In the next section, I will show you how you can import, use, and compose, the pre-built components provided by Semantic UI React to speed up your development process.
Use Semantic UI React Components
Import and Declare Semantic UI React Components
Semantic UI React provides out of the box components that we can import and render in our React application. Those components are ready to use and highly customizable through props and composition.
If I want to add a button to my application, I can simply import it from Semantic UI React and declare it using JSX:
import React from 'react';
import { Button } from 'semantic-ui-react';
export default function App() {
return <Button>Click me</Button>;
};
The main advantage of using the Semantic UI React Button
component, is that it comes with a bunch of props and sub-components you can use to configure it and style it as you want. It saves you HOURS of development as you don't have to build your own button from scratch.
Here's how you can easily add a loading Button
into your App using Semantic UI React:
import React, { useState } from 'react';
import { Button, Icon } from 'semantic-ui-react';
export default function App() {
const [loading, setLoading] = useState(false);
const save = async () => {
setLoading(true);
// some async operation here
// await ...
setLoading(false);
};
return (
<Button
size="large"
color="blue"
type="submit"
loading={loading}
onClick={save}
>
<Icon name="save" />
Save
</Button>
);
};
Compose Semantic UI React Components with Custom Element Type
Each Semantic UI React component, such as the Button
, has a set of pre-defined props you can use to configure and style it. You can find a list of all the props supported by a component in the online documentation.
Besides from that, each Semantic UI React component has a special prop called as
. This prop provides a way to render a custom element type for any component. One typical example is when we want to use a Button
component and benefit from its pre-defined features, but render an a
HTML tag instead of a button
HTML tag.
<Button as="a">Click me</Button>
It allows composing component features and props without adding extra nested components.
Like the Button
, each Semantic UI React component has a default value for the as
prop.
Compose Semantic UI React Components with 3rd Party Libraries
Another great advantage of Semantic UI React is its ability to pass all unhandled props and DOM attributes down to the components.
This is valid for all Semantic UI React components. So, like in our example above, type
is an unhandled prop on Button
and will be passed through.
Combined with the as
prop, this feature allows composing with third-party libraries like the popular react-router
.
In the following example, we can use the Semantic UI React Button
component, render it as a Link
component from react-router
, and pass the to
prop required by Link
.
import React from 'react';
import { Link } from 'react-router-dom'
import { Button } from 'semantic-ui-react'
<Button as="Link" to="/home">Home</Button>
Leverage Shorthand Props
Some Semantic UI React components, such as the Button
, can have shorthands. Those shorthands are pre-defined props that allow to configure the content of a component. In other words, you can declare and customize the children of a component using props only. It saves you writing extra JSX tags.
For example, Button
has a content
shorthand for its primary content.
<Button content="Save" />
// is equivalent to
<Button>
Save
</Button>
It also has an icon
shorthand, to add an Icon
Semantic UI React component to its children.
<Button icon="save" content="Save" />
// is equivalent to
<Button>
<Icon name="save" />
Save
</Button>
What's even more powerful about those shorthands is the ability to customize the default element rendered by the shorthand using an object or a function as the shorthand value 🤯.
Let's see it in action with our Button
example:
<Button
content="Like"
icon={{ color: "red", name: "like" }}
/>
// is equivalent to
<Button
content="Like"
icon={(Component, componentProps) => <Component {...componentProps} color="red" name="like" />}
/>
// is equivalent to
<Button>
<Icon color="red" name="like" />
Like
</Button>
Function value as the shorthand is very useful when you want to render a custom element in place of the shorthand element. Like in the following example, instead of rendering an Icon
, we are returning the Label
Semantic UI React component (with its own props) from the icon
shorthand:
<Button content="Like" icon={(Component, componentProps) => <Label basic>+1</Label>} />
Controlled/Uncontrolled Components
One more thing before we dive into a more practical example. Semantic UI React components maintain their own state internally and update it based on user input. They are what React called controlled components. This behavior is provided by Semantic UI React out of the box. Semantic UI React is built to make your life easier!
So, for example, if you have a Semantic UI React Dropdown
component, you do not have to worry about managing the open/close state of the dropdown when the user clicks on it. The onClick
event and the open
state are handled by default inside the Dropdown
component. The same thing happens with other events like onChange
and the value
state.
But in some cases, you still need to take control of some of the component states and events yourself. This is totally feasible. You just need to define the corresponding prop, and the components will delegate control for that one prop to your value. Note that if you only define the open
prop, for example, the value
prop and the other props remain auto controlled inside the component.
That's one more feature that makes Semantic UI React amazing, so easy to use, and a lifesaver when it comes to building React web application. It saves you hours of development and hundreds of lines of code.
Alright, enough talking! Let's build a piece of UI that could be useful for your next web application project.
Build Authentication Pages with Semantic UI React
In almost every web application, you need a register and login page for your users to authenticate. Let's build those pages using Semantic UI React components. Those pages will contain several top-level components from Semantic UI React including a Header
, a Form
, some Input
fields, and a Button
.
The final application can be found here: Build Authentication Pages with Semantic UI React.
We'll start by creating a React application using the create-react-app
package:
npx create-react-app react-semantic-ui-app
cd react-semantic-ui-app
npm start
Then, run the commands from above to install Semantic UI React and Semantic UI CSS. Remember to import the Semantic stylesheets in your index.js
file.
Finally, install React Router so that we can easily handle routes in our React app:
npm install react-router-dom
Now, you should be all set! Let's start building the pages of our React app.
First things first, we need to set up the routes of our application using react-router-dom
. Our app will contain only 2 routes, the /login
and /register
paths for the Login
and Register
pages respectively. Let's also handle 404 errors by redirecting the user to the Login
page by default.
// App.js
import React from "react";
import {
BrowserRouter as Router,
Switch,
Route,
Redirect
} from "react-router-dom";
import "./styles.css";
// Routes
import Login from "./routes/Login";
import Register from "./routes/Register";
export default function App() {
return (
<Router>
<Switch>
<Route exact path="/login" component={Login} />
<Route exact path="/register" component={Register} />
<Redirect to="/login" />
</Switch>
</Router>
);
}
Note that I have created the Login
and Register
components inside the routes
folder. The structure of our React app is the following:
src/
├── routes/
| ├── Login.js
| └── Register.js
|
├── App.js
└── index.js
Now, let's build our pages. The structure of the Login
and Register
pages will be very similar. So, I will go through the Login
component only and give the code for the Register
page for you to read.
For both pages, we will use the Semantic UI React Grid
component to center the authentication forms vertically and horizontally. Semantic UI React Grid
allows grouping of content into rows and columns by using the more specific Grid.Row
and Grid.Column
components respectively. Have a look at the documentation for more details.
Here we'll use only one column inside our Semantic UI React Grid
and pass the right props to it in order to center our content.
import React from "react";
import { Button, Form, Grid, Header } from "semantic-ui-react";
const Login = () => (
<Grid textAlign="center" style={{ height: "100vh" }} verticalAlign="middle">
<Grid.Column>
{ /* the authentication form goes here */}
</Grid.Column>
</Grid>
);
export default Login;
Then, the content of the page will be composed of a header and an authentication form.
Semantic UI React provides us with a Header
component to display an HTML heading tags, that is, h1 down to h6. We can specify which of the header tags to be used by using the as
props.
<Header as="h2" />
The Semantic UI React Header
component also has a few shorthands we can use to declare the content of the heading tag. So, let's add a logo and some text to it.
<Header
as="h2"
textAlign="center"
image="/assets/logo_square.svg"
content="Sign in to your account"
style={{ marginBottom: "32px" }}
/>
Note that I have also added some styling to center the text and add a bottom margin.
Let's now write the authentication form. Once again, Semantic UI React provides us with a Form
component and a Form.Input
sub-components in order to create a form with user input fields in a clean and organized way. Not to mention that we can use the Semantic UI React Button
component to add a styled submit button to our Form
.
<Form size="large">
<Form.Input
fluid
icon="mail"
iconPosition="left"
placeholder="E-mail address"
/>
<Form.Input
fluid
icon="lock"
iconPosition="left"
placeholder="Password"
type="password"
/>
<Button
type="submit"
color="purple"
fluid
size="large"
style={{ marginBottom: "32px" }}
>
Sign in
</Button>
</Form>
Note at how easy it is to create a nice form for our login page. It is very concise and does not require a lot of code.
Here we have 2 input fields, one for the user email address, and another one for the password. Using shorthands on the Form.Input
component we also added an icon on the left of each field.
Finally, let's add a link to the registration page, using react-router
, in case the user does not have an account yet and want to create one.
import { Link } from "react-router-dom";
const Login = () => (
<Grid textAlign="center" style={{ height: "100vh" }} verticalAlign="middle">
<Grid.Column>
...
<p>
Not a member? <Link to="/register">Sign up now</Link>
</p>
</Grid.Column>
</Grid>
);
That's it, folks! In a few easy steps, we have built a nice and styled page using Semantic UI React components.
Below is the code for the Register
component. It is pretty similar to the one we have created for the login page expect that it contains 2 more input fields.
import React from "react";
import { Link } from "react-router-dom";
import { Button, Form, Grid, Header } from "semantic-ui-react";
const Register = () => (
<Grid textAlign="center" style={{ height: "100vh" }} verticalAlign="middle">
<Grid.Column>
<Header
as="h2"
textAlign="center"
image="/assets/logo_square.svg"
content="Create your account"
style={{ marginBottom: "32px" }}
/>
<Form size="large">
<Form.Group widths="equal">
<Form.Input
fluid
icon="user"
iconPosition="left"
placeholder="First name"
/>
<Form.Input
fluid
icon="user"
iconPosition="left"
placeholder="Last name"
/>
</Form.Group>
<Form.Input
fluid
icon="mail"
iconPosition="left"
placeholder="E-mail address"
/>
<Form.Input
fluid
icon="lock"
iconPosition="left"
placeholder="Password"
type="password"
/>
<Button
type="submit"
color="purple"
fluid
size="large"
style={{ marginBottom: "32px" }}
>
Sign up
</Button>
</Form>
<p>
Already a member? <Link to="/login">Sign in</Link>
</p>
</Grid.Column>
</Grid>
);
export default Register;
Conclusion
Once again, the final application can be found here: Build Authentication Pages with Semantic UI React.
In this article, I introduced you to the Semantic UI framework and how it helps to create styled web applications fast. But more importantly, I introduce you to the React version of this framework, Semantic UI React, which allows us to use Semantic UI in our React application. Semantic UI React provides us with a lot of pre-defined React components we can use out of the box to compose our App very quickly. Lastly, we went over a practical example by building authentication pages with Semantic UI React components only.