Action Row
type: 1
Messages
Preview payload.json
The Action Row is a horizontal row of interactive components. It can hold:
- 1 to 5 buttons, or
- a single select menu.
{ "flags": 32768, "components": [ { "type": 10, "content": "What would you like to do?" }, { "type": 1, "components": [ { "type": 2, "style": 1, "label": "Accept", "custom_id": "accept" }, { "type": 2, "style": 2, "label": "Later", "custom_id": "later" }, { "type": 2, "style": 4, "label": "Decline", "custom_id": "decline" } ] }, { "type": 1, "components": [ { "type": 3, "custom_id": "language", "placeholder": "Pick your language", "options": [ { "label": "Español", "value": "es", "emoji": { "name": "🇪🇸" } }, { "label": "English", "value": "en", "emoji": { "name": "🇬🇧" } } ] } ] } ]}Fields
Section titled “Fields”| Field | Type | Description |
|---|---|---|
type |
integer | required Always 1. |
id |
integer | optional Unique identifier in the message. |
components |
array | required Up to 5 Buttons or 1 select menu. |
Use the JSON above as the message body.
import { ActionRowBuilder, ButtonBuilder, ButtonStyle, StringSelectMenuBuilder, TextDisplayBuilder, MessageFlags,} from 'discord.js';
const buttons = new ActionRowBuilder().addComponents( new ButtonBuilder().setCustomId('accept').setLabel('Accept').setStyle(ButtonStyle.Primary), new ButtonBuilder().setCustomId('later').setLabel('Later').setStyle(ButtonStyle.Secondary), new ButtonBuilder().setCustomId('decline').setLabel('Decline').setStyle(ButtonStyle.Danger),);
const menu = new ActionRowBuilder().addComponents( new StringSelectMenuBuilder() .setCustomId('language') .setPlaceholder('Pick your language') .addOptions( { label: 'Español', value: 'es', emoji: { name: '🇪🇸' } }, { label: 'English', value: 'en', emoji: { name: '🇬🇧' } }, ),);
await channel.send({ flags: MessageFlags.IsComponentsV2, components: [new TextDisplayBuilder().setContent('What would you like to do?'), buttons, menu],});buttons = discord.ui.ActionRow( discord.ui.Button(label="Accept", style=discord.ButtonStyle.primary, custom_id="accept"), discord.ui.Button(label="Later", style=discord.ButtonStyle.secondary, custom_id="later"), discord.ui.Button(label="Decline", style=discord.ButtonStyle.danger, custom_id="decline"),)
menu = discord.ui.ActionRow( discord.ui.Select( custom_id="language", placeholder="Pick your language", options=[ discord.SelectOption(label="Español", value="es", emoji="🇪🇸"), discord.SelectOption(label="English", value="en", emoji="🇬🇧"), ], ))
view = discord.ui.LayoutView()view.add_item(discord.ui.TextDisplay("What would you like to do?"))view.add_item(buttons)view.add_item(menu)await channel.send(view=view)buttons := discordgo.ActionsRow{Components: []discordgo.MessageComponent{ discordgo.Button{Label: "Accept", Style: discordgo.PrimaryButton, CustomID: "accept"}, discordgo.Button{Label: "Later", Style: discordgo.SecondaryButton, CustomID: "later"}, discordgo.Button{Label: "Decline", Style: discordgo.DangerButton, CustomID: "decline"},}}
menu := discordgo.ActionsRow{Components: []discordgo.MessageComponent{ discordgo.SelectMenu{ MenuType: discordgo.StringSelectMenu, CustomID: "language", Placeholder: "Pick your language", Options: []discordgo.SelectMenuOption{ {Label: "Español", Value: "es", Emoji: &discordgo.ComponentEmoji{Name: "🇪🇸"}}, {Label: "English", Value: "en", Emoji: &discordgo.ComponentEmoji{Name: "🇬🇧"}}, }, },}}
s.ChannelMessageSendComplex(channelID, &discordgo.MessageSend{ Flags: discordgo.MessageFlagsIsComponentsV2, Components: []discordgo.MessageComponent{ discordgo.TextDisplay{Content: "What would you like to do?"}, buttons, menu, },})- Put the most important button first and use only one
Primarybutton per row. - If you need more than 5 buttons, use several rows or consider a select menu.
- In V2, rows can go inside a Container, not just at the bottom of the message.