useUser
Access the User object inside of your components.
Overview
The useUser hook returns the current user state: { isLoaded, isSignedIn, user }
. You can use the user
object to access the currently active User. It can be used to update the user or display information about the user's profile, like their name or email address.
While hooks are the recommended way to use the Clerk APIs, If you don't wish to use React hooks we also offer a couple of alternative methods to retrieve the currently signed in user.
Usage
Retrieve the current user data
A basic example that showcases the useUser
hook in action is a greeting component that greets the signed in user by their first name.
1import { useUser } from "@clerk/clerk-react";23export default function Home() {4const { isSignedIn, user, isLoaded } = useUser();56if (!isLoaded) {7return null;8}910if (isSignedIn) {11return <div>Hello {user.fullName}!</div>;12}1314return <div>Not signed in</div>;15}16
Update the current user
Clerk provides a update function that allows you to update some of your users data
1import { useUser } from "@clerk/clerk-react";23export default function Home() {4const { user } = useUser();5if (!user) return null;6const updateUser = async () => {7await user.update({8firstName: "John",9lastName: "Doe",10});11};12return (13<>14<button onClick={updateUser}>Click me to update your name</button>15<p>user.firstName: {user?.firstName}</p>16<p>user.lastName: {user?.lastName}</p>17</>18);19}20
Reload user data
In some circumstances you need retrieve the latest user data after updating your user in your backend. You can use user.reload()
to reload the data on the frontend.
1import { useUser } from "@clerk/clerk-react";23export default function Home() {4const { user } = useUser();5if (!user) return null;6const updateUser = async () => {7// updated data via an api point8const updateMeta = await fetch("/api/updateMetadata");9if (!updateMeta.message == "success") {10throw new Error("Error updating");11}12user.reload();13};14return (15<>16<button onClick={updateUser}>Click me to update your metadata</button>17<p>user role: {user?.publicMetadata.role}</p>18</>19);20}21
Alternatives
There are times where using a hook might be inconvenient. For such cases, there are alternative ways to get access to the User object.
Clerk provides the <WithUser/> component and the withUser higher order component directive that will allow your wrapped components to get access to the currently signed in user.
withUser
The withUser
function offers a Higher Order Component (HOC) that you can wrap your own components with, and they will have access to the active User object.
The User
object will be accessible in the wrapped component under the user
prop.
1import { withUser } from "@clerk/clerk-react";23class Greeting extends React.Component {4render() {5return (6<div>7{this.props.user.firstName8? `Hello ${this.props.user.firstName}!`9: "Hello there!"}10</div>11);12}13}1415// Wrap your component with the withUser HOC.16export const GreetingWithUser = withUser(Greeting);
<WithUser />
If you really want to stretch JSX capabilities and you cannot use the withUser higher order component, we provide a <WithUser/>
component that accepts a Function as a child. Inside this function, the active User object will be accessible.
1import { WithUser } from "@clerk/clerk-react";23class Greeting extends React.Component {4render() {5return (6<WithUser>7{(user) => (8<div>9{user.firstName10? `Hello, ${user.firstName}!`11: "Hello there!"}12</div>13)}14</WithUser>15);16}17}
Usage with Typescript
If you're using Typescript, Clerk provides a WithUserProp
type to make the compiler aware of the user
prop for your components.
You can use the WithUserProp
type in combination with both the withUser higher order component and the <WithUser/> component.
The example below uses the withUser
higher order component.
1import { withUser, WithUserProp } from "@clerk/clerk-react";23type GreetingProps = {4greeting: string;5}67const Greeting = (props: WithUserProp<GreetingProps>) => {8const { user, greeting } = props;9return (10<h1>{ greeting }</h1>11<div>12{ user.firstName13? `Hello, ${user.firstName}!`14: "Hello there!" }15</div>16);17}1819export const GreetingWithUser = withUser(Greeting);