Aller au contenu

ContextMenu

Menu contextuel du clic droit avec sous-menus imbriqués et icônes.

import { ContextMenu } from 'asterui'

Menu contextuel de base

Cliquez avec le bouton droit sur l'élément pour afficher le menu.

Right-click here
import { ContextMenu, notification } from 'asterui'

function App() {
  return (
      <ContextMenu onSelect={(key) => notification.info({ message: `Selected: ${key}` })}>
        <div className="p-8 bg-base-200 rounded-lg text-center cursor-context-menu">
          Right-click here
        </div>
        <ContextMenu.Item key="copy">Copy</ContextMenu.Item>
        <ContextMenu.Item key="paste">Paste</ContextMenu.Item>
        <ContextMenu.Item key="cut">Cut</ContextMenu.Item>
      </ContextMenu>
    )
}

export default App

Modèle piloté par données

Utiliser la prop items pour les menus pilotés par données.

Right-click here
import { ContextMenu, notification } from 'asterui'

function App() {
  const items = [
    { key: 'copy', label: 'Copy' },
    { key: 'paste', label: 'Paste' },
    { key: 'cut', label: 'Cut' },
  ]
  
  return (
      <ContextMenu items={items} onSelect={(key) => notification.info({ message: `Selected: ${key}` })}>
        <div className="p-8 bg-base-200 rounded-lg text-center cursor-context-menu">
          Right-click here
        </div>
      </ContextMenu>
    )
}

export default App

Avec icônes

Éléments de menu avec icônes.

Right-click for options
import { ContextMenu, notification } from 'asterui'

function App() {
  const items = [
    { key: 'edit', label: 'Edit', icon: <span>✏️</span> },
    { key: 'duplicate', label: 'Duplicate', icon: <span>📋</span> },
    { key: 'delete', label: 'Delete', icon: <span>🗑️</span>, danger: true },
  ]
  
  return (
      <ContextMenu items={items} onSelect={(key) => notification.info({ message: `Selected: ${key}` })}>
        <div className="p-8 bg-base-200 rounded-lg text-center cursor-context-menu">
          Right-click for options
        </div>
      </ContextMenu>
    )
}

export default App

Avec séparateurs

Séparer les sections de menu avec des séparateurs.

Right-click for menu with sections
import { ContextMenu, notification } from 'asterui'

function App() {
  const items = [
    { key: 'undo', label: 'Undo' },
    { key: 'redo', label: 'Redo' },
    { key: 'divider1', divider: true },
    { key: 'cut', label: 'Cut' },
    { key: 'copy', label: 'Copy' },
    { key: 'paste', label: 'Paste' },
    { key: 'divider2', divider: true },
    { key: 'select-all', label: 'Select All' },
  ]
  
  return (
      <ContextMenu items={items} onSelect={(key) => notification.info({ message: `Selected: ${key}` })}>
        <div className="p-8 bg-base-200 rounded-lg text-center cursor-context-menu">
          Right-click for menu with sections
        </div>
      </ContextMenu>
    )
}

export default App

Sous-menu imbriqué

Éléments de menu avec sous-menus imbriqués.

Right-click for nested menu
import { ContextMenu, notification } from 'asterui'

function App() {
  const items = [
    { key: 'new', label: 'New', children: [
      { key: 'new-file', label: 'File' },
      { key: 'new-folder', label: 'Folder' },
      { key: 'new-project', label: 'Project' },
    ]},
    { key: 'open', label: 'Open' },
    { key: 'save', label: 'Save' },
    { key: 'divider', divider: true },
    { key: 'export', label: 'Export', children: [
      { key: 'export-pdf', label: 'PDF' },
      { key: 'export-png', label: 'PNG' },
      { key: 'export-svg', label: 'SVG' },
    ]},
  ]
  
  return (
      <ContextMenu items={items} onSelect={(key) => notification.info({ message: `Selected: ${key}` })}>
        <div className="p-8 bg-base-200 rounded-lg text-center cursor-context-menu">
          Right-click for nested menu
        </div>
      </ContextMenu>
    )
}

export default App

Éléments désactivés

Certains éléments de menu peuvent être désactivés.

Right-click (some items disabled)
import { ContextMenu, notification } from 'asterui'

function App() {
  const items = [
    { key: 'copy', label: 'Copy' },
    { key: 'paste', label: 'Paste', disabled: true },
    { key: 'cut', label: 'Cut' },
    { key: 'delete', label: 'Delete', danger: true, disabled: true },
  ]
  
  return (
      <ContextMenu items={items} onSelect={(key) => notification.info({ message: `Selected: ${key}` })}>
        <div className="p-8 bg-base-200 rounded-lg text-center cursor-context-menu">
          Right-click (some items disabled)
        </div>
      </ContextMenu>
    )
}

export default App
PropriétéDescriptionTypeDéfaut
childrenÉlément qui déclenche le menu contextuel au clic droitReact.ReactNode-
itemsÉléments de menuContextMenuItem[]-
onSelectCallback lorsqu’un élément est sélectionné(key: string) => void-
disabledSi le menu contextuel est désactivébooleanfalse
classNameClasses CSS supplémentaires pour le menustring-
data-testidID de test pour les testsstring-
PropriétéDescriptionTypeDéfaut
keyIdentifiant unique pour l’élémentstring-
labelLibellé d’affichageReact.ReactNode-
iconÉlément d’icôneReact.ReactNode-
disabledÉtat désactivébooleanfalse
dangerAfficher comme action dangereuse/destructivebooleanfalse
dividerRendre comme séparateurbooleanfalse
childrenÉléments de sous-menuContextMenuItem[]-
data-testidID de test pour les testsstring-
PropriétéDescriptionTypeDéfaut
keyClé unique pour l’élément (prop key React)string-
childrenContenu de l’élémentReact.ReactNode-
iconIcône à afficher avant le libelléReact.ReactNode-
disabledSi l’élément est désactivébooleanfalse
dangerAfficher comme action dangereuse/destructivebooleanfalse
data-testidID de test pour les testsstring-
PropriétéDescriptionTypeDéfaut
keyClé unique pour le sous-menu (prop key React)string-
labelLibellé du sous-menuReact.ReactNode-
iconIcône à afficher avant le libelléReact.ReactNode-
disabledSi le sous-menu est désactivébooleanfalse
childrenÉléments de sous-menuReact.ReactNode-
data-testidID de test pour les testsstring-
  • Le menu se ferme à la pression de la touche Échap
  • Le menu se ferme lors d’un clic à l’extérieur
  • Les éléments de menu sont navigables au clavier
  • Les éléments désactivés sont correctement annoncés