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
placeholderwhen merchants should make a deliberate choice. Don't leave the initial state ambiguous. - Explain validation problems. When a selection is required or invalid, use
errorto 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
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
| Prop | Type | Description |
|---|---|---|
details | any | Additional 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. |
disabled | boolean | Disables the field, disallowing any interaction. |
error | any | Indicate 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. |
id | string | A unique identifier for the element. |
label | any | Content 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. |
name | string | An identifier for the field that is unique within the nearest containing form. |
placeholder | string | A short hint that describes the expected value of the field. |
required | boolean | Whether 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. |
value | string |
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
| Event | Type |
|---|---|
blur | FocusEvent |
change | Event |
focus | FocusEvent |
input | Event |
Listen for these with @blur-style listeners on <SSelect>.
Slots
| Slot | Description |
|---|---|
default | The 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 |