dotCMS React SDK
The @dotcms/react
SDK is the DotCMS official React library. It empowers React developers to build powerful, editable websites and applications in no time.
Table of Contents
Prerequisites & Setup
Get a dotCMS Environment
Version Compatibility
- Recommended: dotCMS Evergreen
- Minimum: dotCMS v25.05
- Best Experience: Latest Evergreen release
Environment Setup
For Production Use:
For Testing & Development:
For Local Development:
Configure The Universal Visual Editor App
For a step-by-step guide on setting up the Universal Visual Editor, check out our easy-to-follow instructions and get started in no time!
Create a dotCMS API Key
[!TIP]
Make sure your API Token has read-only permissions for Pages, Folders, Assets, and Content. Using a key with minimal permissions follows security best practices.
This integration requires an API Key with read-only permissions for security best practices:
- Go to the dotCMS admin panel.
- Click on System > Users.
- Select the user you want to create the API Key for.
- Go to API Access Key and generate a new key.
For detailed instructions, please refer to the dotCMS API Documentation - Read-only token.
Install Dependencies
npm install @dotcms/react@latest
This will automatically install the required dependencies:
@dotcms/uve
: Enables interaction with the Universal Visual Editor for real-time content editing
@dotcms/client
: Provides the core client functionality for fetching and managing dotCMS data
dotCMS Client Configuration
import { createDotCMSClient } from '@dotcms/client';
type DotCMSClient = ReturnType<typeof createDotCMSClient>;
export const dotCMSClient: DotCMSClient = createDotCMSClient({
dotcmsUrl: 'https://your-dotcms-instance.com',
authToken: 'your-auth-token',
siteId: 'your-site-id'
});
Proxy Configuration for Static Assets
Configure a proxy to leverage the powerful dotCMS image API, allowing you to resize and serve optimized images efficiently. This enhances application performance and improves user experience, making it a strategic enhancement for your project.
1. Configure Vite
import { defineConfig } from 'vite';
import dns from 'node:dns';
dns.setDefaultResultOrder('verbatim');
export default defineConfig({
server: {
proxy: {
'/dA': {
target: 'your-dotcms-instance.com',
changeOrigin: true
}
}
}
});
Learn more about Vite configuration here.
2. Usage in Components
Once configured, image URLs in your components will automatically be proxied to your dotCMS instance:
π Learn more about Image Resizing and Processing in dotCMS with React.
import type { DotCMSBasicContentlet } from '@dotcms/types';
export const MyDotCMSImageComponent = ({ inode, title }: DotCMSBasicContentlet) => {
return <img src={`/dA/${inode}`} alt={title} />;
}
Quickstart: Render a Page with dotCMS
The following example demonstrates how to quickly set up a basic dotCMS page renderer in your React application. This example shows how to:
- Create a standalone component that renders a dotCMS page
- Set up dynamic component loading for different content types
- Handle both regular page viewing and editor mode
- Subscribe to real-time page updates when in the Universal Visual Editor
import { useState, useEffect } from 'react';
import { DotCMSLayoutBody, useEditableDotCMSPage } from '@dotcms/react';
import { DotCMSPageResponse } from '@dotcms/types';
import { dotCMSClient } from './dotCMSClient';
import { BlogComponent } from './BlogComponent';
import { ProductComponent } from './ProductComponent';
const COMPONENTS_MAP = {
Blog: BlogComponent,
Product: ProductComponent
};
const MyPage = () => {
const [response, setResponse] = useState<DotCMSPageResponse | null>(null);
const { pageAsset } = useEditableDotCMSPage(response);
useEffect(() => {
dotCMSClient.page.get('/').then((response) => {
setResponse(response);
});
}, []);
return <DotCMSLayoutBody page={pageAsset} components={COMPONENTS_MAP} mode="development" />;
};
export default MyPage;
Example Project π
Looking to get started quickly? We've got you covered! Our Next.js starter project is the perfect launchpad for your dotCMS + Next.js journey. This production-ready template demonstrates everything you need:
π¦ Fetch and render dotCMS pages with best practices
π§© Register and manage components for different content types
π Listing pages with search functionality
π Detail pages for blogs
π Image and assets optimization for better performance
β¨ Enable seamless editing via the Universal Visual Editor (UVE)
β‘οΈ Leverage React's hooks and state management for optimal performance
[!TIP]
This starter project is more than just an example, it follows all our best practices. We highly recommend using it as the base for your next dotCMS + Next.js project!
SDK Reference
All components and hooks should be imported from @dotcms/react
:
DotCMSLayoutBody
DotCMSLayoutBody
is a component used to render the layout for a DotCMS page, supporting both production and development modes.
Client-Side Only Component
β οΈ Important: This is a client-side React component.
DotCMSLayoutBody
uses React features like useContext
, useEffect
, and useState
.
If you're using a framework that supports Server-Side Rendering (like Next.js, Gatsby, or Astro), you must mark the parent component with "use client"
or follow your frameworkβs guidelines for using client-side components.
π Learn more: Next.js β Client Components
Usage
import type { DotCMSPageAsset } from '@dotcms/types';
import { DotCMSLayoutBody } from '@dotcms/react';
import { MyBlogCard } from './MyBlogCard';
import { DotCMSProductComponent } from './DotCMSProductComponent';
const COMPONENTS_MAP = {
Blog: MyBlogCard,
Product: DotCMSProductComponent
};
const MyPage = ({ pageAsset }: DotCMSPageResponse) => {
return <DotCMSLayoutBody page={pageAsset} components={COMPONENTS_MAP} />;
};
Layout Body Modes
production
: Performance-optimized mode that only renders content with explicitly mapped components, leaving unmapped content empty.
development
: Debug-friendly mode that renders default components for unmapped content types and provides visual indicators and console logs for empty containers and missing mappings.
Component Mapping
The DotCMSLayoutBody
component uses a components
prop to map content type variable names to React components. This allows you to render different components for different content types. Example:
const DYNAMIC_COMPONENTS = {
Blog: MyBlogCard,
Product: DotCMSProductComponent
};
- Keys (e.g.,
Blog
, Product
): Match your content type variable names in dotCMS
- Values: Dynamic imports of your React components that render each content type
- Supports lazy loading through dynamic imports
- Components must be standalone or declared in a module
[!TIP]
Always use the exact content type variable name from dotCMS as the key. You can find this in the Content Types section of your dotCMS admin panel.
DotCMSEditableText
DotCMSEditableText
is a component for inline editing of text fields in dotCMS, supporting plain text, text area, and WYSIWYG fields.
contentlet | T extends DotCMSBasicContentlet | β
| The contentlet containing the editable field |
fieldName | keyof T | β
| Name of the field to edit, which must be a valid key of the contentlet type T |
mode | 'plain' | 'full' | β | plain (default): Support text editing. Does not show style controls. full : Enables a bubble menu with style options. This mode only works with WYSIWYG fields. |
format | 'text' | 'html' | β | text (default): Renders HTML tags as plain text html : Interprets and renders HTML markup |
Usage
import type { DotCMSBasicContentlet } from '@dotcms/types';
import { DotCMSEditableText } from '@dotcms/react';
const MyBannerComponent = ({ contentlet }: { contentlet: DotCMSBasicContentlet }) => {
const { inode, title, link } = contentlet;
return (
<div className="flex overflow-hidden relative justify-center items-center w-full h-96 bg-gray-200">
<img className="object-cover w-full" src={`/dA/${inode}`} alt={title} />
<div className="flex absolute inset-0 flex-col justify-center items-center p-4 text-center text-white">
<h2 className="mb-2 text-6xl font-bold text-shadow">
<DotCMSEditableText fieldName="title" contentlet={contentlet} />
</h2>
<a
href={link}
className="p-4 text-xl bg-red-400 rounded-sm transition duration-300 hover:bg-red-500">
See more
</a>
</div>
</div>
);
};
export default MyBannerComponent;
Editor Integration
- Detects UVE edit mode and enables inline TinyMCE editing
- Triggers a
Save
workflow action on blur without needing full content dialog.
DotCMSBlockEditorRenderer
DotCMSBlockEditorRenderer
is a component for rendering Block Editor content from dotCMS with support for custom block renderers.
blocks | BlockEditorContent | β
| The Block Editor content to render |
customRenderers | CustomRenderers | β | Custom rendering functions for specific block types |
className | string | β | CSS class to apply to the container |
style | CSSProperties | β | Inline styles for the container |
Usage
import type { DotCMSBasicContentlet } from '@dotcms/types';
import { DotCMSBlockEditorRenderer } from '@dotcms/react';
import { MyCustomBannerBlock } from './MyCustomBannerBlock';
import { MyCustomH1 } from './MyCustomH1';
const CUSTOM_RENDERERS = {
customBannerBlock: MyCustomBannerBlock,
h1: MyCustomH1
};
const DetailPage = ({ contentlet }: { contentlet: DotCMSBasicContentlet }) => {
return (
<DotCMSBlockEditorRenderer
blocks={contentlet['YOUR_BLOCK_EDITOR_FIELD']}
customRenderers={CUSTOM_RENDERERS}
/>
);
};
Recommendations
π For advanced examples, customization options, and best practices, refer to the DotCMSBlockEditorRenderer README.
DotCMSShow
DotCMSShow
is a component for conditionally rendering content based on the current UVE mode. Useful for mode-based behaviors outside of render logic.
children | ReactNode | β
| Content to be conditionally rendered |
when | UVE_MODE | β
| The UVE mode when content should be displayed: UVE_MODE.EDIT : Only visible in edit mode UVE_MODE.PREVIEW : Only visible in preview mode UVE_MODE.PUBLISHED : Only visible in published mode |
Usage
import { UVE_MODE } from '@dotcms/types';
import { DotCMSShow } from '@dotcms/react';
const MyComponent = () => {
return (
<DotCMSShow when={UVE_MODE.EDIT}>
<div>This will only render in UVE EDIT mode</div>
</DotCMSShow>
);
};
π Learn more about the UVE_MODE
enum in the dotCMS UVE Package Documentation.
useEditableDotCMSPage
useEditableDotCMSPage
is a hook that enables real-time page updates when using the Universal Visual Editor.
pageResponse | DotCMSPageResponse | β
| The page data object from client.page.get() |
Service Lifecycle & Operations
When you use the hook, it:
- Initializes the UVE with your page data
- Sets up communication channels with the editor
- Tracks content changes in real-time
- Updates your page automatically when:
- Content is edited inline
- Blocks are added or removed
- Layout changes are made
- Components are moved
- Cleans up all listeners and connections on destroy
Usage
'use client';
import { useEditableDotCMSPage, DotCMSLayoutBody } from '@dotcms/react';
import type { DotCMSPageResponse } from '@dotcms/types';
const COMPONENTS_MAP = {
Blog: BlogComponent,
Product: ProductComponent
};
export function DotCMSPage({ pageResponse }: { pageResponse: DotCMSPageResponse }) {
const { pageAsset } = useEditableDotCMSPage(pageResponse);
return <DotCMSLayoutBody pageAsset={pageAsset} components={COMPONENTS_MAP} />;
}
useDotCMSShowWhen
useDotCMSShowWhen
is a hook for conditionally showing content based on the current UVE mode. Useful for mode-based behaviors outside of render logic.
when | UVE_MODE | β
| The UVE mode when content should be displayed: UVE_MODE.EDIT : Only visible in edit mode UVE_MODE.PREVIEW : Only visible in preview mode UVE_MODE.PUBLISHED : Only visible in published mode |
Usage
import { UVE_MODE } from '@dotcms/types';
import { useDotCMSShowWhen } from '@dotcms/react';
const MyEditButton = () => {
const isEditMode = useDotCMSShowWhen(UVE_MODE.EDIT);
if (isEditMode) {
return <button>Edit</button>;
}
return null;
};
Troubleshooting
Common Issues & Solutions
Universal Visual Editor (UVE)
- UVE Not Loading: Page loads but UVE controls are not visible
- Possible Causes:
- Incorrect UVE configuration
- Missing API token permissions
- Missing the
DotCMSEditablePageService
call to enable UVE.
- Solutions:
- Verify UVE app configuration in dotCMS admin
- Check API token has edit permissions
- Ensure
dotcmsUrl
matches your instance URL exactly
Missing Content
Development Setup
Next.js App Router Integration
Debugging Tips
Still Having Issues?
If you're still experiencing problems after trying these solutions:
- Search existing GitHub issues
- Ask questions on the community forum to engage with other users.
- Create a new issue with:
- Detailed reproduction steps
- Environment information
- Error messages
- Code samples
dotCMS Support
We offer multiple channels to get help with the dotCMS React SDK:
- GitHub Issues: For bug reports and feature requests, please open an issue in the GitHub repository.
- Community Forum: Join our community discussions to ask questions and share solutions.
- Stack Overflow: Use the tag
dotcms-react
when posting questions.
- Enterprise Support: Enterprise customers can access premium support through the dotCMS Support Portal.
When reporting issues, please include:
- SDK version you're using
- React version
- Minimal reproduction steps
- Expected vs. actual behavior
How To Contribute
GitHub pull requests are the preferred method to contribute code to dotCMS. We welcome contributions to the DotCMS UVE SDK! If you'd like to contribute, please follow these steps:
- Fork the repository dotCMS/core
- Create a feature branch (
git checkout -b feature/amazing-feature
)
- Commit your changes (
git commit -m 'Add some amazing feature'
)
- Push to the branch (
git push origin feature/amazing-feature
)
- Open a Pull Request
Please ensure your code follows the existing style and includes appropriate tests.
Licensing Information
dotCMS comes in multiple editions and as such is dual-licensed. The dotCMS Community Edition is licensed under the GPL 3.0 and is freely available for download, customization, and deployment for use within organizations of all stripes. dotCMS Enterprise Editions (EE) adds several enterprise features and is available via a supported, indemnified commercial license from dotCMS. For the differences between the editions, see the feature page.
This SDK is part of dotCMS's dual-licensed platform (GPL 3.0 for Community, commercial license for Enterprise).
Learn more at dotcms.com.