Skip to content
Block Kit for React
Esc
↑↓navigate↵open⌘Jpreview
On this page

Actions

A row of interactive elements, buttons, selects, date pickers, and more.

actions lays out a row of interactive elements: buttons, select menus, checkboxes, radio buttons, date and time pickers, and overflow menus. Reach for it whenever you need controls that aren’t tied to a specific piece of text, the way a section accessory is.

Your AppAPP
onActionInteract with the preview.

Fields

PropType
typestring

Always `actions`.

Typestring
elementsActionsBlockElement[]

The row's elements, in order. Slack allows up to 25.

TypeActionsBlockElement[]
block_id?string

A unique identifier for this block. Auto-generated if omitted. Maximum length is 255 characters.

Typestring

elements accepts buttons, all five select menu types, checkboxes, radio buttons, a date picker, a time picker, a combined date-time picker, an overflow menu, a workflow button, and a rich text input. Checkboxes, radio buttons, and the date-time picker each take their own full-width row instead of sitting side by side with the others, matching Slack’s own layout.

Examples

Buttons

Your AppAPP
onActionInteract with the preview.

Select menus

Static, users, and conversations selects side by side. See select menus for the other types, including multi-select and external selects.

Your AppAPP
onActionInteract with the preview.

Checkboxes and radio buttons

Both take their own full-width row:

Your AppAPP
onActionInteract with the preview.

Date and time pickers

Your AppAPP
onActionInteract with the preview.

Interactivity

Your AppAPP
onActionInteract with the preview.

Each element type dispatches a different shape of onAction payload, all sharing type, action_id, block_id, and action_ts:

  • button: value (if set), plus url and style when present.
  • static_select / external_select: selected_option: { text, value }.
  • multi_static_select / multi_external_select: selected_options: [...].
  • users_select: selected_user: "U0ADA"; multi_users_select: selected_users: [...].
  • conversations_select: selected_conversation: "C0GENERAL"; multi_conversations_select: selected_conversations: [...].
  • channels_select: selected_channel: "C0GENERAL"; multi_channels_select: selected_channels: [...].
  • checkboxes: selected_options: [...] (every checked option, not just the one clicked).
  • radio_buttons: selected_option: { text, value }.
  • datepicker: selected_date: "1990-04-28" (or null when cleared).
  • timepicker: selected_time: "13:37".
  • overflow: selected_option: { text, value, url? }, and opens url in a new tab if set.
  • workflow_button: text, workflow, and style (if set).

For example, picking an option from the static select above dispatches:

{
  "type": "static_select",
  "action_id": "actionId-2",
  "block_id": "b1",
  "action_ts": "1706000000.000100",
  "selected_option": {
    "text": { "type": "plain_text", "text": "Apple", "emoji": true },
    "value": "apple"
  }
}

Selects, checkboxes, radio buttons, and pickers also write their value to state.values[block_id][action_id], so a later action (like a modal submit) can read every element’s current value; buttons, overflow, and workflow buttons don’t, since they’re one-shot actions.

Was this page helpful?