Copy
Menu(props: { label: Component }, children: Component[]): Component;
Parameters
Configuration object containing the menu label.
Show properties
Show properties
The component to display as the menu button label.
An array of menu items, including buttons, dividers, and submenus.
Support
Usage
Simple menu with actions
Copy
Menu({ label: Text("Options") }, [
Button("Edit", () => {
editItem();
}),
Button("Delete", () => {
deleteItem();
})
])
Menu with custom label
Copy
Menu({
label: HStack([
Image({ systemName: "ellipsis" }),
Text("More")
])
}, [
Button("Share", () => {
shareContent();
}),
Button("Copy Link", () => {
copyLink();
}),
Divider(),
Button("Report", () => {
reportContent();
})
])
Context menu with sections
Copy
Menu({ label: Text("File") }, [
Button("New", () => {
createNewFile();
}),
Button("Open", () => {
openFile();
}),
Divider(),
Button("Save", () => {
saveFile();
}),
Button("Save As...", () => {
saveAsFile();
}),
Divider(),
Button("Print", () => {
printFile();
})
])
Menu with destructive action
Copy
Menu({ label: Text("Actions") }, [
Button("Edit", () => {
editPost();
}),
Button("Share", () => {
sharePost();
}),
Divider(),
Button("Delete", () => {
deletePost();
})
])
Menu with submenu
Copy
Menu({ label: Text("Format") }, [
Button("Bold", () => {
toggleBold();
}),
Button("Italic", () => {
toggleItalic();
}),
Divider(),
Menu({ label: Text("Text Size") }, [
Button("Small", () => {
setTextSize("small");
}),
Button("Medium", () => {
setTextSize("medium");
}),
Button("Large", () => {
setTextSize("large");
})
])
])
Menu in toolbar
Copy
VStack([
Text("Document content")
]).toolbar(
ToolbarItem({ placement: "navigationBarTrailing" }, [
Menu({ label: Text("More") }, [
Button("Export", () => {
exportDocument();
}),
Button("Print", () => {
printDocument();
}),
Divider(),
Button("Settings", () => {
showSettings();
})
])
])
)
Menu with icons
Copy
Menu({
label: Image({ systemName: "gear" })
}, [
Button({
label: HStack([
Image({ systemName: "person" }),
Text("Profile")
]),
action: () => {
showProfile();
}
}),
Button({
label: HStack([
Image({ systemName: "bell" }),
Text("Notifications")
]),
action: () => {
showNotifications();
}
}),
Divider(),
Button({
label: HStack([
Image({ systemName: "arrow.right.square" }),
Text("Sign Out")
]),
action: () => {
signOut();
}
})
])
Dynamic menu based on state
Copy
Menu({ label: Text("Status") }, [
isOnline
? Button("Go Offline", () => {
goOffline();
})
: Button("Go Online", () => {
goOnline();
}),
Divider(),
Button("Refresh", () => {
refresh();
})
])
Selection menu
Copy
Menu({ label: Text("Sort By") }, [
Button("Name", () => {
sortBy("name");
})
.foregroundStyle(currentSort === "name" ? Color("blue") : Color("primary")),
Button("Date", () => {
sortBy("date");
})
.foregroundStyle(currentSort === "date" ? Color("blue") : Color("primary")),
Button("Size", () => {
sortBy("size");
})
.foregroundStyle(currentSort === "size" ? Color("blue") : Color("primary"))
])
Menu in list row
Copy
List([
ForEach(items, (item) =>
HStack([
Text(item.title),
Spacer(),
Menu({ label: Text("⋯") }, [
Button("Edit", () => {
editItem(item);
}),
Button("Duplicate", () => {
duplicateItem(item);
}),
Divider(),
Button("Delete", () => {
deleteItem(item);
})
])
])
)
])
