Loading...
Loading...
Compare original and translation side by side
@syncfusion/ej2-react-navigations@syncfusion/ej2-react-navigationstargettargetstring<ContextMenuComponent target="#myElement" items={menuItems} />function App() {
return (
<div>
<div id="target">Right-click here</div>
<ContextMenuComponent target="#target" items={menuItems} />
</div>
);
}string<ContextMenuComponent target="#myElement" items={menuItems} />function App() {
return (
<div>
<div id="target">右键点击此处</div>
<ContextMenuComponent target="#target" items={menuItems} />
</div>
);
}itemsitemsMenuItemModel[]const menuItems: MenuItemModel[] = [
{ text: 'Cut' },
{ text: 'Copy' },
{ text: 'Paste' },
{ separator: true },
{
text: 'More',
items: [
{ text: 'Properties' },
{ text: 'Delete' }
]
}
];
<ContextMenuComponent target="#target" items={menuItems} />MenuItemModel[]const menuItems: MenuItemModel[] = [
{ text: '剪切' },
{ text: '复制' },
{ text: '粘贴' },
{ separator: true },
{
text: '更多',
items: [
{ text: '属性' },
{ text: '删除' }
]
}
];
<ContextMenuComponent target="#target" items={menuItems} />animationSettingsanimationSettingsMenuAnimationSettingsModeleffectdurationeasingconst animationSettings = {
effect: 'FadeIn',
duration: 300,
easing: 'ease-out'
};
<ContextMenuComponent
target="#target"
items={menuItems}
animationSettings={animationSettings}
/>| Effect | Description |
|---|---|
| No animation |
| Slide down from top |
| Zoom in effect |
| Fade in opacity |
MenuAnimationSettingsModeleffectdurationeasingconst animationSettings = {
effect: 'FadeIn',
duration: 300,
easing: 'ease-out'
};
<ContextMenuComponent
target="#target"
items={menuItems}
animationSettings={animationSettings}
/>| 效果 | 描述 |
|---|---|
| 无动画 |
| 从顶部滑下 |
| 放大效果 |
| 淡入效果 |
cssClasscssClassstring<ContextMenuComponent
target="#target"
items={menuItems}
cssClass="custom-menu dark-theme"
/>string<ContextMenuComponent
target="#target"
items={menuItems}
cssClass="custom-menu dark-theme"
/>enableScrollingenableScrollingboolean<ContextMenuComponent
target="#target"
items={largeMenuList}
enableScrolling={true}
/>boolean<ContextMenuComponent
target="#target"
items={largeMenuList}
enableScrolling={true}
/>filterfilterstring// Context menu only appears on table rows, not the entire table
<ContextMenuComponent
target="#table"
filter="tr"
items={menuItems}
/>string// 仅在表格行上显示上下文菜单,而非整个表格
<ContextMenuComponent
target="#table"
filter="tr"
items={menuItems}
/>hoverDelayhoverDelaynumber<ContextMenuComponent
target="#target"
items={menuItems}
hoverDelay={500} // 500ms before submenu appears
/>number<ContextMenuComponent
target="#target"
items={menuItems}
hoverDelay={500} // 500ms后显示子菜单
/>showItemOnClickshowItemOnClickbooleantrue<ContextMenuComponent
target="#target"
items={menuItems}
showItemOnClick={true} // Submenus open on click only
/>booleantrue<ContextMenuComponent
target="#target"
items={menuItems}
showItemOnClick={true} // 子菜单仅在点击时打开
/>itemTemplateitemTemplatestring | Function${propertyName}const template = `
<div class="menu-item">
<span class="${iconCss}"></span>
<span>${text}</span>
<span class="shortcut">${shortcut}</span>
</div>
`;
<ContextMenuComponent
target="#target"
items={menuItems}
itemTemplate={template}
/>string | Function${propertyName}const template = `
<div class="menu-item">
<span class="${iconCss}"></span>
<span>${text}</span>
<span class="shortcut">${shortcut}</span>
</div>
`;
<ContextMenuComponent
target="#target"
items={menuItems}
itemTemplate={template}
/>localelocalestring<ContextMenuComponent
target="#target"
items={menuItems}
locale="es-ES" // Spanish localization
/>string<ContextMenuComponent
target="#target"
items={menuItems}
locale="es-ES" // 西班牙语本地化
/>enableHtmlSanitizerenableHtmlSanitizerboolean<ContextMenuComponent
target="#target"
items={menuItems}
enableHtmlSanitizer={true} // Sanitize HTML content
/>boolean<ContextMenuComponent
target="#target"
items={menuItems}
enableHtmlSanitizer={true} // 清理HTML内容
/>enablePersistenceenablePersistenceboolean<ContextMenuComponent
target="#target"
items={menuItems}
enablePersistence={true}
/>boolean<ContextMenuComponent
target="#target"
items={menuItems}
enablePersistence={true}
/>enableRtlenableRtlboolean<ContextMenuComponent
target="#target"
items={menuItems}
enableRtl={true}
/>boolean<ContextMenuComponent
target="#target"
items={menuItems}
enableRtl={true}
/>MenuItemModelMenuItemModeltexttextstring{ text: 'Cut' }
{ text: 'Copy' }string{ text: '剪切' }
{ text: '复制' }ididstring{ id: 'cut-item', text: 'Cut' }
{ id: 'copy-item', text: 'Copy' }string{ id: 'cut-item', text: '剪切' }
{ id: 'copy-item', text: '复制' }iconCssiconCssstring{ text: 'Cut', iconCss: 'e-icons e-cut' }
{ text: 'Copy', iconCss: 'e-icons e-copy' }
{ text: 'Delete', iconCss: 'e-icons e-delete' }string{ text: '剪切', iconCss: 'e-icons e-cut' }
{ text: '复制', iconCss: 'e-icons e-copy' }
{ text: '删除', iconCss: 'e-icons e-delete' }itemsitemsMenuItemModel[]{
text: 'File',
items: [
{ text: 'New' },
{ text: 'Open' },
{ text: 'Save' }
]
}MenuItemModel[]{
text: '文件',
items: [
{ text: '新建' },
{ text: '打开' },
{ text: '保存' }
]
}separatorseparatorbooleanconst menuItems: MenuItemModel[] = [
{ text: 'Cut' },
{ text: 'Copy' },
{ separator: true }, // Visual divider
{ text: 'Delete' }
];booleanconst menuItems: MenuItemModel[] = [
{ text: '剪切' },
{ text: '复制' },
{ separator: true }, // 视觉分隔符
{ text: '删除' }
];urlurlstring{ text: 'Visit Site', url: 'https://example.com' }
{ text: 'Documentation', url: '/docs' }string{ text: '访问站点', url: 'https://example.com' }
{ text: '文档', url: '/docs' }htmlAttributeshtmlAttributesRecord<string, string>{
text: 'Download',
htmlAttributes: {
'data-action': 'download',
'aria-label': 'Download file',
'title': 'Download the file'
}
}Record<string, string>{
text: '下载',
htmlAttributes: {
'data-action': 'download',
'aria-label': '下载文件',
'title': '下载文件'
}
}open(top: number, left: number, target?: HTMLElement): voidopen(top: number, left: number, target?: HTMLElement): voidtoplefttargetfunction App() {
const menuRef = React.useRef<ContextMenuComponent>(null);
const openMenuAtClick = (event: React.MouseEvent) => {
menuRef.current?.open(event.clientY, event.clientX);
};
return (
<div>
<button onClick={openMenuAtClick}>Open Menu</button>
<ContextMenuComponent ref={menuRef} target="#target" items={menuItems} />
</div>
);
}toplefttargetfunction App() {
const menuRef = React.useRef<ContextMenuComponent>(null);
const openMenuAtClick = (event: React.MouseEvent) => {
menuRef.current?.open(event.clientY, event.clientX);
};
return (
<div>
<button onClick={openMenuAtClick}>打开菜单</button>
<ContextMenuComponent ref={menuRef} target="#target" items={menuItems} />
</div>
);
}close(): voidclose(): voidfunction App() {
const menuRef = React.useRef<ContextMenuComponent>(null);
const closeMenu = () => {
menuRef.current?.close();
};
const handleItemSelect = (args: MenuEventArgs) => {
console.log('Selected:', args.item?.text);
closeMenu(); // Close menu after selection
};
return (
<ContextMenuComponent
ref={menuRef}
target="#target"
items={menuItems}
select={handleItemSelect}
/>
);
}function App() {
const menuRef = React.useRef<ContextMenuComponent>(null);
const closeMenu = () => {
menuRef.current?.close();
};
const handleItemSelect = (args: MenuEventArgs) => {
console.log('选中:', args.item?.text);
closeMenu(); // 选中后关闭菜单
};
return (
<ContextMenuComponent
ref={menuRef}
target="#target"
items={menuItems}
select={handleItemSelect}
/>
);
}showItems(items: string[], isUniqueId?: boolean): voidshowItems(items: string[], isUniqueId?: boolean): voiditemsisUniqueIdfunction App() {
const menuRef = React.useRef<ContextMenuComponent>(null);
const showDeleteOption = () => {
menuRef.current?.showItems(['Delete', 'Rename']);
};
return (
<div>
<button onClick={showDeleteOption}>Show Options</button>
<ContextMenuComponent ref={menuRef} target="#target" items={menuItems} />
</div>
);
}itemsisUniqueIdfunction App() {
const menuRef = React.useRef<ContextMenuComponent>(null);
const showDeleteOption = () => {
menuRef.current?.showItems(['删除', '重命名']);
};
return (
<div>
<button onClick={showDeleteOption}>显示选项</button>
<ContextMenuComponent ref={menuRef} target="#target" items={menuItems} />
</div>
);
}hideItems(items: string[], isUniqueId?: boolean): voidhideItems(items: string[], isUniqueId?: boolean): voiditemsisUniqueIdfunction App() {
const menuRef = React.useRef<ContextMenuComponent>(null);
React.useEffect(() => {
// Hide delete option for read-only mode
if (isReadOnly) {
menuRef.current?.hideItems(['Delete', 'Modify']);
}
}, [isReadOnly]);
return (
<ContextMenuComponent ref={menuRef} target="#target" items={menuItems} />
);
}itemsisUniqueIdfunction App() {
const menuRef = React.useRef<ContextMenuComponent>(null);
React.useEffect(() => {
// 只读模式下隐藏删除选项
if (isReadOnly) {
menuRef.current?.hideItems(['删除', '修改']);
}
}, [isReadOnly]);
return (
<ContextMenuComponent ref={menuRef} target="#target" items={menuItems} />
);
}enableItems(items: string[], enable: boolean, isUniqueId?: boolean): voidenableItems(items: string[], enable: boolean, isUniqueId?: boolean): voiditemsenableisUniqueIdfunction App() {
const menuRef = React.useRef<ContextMenuComponent>(null);
const disablePasteIfNoClipboard = async () => {
const canPaste = await navigator.permissions.query({ name: 'clipboard-read' });
if (canPaste.state === 'denied') {
menuRef.current?.enableItems(['Paste'], false);
}
};
React.useEffect(() => {
disablePasteIfNoClipboard();
}, []);
return (
<ContextMenuComponent
ref={menuRef}
target="#target"
items={menuItems}
beforeOpen={disablePasteIfNoClipboard}
/>
);
}itemsenableisUniqueIdfunction App() {
const menuRef = React.useRef<ContextMenuComponent>(null);
const disablePasteIfNoClipboard = async () => {
const canPaste = await navigator.permissions.query({ name: 'clipboard-read' });
if (canPaste.state === 'denied') {
menuRef.current?.enableItems(['粘贴'], false);
}
};
React.useEffect(() => {
disablePasteIfNoClipboard();
}, []);
return (
<ContextMenuComponent
ref={menuRef}
target="#target"
items={menuItems}
beforeOpen={disablePasteIfNoClipboard}
/>
);
}insertAfter(items: MenuItemModel[], text: string, isUniqueId?: boolean): voidinsertAfter(items: MenuItemModel[], text: string, isUniqueId?: boolean): voiditemstextisUniqueIdfunction App() {
const menuRef = React.useRef<ContextMenuComponent>(null);
const addSortByOption = () => {
const newItems: MenuItemModel[] = [
{ text: 'Sort By Name' },
{ text: 'Sort By Date' }
];
menuRef.current?.insertAfter(newItems, 'View');
};
return (
<div>
<button onClick={addSortByOption}>Add Sort Options</button>
<ContextMenuComponent ref={menuRef} target="#target" items={menuItems} />
</div>
);
}itemstextisUniqueIdfunction App() {
const menuRef = React.useRef<ContextMenuComponent>(null);
const addSortByOption = () => {
const newItems: MenuItemModel[] = [
{ text: '按名称排序' },
{ text: '按日期排序' }
];
menuRef.current?.insertAfter(newItems, '查看');
};
return (
<div>
<button onClick={addSortByOption}>添加排序选项</button>
<ContextMenuComponent ref={menuRef} target="#target" items={menuItems} />
</div>
);
}insertBefore(items: MenuItemModel[], text: string, isUniqueId?: boolean): voidinsertBefore(items: MenuItemModel[], text: string, isUniqueId?: boolean): voidfunction App() {
const menuRef = React.useRef<ContextMenuComponent>(null);
const addPremiumOptions = () => {
const premiumItems: MenuItemModel[] = [
{ text: 'Premium Feature 1' },
{ text: 'Premium Feature 2', iconCss: 'e-icons e-star' }
];
// Insert before 'Delete' option
menuRef.current?.insertBefore(premiumItems, 'Delete');
};
React.useEffect(() => {
if (user.isPremium) {
addPremiumOptions();
}
}, [user.isPremium]);
return (
<ContextMenuComponent ref={menuRef} target="#target" items={menuItems} />
);
}function App() {
const menuRef = React.useRef<ContextMenuComponent>(null);
const addPremiumOptions = () => {
const premiumItems: MenuItemModel[] = [
{ text: '高级功能1' },
{ text: '高级功能2', iconCss: 'e-icons e-star' }
];
// 在'删除'选项之前插入
menuRef.current?.insertBefore(premiumItems, '删除');
};
React.useEffect(() => {
if (user.isPremium) {
addPremiumOptions();
}
}, [user.isPremium]);
return (
<ContextMenuComponent ref={menuRef} target="#target" items={menuItems} />
);
}removeItems(items: string[], isUniqueId?: boolean): voidremoveItems(items: string[], isUniqueId?: boolean): voiditemsisUniqueIdfunction App() {
const menuRef = React.useRef<ContextMenuComponent>(null);
const removeRestrictedActions = () => {
menuRef.current?.removeItems(['Delete', 'Export', 'Archive']);
};
React.useEffect(() => {
if (userRole === 'viewer') {
removeRestrictedActions();
}
}, [userRole]);
return (
<ContextMenuComponent
ref={menuRef}
target="#target"
items={menuItems}
created={removeRestrictedActions}
/>
);
}itemsisUniqueIdfunction App() {
const menuRef = React.useRef<ContextMenuComponent>(null);
const removeRestrictedActions = () => {
menuRef.current?.removeItems(['删除', '导出', '归档']);
};
React.useEffect(() => {
if (userRole === '查看者') {
removeRestrictedActions();
}
}, [userRole]);
return (
<ContextMenuComponent
ref={menuRef}
target="#target"
items={menuItems}
created={removeRestrictedActions}
/>
);
}getItemIndex(item: MenuItem | string, isUniqueId?: boolean): number[]getItemIndex(item: MenuItem | string, isUniqueId?: boolean): number[]itemisUniqueIdnumber[]function App() {
const menuRef = React.useRef<ContextMenuComponent>(null);
const findItemPosition = () => {
const indices = menuRef.current?.getItemIndex('Copy');
console.log('Copy is at index:', indices); // Output: [1] or [0, 1] for nested
const nestedIndices = menuRef.current?.getItemIndex('Open', false);
console.log('Open is at indices:', nestedIndices); // Output: [0, 1] for nested
};
return (
<div>
<button onClick={findItemPosition}>Find Item</button>
<ContextMenuComponent ref={menuRef} target="#target" items={menuItems} />
</div>
);
}itemisUniqueIdnumber[]function App() {
const menuRef = React.useRef<ContextMenuComponent>(null);
const findItemPosition = () => {
const indices = menuRef.current?.getItemIndex('复制');
console.log('复制的索引:', indices); // 输出: [1] 或嵌套项的 [0, 1]
const nestedIndices = menuRef.current?.getItemIndex('打开', false);
console.log('打开的索引:', nestedIndices); // 输出: 嵌套项的 [0, 1]
};
return (
<div>
<button onClick={findItemPosition}>查找项位置</button>
<ContextMenuComponent ref={menuRef} target="#target" items={menuItems} />
</div>
);
}setItem(item: MenuItem, id?: string, isUniqueId?: boolean): voidsetItem(item: MenuItem, id?: string, isUniqueId?: boolean): voiditemidisUniqueIdfunction App() {
const menuRef = React.useRef<ContextMenuComponent>(null);
const updateDeleteItemStyle = () => {
const updatedItem: MenuItemModel = {
text: 'Delete',
iconCss: 'e-icons e-delete',
htmlAttributes: {
'class': 'dangerous-action'
}
};
menuRef.current?.setItem(updatedItem, 'Delete');
};
return (
<div>
<button onClick={updateDeleteItemStyle}>Update Delete Item</button>
<ContextMenuComponent ref={menuRef} target="#target" items={menuItems} />
</div>
);
}itemidisUniqueIdfunction App() {
const menuRef = React.useRef<ContextMenuComponent>(null);
const updateDeleteItemStyle = () => {
const updatedItem: MenuItemModel = {
text: '删除',
iconCss: 'e-icons e-delete',
htmlAttributes: {
'class': 'dangerous-action'
}
};
menuRef.current?.setItem(updatedItem, '删除');
};
return (
<div>
<button onClick={updateDeleteItemStyle}>更新删除项样式</button>
<ContextMenuComponent ref={menuRef} target="#target" items={menuItems} />
</div>
);
}destroy(): voiddestroy(): voidfunction App() {
const menuRef = React.useRef<ContextMenuComponent>(null);
React.useEffect(() => {
return () => {
// Cleanup on component unmount
menuRef.current?.destroy();
};
}, []);
return (
<ContextMenuComponent ref={menuRef} target="#target" items={menuItems} />
);
}function App() {
const menuRef = React.useRef<ContextMenuComponent>(null);
React.useEffect(() => {
return () => {
// 组件卸载时清理
menuRef.current?.destroy();
};
}, []);
return (
<ContextMenuComponent ref={menuRef} target="#target" items={menuItems} />
);
}beforeOpenbeforeOpenEmitType<BeforeOpenCloseMenuEventArgs>interface BeforeOpenCloseMenuEventArgs {
element: HTMLElement; // Menu element
event: Event; // Browser event object
items: MenuItemModel[]; // Current menu items
cancel: boolean; // Set to true to prevent action
parentItem?: MenuItemModel; // Parent item if submenu
}function App() {
const handleBeforeOpen = (args: BeforeOpenCloseMenuEventArgs) => {
// Prevent opening on read-only elements
const target = args.event?.target as HTMLElement;
if (target?.classList.contains('read-only')) {
args.cancel = true; // Prevent menu from opening
return;
}
// Modify items before opening
const selectedText = window.getSelection()?.toString();
if (!selectedText) {
// Disable text-related operations if no text selected
args.items = args.items?.map(item => ({
...item,
disabled: ['Copy', 'Cut'].includes(item.text as string)
}));
}
};
return (
<ContextMenuComponent
target="#target"
items={menuItems}
beforeOpen={handleBeforeOpen}
/>
);
}EmitType<BeforeOpenCloseMenuEventArgs>interface BeforeOpenCloseMenuEventArgs {
element: HTMLElement; // 菜单元素
event: Event; // 浏览器事件对象
items: MenuItemModel[]; // 当前菜单项
cancel: boolean; // 设置为true可阻止操作
parentItem?: MenuItemModel; // 父项(如果是子菜单)
}function App() {
const handleBeforeOpen = (args: BeforeOpenCloseMenuEventArgs) => {
// 阻止在只读元素上打开
const target = args.event?.target as HTMLElement;
if (target?.classList.contains('read-only')) {
args.cancel = true; // 阻止菜单打开
return;
}
// 打开前修改项
const selectedText = window.getSelection()?.toString();
if (!selectedText) {
// 未选中文本时禁用文本相关操作
args.items = args.items?.map(item => ({
...item,
disabled: ['复制', '剪切'].includes(item.text as string)
}));
}
};
return (
<ContextMenuComponent
target="#target"
items={menuItems}
beforeOpen={handleBeforeOpen}
/>
);
}onOpenonOpenEmitType<OpenCloseMenuEventArgs>interface OpenCloseMenuEventArgs {
element: HTMLElement; // Menu element
event: Event; // Browser event that triggered opening
items: MenuItemModel[]; // Current menu items
}function App() {
const handleOnOpen = (args: OpenCloseMenuEventArgs) => {
console.log('Menu opened at:', new Date());
console.log('Number of items:', args.items?.length);
// Set focus to first menu item for accessibility
setTimeout(() => {
const firstItem = args.element?.querySelector('.e-menu-item');
(firstItem as HTMLElement)?.focus();
}, 0);
};
return (
<ContextMenuComponent
target="#target"
items={menuItems}
onOpen={handleOnOpen}
/>
);
}EmitType<OpenCloseMenuEventArgs>interface OpenCloseMenuEventArgs {
element: HTMLElement; // 菜单元素
event: Event; // 触发打开的浏览器事件
items: MenuItemModel[]; // 当前菜单项
}function App() {
const handleOnOpen = (args: OpenCloseMenuEventArgs) => {
console.log('菜单打开时间:', new Date());
console.log('项数量:', args.items?.length);
// 为无障碍访问设置焦点到第一个菜单项
setTimeout(() => {
const firstItem = args.element?.querySelector('.e-menu-item');
(firstItem as HTMLElement)?.focus();
}, 0);
};
return (
<ContextMenuComponent
target="#target"
items={menuItems}
onOpen={handleOnOpen}
/>
);
}beforeClosebeforeCloseEmitType<BeforeOpenCloseMenuEventArgs>function App() {
const [hasUnsavedChanges, setHasUnsavedChanges] = React.useState(false);
const handleBeforeClose = (args: BeforeOpenCloseMenuEventArgs) => {
if (hasUnsavedChanges) {
const confirmed = window.confirm('Unsaved changes. Close anyway?');
if (!confirmed) {
args.cancel = true; // Prevent menu from closing
}
}
};
return (
<ContextMenuComponent
target="#target"
items={menuItems}
beforeClose={handleBeforeClose}
/>
);
}EmitType<BeforeOpenCloseMenuEventArgs>function App() {
const [hasUnsavedChanges, setHasUnsavedChanges] = React.useState(false);
const handleBeforeClose = (args: BeforeOpenCloseMenuEventArgs) => {
if (hasUnsavedChanges) {
const confirmed = window.confirm('存在未保存更改。仍要关闭吗?');
if (!confirmed) {
args.cancel = true; // 阻止菜单关闭
}
}
};
return (
<ContextMenuComponent
target="#target"
items={menuItems}
beforeClose={handleBeforeClose}
/>
);
}onCloseonCloseEmitType<OpenCloseMenuEventArgs>function App() {
const handleOnClose = (args: OpenCloseMenuEventArgs) => {
console.log('Menu closed');
// Clear temporary selections or states
document.querySelectorAll('.temp-highlight').forEach(el => {
el.classList.remove('temp-highlight');
});
};
return (
<ContextMenuComponent
target="#target"
items={menuItems}
onClose={handleOnClose}
/>
);
}EmitType<OpenCloseMenuEventArgs>function App() {
const handleOnClose = (args: OpenCloseMenuEventArgs) => {
console.log('菜单已关闭');
// 清除临时选择或状态
document.querySelectorAll('.temp-highlight').forEach(el => {
el.classList.remove('temp-highlight');
});
};
return (
<ContextMenuComponent
target="#target"
items={menuItems}
onClose={handleOnClose}
/>
);
}selectselectEmitType<MenuEventArgs>interface MenuEventArgs {
element: HTMLElement; // Menu item element
event: Event; // Click/keyboard event
item?: MenuItemModel; // Selected menu item
items?: MenuItemModel[]; // All menu items
}function App() {
const handleSelect = (args: MenuEventArgs) => {
const itemText = args.item?.text;
switch (itemText) {
case 'Cut':
document.execCommand('cut');
console.log('Cut executed');
break;
case 'Copy':
document.execCommand('copy');
console.log('Copy executed');
break;
case 'Paste':
document.execCommand('paste');
console.log('Paste executed');
break;
case 'Delete':
if (confirm('Confirm delete?')) {
console.log('Delete executed');
}
break;
}
};
return (
<ContextMenuComponent
target="#target"
items={menuItems}
select={handleSelect}
/>
);
}EmitType<MenuEventArgs>interface MenuEventArgs {
element: HTMLElement; // 菜单项元素
event: Event; // 点击/键盘事件
item?: MenuItemModel; // 选中的菜单项
items?: MenuItemModel[]; // 所有菜单项
}function App() {
const handleSelect = (args: MenuEventArgs) => {
const itemText = args.item?.text;
switch (itemText) {
case '剪切':
document.execCommand('cut');
console.log('执行剪切');
break;
case '复制':
document.execCommand('copy');
console.log('执行复制');
break;
case '粘贴':
document.execCommand('paste');
console.log('执行粘贴');
break;
case '删除':
if (confirm('确认删除?')) {
console.log('执行删除');
}
break;
}
};
return (
<ContextMenuComponent
target="#target"
items={menuItems}
select={handleSelect}
/>
);
}beforeItemRenderbeforeItemRenderEmitType<MenuEventArgs>function App() {
const handleBeforeItemRender = (args: MenuEventArgs) => {
const itemText = args.item?.text;
// Disable delete if user doesn't have permission
if (itemText === 'Delete' && !userPermissions.canDelete) {
args.element?.classList.add('e-disabled');
}
// Highlight recent items
if (itemText?.startsWith('Recent:')) {
args.element?.classList.add('recent-item-highlight');
}
// Add keyboard shortcut indicator
const shortcuts: Record<string, string> = {
'Cut': 'Ctrl+X',
'Copy': 'Ctrl+C',
'Paste': 'Ctrl+V'
};
if (shortcuts[itemText as string]) {
const shortcutEl = document.createElement('span');
shortcutEl.className = 'shortcut-hint';
shortcutEl.textContent = shortcuts[itemText as string];
args.element?.appendChild(shortcutEl);
}
};
return (
<ContextMenuComponent
target="#target"
items={menuItems}
beforeItemRender={handleBeforeItemRender}
/>
);
}EmitType<MenuEventArgs>function App() {
const handleBeforeItemRender = (args: MenuEventArgs) => {
const itemText = args.item?.text;
// 用户无权限时禁用删除
if (itemText === '删除' && !userPermissions.canDelete) {
args.element?.classList.add('e-disabled');
}
// 高亮最近项
if (itemText?.startsWith('最近:')) {
args.element?.classList.add('recent-item-highlight');
}
// 添加键盘快捷键指示器
const shortcuts: Record<string, string> = {
'剪切': 'Ctrl+X',
'复制': 'Ctrl+C',
'粘贴': 'Ctrl+V'
};
if (shortcuts[itemText as string]) {
const shortcutEl = document.createElement('span');
shortcutEl.className = 'shortcut-hint';
shortcutEl.textContent = shortcuts[itemText as string];
args.element?.appendChild(shortcutEl);
}
};
return (
<ContextMenuComponent
target="#target"
items={menuItems}
beforeItemRender={handleBeforeItemRender}
/>
);
}createdcreatedEmitType<Event>function App() {
const menuRef = React.useRef<ContextMenuComponent>(null);
const handleCreated = () => {
console.log('ContextMenu created and ready');
// Perform initial setup
menuRef.current?.enableItems(['Advanced Options'], userRole === 'admin');
// Add custom data to items
const items = menuRef.current?.items;
if (items) {
items.forEach((item, index) => {
item.id = `item-${index}`;
});
}
};
return (
<ContextMenuComponent
ref={menuRef}
target="#target"
items={menuItems}
created={handleCreated}
/>
);
}EmitType<Event>function App() {
const menuRef = React.useRef<ContextMenuComponent>(null);
const handleCreated = () => {
console.log('ContextMenu已创建并就绪');
// 执行初始设置
menuRef.current?.enableItems(['高级选项'], userRole === '管理员');
// 为项添加自定义数据
const items = menuRef.current?.items;
if (items) {
items.forEach((item, index) => {
item.id = `item-${index}`;
});
}
};
return (
<ContextMenuComponent
ref={menuRef}
target="#target"
items={menuItems}
created={handleCreated}
/>
);
}import { ContextMenuComponent, MenuItemModel } from '@syncfusion/ej2-react-navigations';
import * as React from 'react';
function App() {
const menuRef = React.useRef<ContextMenuComponent>(null);
const menuItems: MenuItemModel[] = [
{ text: 'Cut', iconCss: 'e-icons e-cut', id: 'cut' },
{ text: 'Copy', iconCss: 'e-icons e-copy', id: 'copy' },
{ text: 'Paste', iconCss: 'e-icons e-paste', id: 'paste' },
{ separator: true },
{
text: 'More',
items: [
{ text: 'Delete' },
{ text: 'Properties' }
]
}
];
const handleSelect = (args: any) => {
console.log('Selected:', args.item?.text);
};
const handleBeforeOpen = (args: any) => {
// Customize menu before opening
};
return (
<div>
<div id="target">Right-click me</div>
<ContextMenuComponent
ref={menuRef}
target="#target"
items={menuItems}
select={handleSelect}
beforeOpen={handleBeforeOpen}
animationSettings={{ effect: 'FadeIn', duration: 300 }}
enableScrolling={true}
/>
</div>
);
}
export default App;import { ContextMenuComponent, MenuItemModel } from '@syncfusion/ej2-react-navigations';
import * as React from 'react';
function App() {
const menuRef = React.useRef<ContextMenuComponent>(null);
const menuItems: MenuItemModel[] = [
{ text: '剪切', iconCss: 'e-icons e-cut', id: 'cut' },
{ text: '复制', iconCss: 'e-icons e-copy', id: 'copy' },
{ text: '粘贴', iconCss: 'e-icons e-paste', id: 'paste' },
{ separator: true },
{
text: '更多',
items: [
{ text: '删除' },
{ text: '属性' }
]
}
];
const handleSelect = (args: any) => {
console.log('选中:', args.item?.text);
};
const handleBeforeOpen = (args: any) => {
// 打开前自定义菜单
};
return (
<div>
<div id="target">右键点击我</div>
<ContextMenuComponent
ref={menuRef}
target="#target"
items={menuItems}
select={handleSelect}
beforeOpen={handleBeforeOpen}
animationSettings={{ effect: 'FadeIn', duration: 300 }}
enableScrolling={true}
/>
</div>
);
}
export default App;// Open menu at coordinates
menuRef.current?.open(100, 150);
// Close menu
menuRef.current?.close();
// Enable/disable items
menuRef.current?.enableItems(['Delete', 'Archive'], false);
// Show/hide items
menuRef.current?.showItems(['Delete']);
menuRef.current?.hideItems(['Export']);
// Add items
menuRef.current?.insertAfter(
[{ text: 'New Option' }],
'Existing Item'
);
// Remove items
menuRef.current?.removeItems(['Outdated Item']);
// Get item index
const indices = menuRef.current?.getItemIndex('Copy');// 在指定坐标打开菜单
menuRef.current?.open(100, 150);
// 关闭菜单
menuRef.current?.close();
// 启用/禁用项
menuRef.current?.enableItems(['删除', '归档'], false);
// 显示/隐藏项
menuRef.current?.showItems(['删除']);
menuRef.current?.hideItems(['导出']);
// 添加项
menuRef.current?.insertAfter(
[{ text: '新选项' }],
'现有项'
);
// 移除项
menuRef.current?.removeItems(['过时项']);
// 获取项索引
const indices = menuRef.current?.getItemIndex('复制');