or run

npx @tessl/cli init
Log in

Version

Tile

Overview

Evals

Files

Files

docs

index.mdlayout-components.mdmenu-container.mdmenu-items.mdsubmenu-system.md

menu-items.mddocs/

0

# Menu Items

1

2

Menu items are the individual interactive elements within a menu, providing click handling, icon support, disabled states, and mouse interaction events.

3

4

## Capabilities

5

6

### MenuItem Component

7

8

Individual menu item component with comprehensive interaction and styling options.

9

10

```typescript { .api }

11

/**

12

* Individual menu item component

13

* @param props - Menu item configuration props

14

* @returns React component

15

*/

16

declare const MenuItem: React.ForwardRefExoticComponent<MenuItemProps & React.RefAttributes<HTMLLIElement>>;

17

18

interface MenuItemProps extends Omit<React.HTMLAttributes<HTMLLIElement>, 'onClick' | 'onMouseEnter' | 'onMouseLeave' | 'onSelect'> {

19

// Content

20

children?: React.ReactNode;

21

22

// State

23

disabled?: boolean;

24

25

// Icons and Extras

26

itemIcon?: React.ReactNode | ((props: any) => React.ReactNode);

27

extra?: React.ReactNode;

28

29

// Event Handlers

30

onMouseEnter?: (info: { key: string; domEvent: React.MouseEvent }) => void;

31

onMouseLeave?: (info: { key: string; domEvent: React.MouseEvent }) => void;

32

}

33

```

34

35

**Usage Examples:**

36

37

```typescript

38

import Menu, { MenuItem } from "rc-menu";

39

40

// Basic menu item

41

<MenuItem key="1">Home</MenuItem>

42

43

// Menu item with icon

44

<MenuItem key="2" itemIcon={<HomeIcon />}>

45

Home

46

</MenuItem>

47

48

// Disabled menu item

49

<MenuItem key="3" disabled>

50

Disabled Item

51

</MenuItem>

52

53

// Menu item with extra content

54

<MenuItem key="4" extra={<Badge count={5} />}>

55

Messages

56

</MenuItem>

57

58

// Menu item with hover handlers

59

<MenuItem

60

key="5"

61

onMouseEnter={(info) => console.log('Mouse enter:', info.key)}

62

onMouseLeave={(info) => console.log('Mouse leave:', info.key)}

63

>

64

Hover Me

65

</MenuItem>

66

```

67

68

### Dynamic Icon Rendering

69

70

Icons can be static React nodes or dynamic functions that receive state information.

71

72

73

**Usage Examples:**

74

75

```typescript

76

// Static icon

77

<MenuItem key="1" itemIcon={<UserIcon />}>

78

Profile

79

</MenuItem>

80

81

// Dynamic icon based on selection state

82

<MenuItem

83

key="2"

84

itemIcon={({ isSelected, disabled }) => (

85

isSelected ? <FilledStarIcon /> : <OutlineStarIcon />

86

)}

87

>

88

Favorites

89

</MenuItem>

90

91

// Dynamic icon with disabled state

92

<MenuItem

93

key="3"

94

disabled={isProcessing}

95

itemIcon={({ disabled }) => (

96

disabled ? <LoadingIcon /> : <SaveIcon />

97

)}

98

>

99

Save

100

</MenuItem>

101

```

102

103

### Menu Item States

104

105

Understanding different states and their visual representation.

106

107

**Selection States:**

108

109

```typescript

110

// Selected item (when parent Menu has selectable=true)

111

<Menu selectable defaultSelectedKeys={['selected']}>

112

<MenuItem key="selected">Selected Item</MenuItem>

113

<MenuItem key="unselected">Unselected Item</MenuItem>

114

</Menu>

115

116

// Active item (keyboard navigation focus)

117

<Menu defaultActiveFirst>

118

<MenuItem key="1">First Item (Active)</MenuItem>

119

<MenuItem key="2">Second Item</MenuItem>

120

</Menu>

121

```

122

123

**Disabled State:**

124

125

```typescript

126

<Menu>

127

<MenuItem key="1">Normal Item</MenuItem>

128

<MenuItem key="2" disabled>Disabled Item</MenuItem>

129

<MenuItem key="3">Another Normal Item</MenuItem>

130

</Menu>

131

```

132

133

### Extra Content and Advanced Layouts

134

135

Menu items can contain additional content beyond text and icons.

136

137

```typescript

138

import { Badge, Tag, Switch } from 'antd';

139

140

<Menu>

141

<MenuItem key="1" extra={<Badge count={3} />}>

142

Messages

143

</MenuItem>

144

145

<MenuItem key="2" extra={<Tag color="red">New</Tag>}>

146

Features

147

</MenuItem>

148

149

<MenuItem key="3" extra={<Switch size="small" />}>

150

Notifications

151

</MenuItem>

152

153

<MenuItem key="4">

154

<div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center' }}>

155

<span>Custom Layout</span>

156

<span style={{ color: '#999', fontSize: '12px' }}>Ctrl+K</span>

157

</div>

158

</MenuItem>

159

</Menu>

160

```

161

162

### Event Handling

163

164

Menu items support various mouse interaction events.

165

166

```typescript

167

const handleItemHover = (info: { key: string; domEvent: React.MouseEvent }) => {

168

console.log(`Hovering over item: ${info.key}`);

169

// Access DOM event for additional information

170

console.log('Mouse position:', info.domEvent.clientX, info.domEvent.clientY);

171

};

172

173

const handleItemLeave = (info: { key: string; domEvent: React.MouseEvent }) => {

174

console.log(`Left item: ${info.key}`);

175

};

176

177

<Menu>

178

<MenuItem

179

key="1"

180

onMouseEnter={handleItemHover}

181

onMouseLeave={handleItemLeave}

182

>

183

Hover-sensitive Item

184

</MenuItem>

185

</Menu>

186

```

187

188

### Integration with Menu Container Events

189

190

Menu items work seamlessly with Menu container events for comprehensive interaction handling.

191

192

```typescript

193

const handleMenuClick = (info: { key: string; keyPath: string[]; domEvent: React.MouseEvent | React.KeyboardEvent }) => {

194

console.log('Menu clicked:', info.key);

195

console.log('Key path:', info.keyPath); // ['1'] for top-level, ['sub1', '1'] for nested

196

};

197

198

const handleMenuSelect = (info: { key: string; keyPath: string[]; selectedKeys: string[]; domEvent: React.MouseEvent | React.KeyboardEvent }) => {

199

console.log('Menu selected:', info.key);

200

console.log('All selected:', info.selectedKeys);

201

};

202

203

<Menu onClick={handleMenuClick} onSelect={handleMenuSelect} selectable>

204

<MenuItem key="1">Item 1</MenuItem>

205

<MenuItem key="2">Item 2</MenuItem>

206

<SubMenu key="sub1" title="Sub Menu">

207

<MenuItem key="3">Nested Item</MenuItem>

208

</SubMenu>

209

</Menu>

210

```