DevExtreme v26.1 is now available.

Explore our newest features/capabilities and share your thoughts with us.

Your search did not match any results.

React Context Menu - Scrolling

The DevExtreme ContextMenu component supports submenu item scrolling. If combined item height exceeds screen size, a scrollbar appears on-screen.

To restrict submenu height, use the following CSS notation:

.dx-context-menu .dx-menu-items-container {
    max-height: 200px;
}
Backend API
import React from 'react'; import { ContextMenu, type ContextMenuTypes } from 'devextreme-react/context-menu'; import notify from 'devextreme/ui/notify'; import { contextMenuItems as items } from './data.ts'; import type { ContextMenuItem } from './types'; function itemClick(e: ContextMenuTypes.ItemClickEvent<ContextMenuItem>): void { if (!e.itemData?.items) { notify(`The "${e.itemData?.text}" item was clicked`, 'success', 1500); } } function App() { return ( <> <div className="target-area"> Right click within this region to display the DevExtreme Context Menu </div> <ContextMenu dataSource={items} width={200} target= ".target-area" onItemClick= {itemClick} /> </> ); } export default App;
import React from 'react'; import { ContextMenu } from 'devextreme-react/context-menu'; import notify from 'devextreme/ui/notify'; import { contextMenuItems as items } from './data.js'; function itemClick(e) { if (!e.itemData?.items) { notify(`The "${e.itemData?.text}" item was clicked`, 'success', 1500); } } function App() { return ( <> <div className="target-area"> Right click within this region to display the DevExtreme Context Menu </div> <ContextMenu dataSource={items} width={200} target=".target-area" onItemClick={itemClick} /> </> ); } export default App;
import React from 'react'; import ReactDOM from 'react-dom'; import App from './App.tsx'; ReactDOM.render( <App />, document.getElementById('app'), );
import type { ContextMenuItem } from './types'; export const contextMenuItems: ContextMenuItem[] = [ { text: 'Electronics', items: [ { text: 'Computers', items: [ { text: 'Desktops', }, { text: 'Laptops', }, { text: 'Tablets', }, { text: 'Monitors', }, { text: 'Printers', }, { text: 'Scanners', }, { text: 'Servers', }, { text: 'Network Devices', }, { text: 'Warranties', }, { text: 'Projectors & Screens', }, { text: 'Computer Accessories', }, ], }, { text: 'Cell Phones', items: [ { text: 'Home & Office Phones', }, { text: 'Smart Phones & PDAs', }, { text: 'Senior Cell Phones', }, { text: 'Mobile Broadband Devices', }, { text: 'Cell Phone Accessories', }, ], }, { text: 'Camera & Photo', items: [ { text: 'Action Cameras', }, { text: 'Camcorders', }, { text: 'Digital Cameras', }, { text: 'Digital Picture Frames', }, { text: 'Film Cameras', }, { text: 'Professional Video Cameras', }, { text: 'Flashes', }, { text: 'Lenses', }, { text: 'Photo Printers', }, { text: 'Film & Slide Scanners', }, { text: 'Slide Projectors', }, { text: 'Slide Viewers', }, { text: 'Tripods & Monopods', }, { text: 'Underwater Video & Photography', }, { text: 'Camera Accessories', }, ], }, { text: 'Audio', items: [ { text: 'Boomboxes', }, { text: 'DVD & CD Player Bags', }, { text: 'Hi-Fi & Home Audio Accessories', }, { text: 'Media Streaming Devices', }, { text: 'MP3 & Digital Media Players', }, { text: 'MP3 Player Accessories', }, { text: 'Personal Cassette Players', }, { text: 'Personal CD Players', }, { text: 'Compact Stereos', }, { text: 'Speakers', }, ], }, { text: 'Home Appliances', items: [ { text: 'Air Conditioners', }, { text: 'Coffee Machines', }, { text: 'Fans', }, { text: 'Lamps', }, { text: 'Microwaves', }, { text: 'Refrigerators', }, { text: 'Washers & Dryers', }, { text: ' Water Heaters', }, { 'text': 'Vacuum', }, { text: 'Steaming & Ironing', }, ], }, ], }, { text: 'Entertainment', items: [ { text: 'Films & Music', items: [ { text: 'TV Shows', }, { text: 'DVD', }, { text: 'Blu-ray', }, { text: 'CD', }, { text: 'SACD', }, { text: 'Vinyl', }, { text: 'Cassette', }, { text: 'Musical Instruments', }, { text: 'DJ Equipment', }, ], }, { text: 'Games & Toys', items: [ { text: 'PC Games', }, { text: 'Virtual Reality', }, { text: 'Boxed Games', }, { text: 'Download Games', }, { text: 'Handheld Game Systems', }, { text: 'Legacy Systems', }, { text: 'Cards', }, ], }, ], }, { text: 'Healthcare & Living', items: [ { text: 'Sports & Outdoors', items: [ { text: 'Camping', }, { text: 'Fitness', }, { text: 'Football', }, { text: 'Cycling', }, { text: 'Running', }, { text: 'Sport Electronics', }, { text: 'Sport Apparel', }, { text: 'Trainers & Tennis Shoes', }, ], }, { text: 'Beauty', items: [ { text: 'Bath & Shower', }, { text: 'Skin Care', }, { text: 'Hair Care', }, { text: 'Nail Care', }, { text: 'Make-up', }, { text: 'Fragrance', }, { text: 'Salon & SPA Equipment', }, { text: 'Tools & Accessories', }, ], }, { text: 'Fashion', items: [ { text: 'Clothing', }, { text: 'Jewellery', }, { text: 'Shoes', }, { text: 'Handbags & Shoulder Bags', }, { text: 'Watches', }, { text: 'Accessories', }, ], }, ], }, ];
export interface ContextMenuItem { text: string; items?: ContextMenuItem[] }
import React from 'react'; import ReactDOM from 'react-dom'; import App from './App.js'; ReactDOM.render(<App />, document.getElementById('app'));
export const contextMenuItems = [ { text: 'Electronics', items: [ { text: 'Computers', items: [ { text: 'Desktops', }, { text: 'Laptops', }, { text: 'Tablets', }, { text: 'Monitors', }, { text: 'Printers', }, { text: 'Scanners', }, { text: 'Servers', }, { text: 'Network Devices', }, { text: 'Warranties', }, { text: 'Projectors & Screens', }, { text: 'Computer Accessories', }, ], }, { text: 'Cell Phones', items: [ { text: 'Home & Office Phones', }, { text: 'Smart Phones & PDAs', }, { text: 'Senior Cell Phones', }, { text: 'Mobile Broadband Devices', }, { text: 'Cell Phone Accessories', }, ], }, { text: 'Camera & Photo', items: [ { text: 'Action Cameras', }, { text: 'Camcorders', }, { text: 'Digital Cameras', }, { text: 'Digital Picture Frames', }, { text: 'Film Cameras', }, { text: 'Professional Video Cameras', }, { text: 'Flashes', }, { text: 'Lenses', }, { text: 'Photo Printers', }, { text: 'Film & Slide Scanners', }, { text: 'Slide Projectors', }, { text: 'Slide Viewers', }, { text: 'Tripods & Monopods', }, { text: 'Underwater Video & Photography', }, { text: 'Camera Accessories', }, ], }, { text: 'Audio', items: [ { text: 'Boomboxes', }, { text: 'DVD & CD Player Bags', }, { text: 'Hi-Fi & Home Audio Accessories', }, { text: 'Media Streaming Devices', }, { text: 'MP3 & Digital Media Players', }, { text: 'MP3 Player Accessories', }, { text: 'Personal Cassette Players', }, { text: 'Personal CD Players', }, { text: 'Compact Stereos', }, { text: 'Speakers', }, ], }, { text: 'Home Appliances', items: [ { text: 'Air Conditioners', }, { text: 'Coffee Machines', }, { text: 'Fans', }, { text: 'Lamps', }, { text: 'Microwaves', }, { text: 'Refrigerators', }, { text: 'Washers & Dryers', }, { text: ' Water Heaters', }, { text: 'Vacuum', }, { text: 'Steaming & Ironing', }, ], }, ], }, { text: 'Entertainment', items: [ { text: 'Films & Music', items: [ { text: 'TV Shows', }, { text: 'DVD', }, { text: 'Blu-ray', }, { text: 'CD', }, { text: 'SACD', }, { text: 'Vinyl', }, { text: 'Cassette', }, { text: 'Musical Instruments', }, { text: 'DJ Equipment', }, ], }, { text: 'Games & Toys', items: [ { text: 'PC Games', }, { text: 'Virtual Reality', }, { text: 'Boxed Games', }, { text: 'Download Games', }, { text: 'Handheld Game Systems', }, { text: 'Legacy Systems', }, { text: 'Cards', }, ], }, ], }, { text: 'Healthcare & Living', items: [ { text: 'Sports & Outdoors', items: [ { text: 'Camping', }, { text: 'Fitness', }, { text: 'Football', }, { text: 'Cycling', }, { text: 'Running', }, { text: 'Sport Electronics', }, { text: 'Sport Apparel', }, { text: 'Trainers & Tennis Shoes', }, ], }, { text: 'Beauty', items: [ { text: 'Bath & Shower', }, { text: 'Skin Care', }, { text: 'Hair Care', }, { text: 'Nail Care', }, { text: 'Make-up', }, { text: 'Fragrance', }, { text: 'Salon & SPA Equipment', }, { text: 'Tools & Accessories', }, ], }, { text: 'Fashion', items: [ { text: 'Clothing', }, { text: 'Jewellery', }, { text: 'Shoes', }, { text: 'Handbags & Shoulder Bags', }, { text: 'Watches', }, { text: 'Accessories', }, ], }, ], }, ];
<!DOCTYPE html> <html lang="en"> <head> <title>DevExtreme Demo</title> <meta http-equiv="X-UA-Compatible" content="IE=edge" /> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=5.0" /> <link rel="stylesheet" type="text/css" href="https://cdn3.devexpress.com/jslib/26.1.5/css/dx.light.css" /> <link rel="stylesheet" type="text/css" href="./bundle.css" /> </head> <body class="dx-viewport"> <div class="demo-container"> <div id="app"></div> </div> <script src="bundles/vendor/react.vendor.js"></script> <script src="./bundle.js"></script> </body> </html>
html, body { width: 100%; height: 100%; } body { margin: 0; } #app, .demo-container { height: 100%; } .target-area { color: var(--dx-color-text); background-color: var(--dx-color-border); height: 100%; width: 100%; display: flex; justify-content: center; align-items: center; -webkit-touch-callout: none; user-select: none; }