Skip to content

SSelect <s-select> ​

A dropdown for choosing one option from a list. SSelect is the typed Vue 3 wrapper for Shopify's Polaris <s-select> web component.

ts
import { SSelect } from 'polaris-vue-elements'

Best practices ​

  • Use it for a known set of choices. A select works when merchants pick from a predefined list. When merchants need to enter a custom value or hunt through a long list, a text field that suggests matches as they type, or a dropdown they can search, is a better fit.
  • Order options deliberately. Group related options, put the most common ones first, or sort alphabetically when there's no natural order, so merchants find their choice quickly.
  • Write labels that are easy to scan. Give each option enough context that merchants can tell options apart without opening and reading through several of them.
  • Choose the starting state on purpose. Preselect an option when there's an obvious default, and use a placeholder when merchants should make a deliberate choice. Don't leave the initial state ambiguous.
  • Explain validation problems. When a selection is required or invalid, use error to tell merchants specifically what to do, since tailored messages help them finish forms faster than generic ones.
vue
<SSelect label="Shipping speed" placeholder="Choose a shipping speed" required>
  <SOption value="standard">Standard (5–7 business days)</SOption>
  <SOption value="express">Express (2–3 business days)</SOption>
  <SOption value="overnight">Overnight (next business day)</SOption>
</SSelect>

See Shopify's best practices for <s-select> for the full guidance.

Example ​

United StatesCanadaFranceGermany

Value: (none)

vue
<script setup>
import { ref } from 'vue'
import { SSelect, SOption, SOptionGroup } from 'polaris-vue-elements'

const value = ref('')
</script>

<template>
  <SSelect label="Shipping region" placeholder="Select a region" v-model="value">
    <SOptionGroup label="North America">
      <SOption value="us">United States</SOption>
      <SOption value="ca">Canada</SOption>
    </SOptionGroup>
    <SOptionGroup label="Europe">
      <SOption value="fr">France</SOption>
      <SOption value="de">Germany</SOption>
    </SOptionGroup>
  </SSelect>
  <p>Value: {{ value }}</p>
</template>

v-model ​

v-model on <SSelect> binds to the value property and listens for the change DOM event.

template
<SSelect v-model="value" />

is equivalent to:

template
<SSelect :value="value" @change="value = $event.target.value" />

Props ​

PropTypeDescription
detailsanyAdditional text to provide context or guidance for the field. This text is displayed along with the field and its label to offer more information or instructions to the user. This will also be exposed to screen reader users.
disabledbooleanDisables the field, disallowing any interaction.
erroranyIndicate an error to the user. The field will be given a specific stylistic treatment to communicate problems that have to be resolved immediately.
icon"color" | "info" | "adjust" | "affiliate" | "airplane" | "alert-bubble" | "alert-circle" | "alert-diamond" … (553 more)The type of icon to be displayed in the field.
idstringA unique identifier for the element.
labelanyContent to use as the field label.
labelAccessibilityVisibility"visible" | "exclusive"Changes the visibility of the component's label. - visible: the label is visible to all users. - exclusive: the label is visually hidden but remains in the accessibility tree.
namestringAn identifier for the field that is unique within the nearest containing form.
placeholderstringA short hint that describes the expected value of the field.
requiredbooleanWhether the field needs a value. This requirement adds semantic value to the field, but it will not cause an error to appear automatically. If you want to present an error when this field is empty, you can do so with the error property.
valuestring

Some type columns above are truncated for readability; the full union is available in the library's generated TypeScript types (src/lib/generated/types.ts).

Events ​

EventType
blurFocusEvent
changeEvent
focusFocusEvent
inputEvent

Listen for these with @blur-style listeners on <SSelect>.

Slots ​

SlotDescription
defaultThe selectable options displayed in the dropdown list. Accepts option components for individual selectable items, and option group components to organize related options into logical groups with labels.
details
error

Released under the MIT License. Vue logo by Evan You, CC BY-NC-SA 4.0.