Skip to Content
You are viewing a beta version of Clerk Docs
Visit the latest docs
Clerk logo

Clerk Docs

Ctrl + K
Go to clerk.com

<UserButton /> component

User Button Example

The <UserButton /> component is used to render the familiar user button UI popularized by Google.

Clerk is the only provider with multi-session support, allowing users to sign into multiple accounts at once and switch between them. For multi-session apps, the <UserButton /> automatically supports instant account switching, without the need of a full page reload. For more information, you can check out the Multi-session applications guide.

Properties

All props are optional.

NameTypeDescription
appearanceAppearance | undefinedOptional object to style your components. Will only affect Clerk Components and not Account Portal pages.
showNamebooleanControls if the user name is displayed next to the user image button.
signInUrlstringThe full URL or path to navigate to when the Add another account button is clicked. It's recommended to use the environment variable instead.
userProfileMode'modal' | 'navigation'Controls whether clicking the Manage your account button will cause the <UserProfile /> component to open as a modal, or if the browser will navigate to the userProfileUrl where <UserProfile /> is mounted as a page.
Defaults to: 'modal'.
userProfileUrlstringThe full URL or path leading to the user management interface.
afterSignOutUrlstringThe full URL or path to navigate to after a signing out from all accounts (applies to both single-session and multi-session apps). Default is /.
afterMultiSessionSingleSignOutUrlstringThe full URL or path to navigate to after a signing out from currently active account (multi-session apps).
afterSwitchSessionUrlstringThe full URL or path to navigate to after a successful account change (multi-session apps).
defaultOpenbooleanControls whether the <UserButton /> should open by default during the first render.
userProfilePropsobjectSpecify options for the underlying <UserProfile /> component.
For example: {additionalOAuthScopes: {google: ['foo', 'bar'], github: ['qux']}}.

Usage with frameworks

In the following example, <UserButton /> is mounted inside a header component, which is a common pattern on many websites and applications. When the user is signed in, they will see their avatar and be able to open the popup menu.

layout.tsx
import { ClerkProvider, SignedIn, SignedOut, SignInButton, UserButton, } from "@clerk/nextjs"; function Header() { return ( <header style={{ display: "flex", justifyContent: "space-between", padding: 20 }}> <h1>My App</h1> <SignedIn> {/* Mount the UserButton component */} <UserButton /> </SignedIn> <SignedOut> {/* Signed out users get sign in button */} <SignInButton/> </SignedOut> </header> ); } export default function RootLayout({ children }: { children: React.ReactNode }) { return ( <html lang="en"> <ClerkProvider> <Header /> {children} </ClerkProvider> </html> ); }
userButtonExample.tsx
import { ClerkProvider, SignedIn, SignedOut, SignInButton, UserButton, } from "@clerk/nextjs"; function Header() { return ( <header style={{ display: "flex", justifyContent: "space-between", padding: 20 }}> <h1>My App</h1> <SignedIn> {/* Mount the UserButton component */} <UserButton /> </SignedIn> <SignedOut> {/* Signed out users get sign in button */} <SignInButton/> </SignedOut> </header> ); } function MyApp({ pageProps }) { return ( <ClerkProvider {...pageProps}> <Header /> </ClerkProvider> ); } export default MyApp;

Usage with JavaScript

The following methods available on an instance of the Clerk class are used to render and control the <UserButton /> component:

The following examples assume that you have followed the quickstart in order to add Clerk to your JavaScript application.

mountUserButton()

Render the <UserButton /> component to an HTML <div> element.

function mountUserButton(node: HTMLDivElement, props?: UserButtonProps): void;

mountUserButton() params

NameTypeDescription
nodeHTMLDivElement(opens in a new tab)The <div> element used to render in the <UserButton /> component
props?UserButtonPropsThe properties to pass to the <UserButton /> component

mountUserButton() usage

main.js
import Clerk from '@clerk/clerk-js'; // Initialize Clerk with your Clerk publishable key const clerk = new Clerk('{{pub_key}}'); await clerk.load(); document.getElementById("app").innerHTML = ` <div id="user-button"></div> `; const userbuttonDiv = document.getElementById("user-button"); clerk.mountUserButton(userbuttonDiv);
index.html
<!-- Add a <div id="user-button"> element to your HTML --> <div id="user-button"></div> <!-- Initialize Clerk with your Clerk Publishable key and Frontend API URL --> <script async crossorigin="anonymous" data-clerk-publishable-key="{{pub_key}}" src="https://{{fapi_url}}/npm/@clerk/clerk-js@latest/dist/clerk.browser.js" type="text/javascript" ></script> <script> window.addEventListener("load", async function () { await Clerk.load(); const userbuttonDiv = document.getElementById('user-button'); Clerk.mountUserButton(userbuttonDiv); }); </script>

unmountUserButton()

Unmount and run cleanup on an existing <UserButton /> component instance.

function unmountUserButton(node: HTMLDivElement): void;

unmountUserButton() params

NameTypeDescription
nodeHTMLDivElement(opens in a new tab)The container <div> element with a rendered <UserButton /> component instance.

unmountUserButton() usage

main.js
import Clerk from '@clerk/clerk-js'; // Initialize Clerk with your Clerk publishable key const clerk = new Clerk('{{pub_key}}'); await clerk.load(); document.getElementById('app').innerHTML = ` <div id="user-button"></div> ` const userButtonDiv = document.getElementById('user-button'); clerk.mountUserButton(userButtonDiv); // ... clerk.unmountUserButton(userButtonDiv);
index.html
<!-- Add a <div id="user-button"> element to your HTML --> <div id="user-button"></div> <!-- Initialize Clerk with your Clerk Publishable key and Frontend API URL --> <script async crossorigin="anonymous" data-clerk-publishable-key="{{pub_key}}" src="https://{{fapi_url}}/npm/@clerk/clerk-js@latest/dist/clerk.browser.js" type="text/javascript" ></script> <script> window.addEventListener("load", async function () { await Clerk.load(); const userButtonDiv = document.getElementById('user-button'); Clerk.mountUserButton(userButtonDiv); // ... Clerk.unmountUserButton(userButtonDiv); }); </script>

Customization

To learn about how to customize Clerk components, see the customization documentation.

Last updated on March 26, 2024

What did you think of this content?

Clerk © 2024