shop-wx/doc/wot-design-uni/docs/en-US/component/picker.md

14 KiB

Picker Selector

The Picker component is a combination of popup and pickerView.

Basic Usage

Set the columns property to configure the option data source. Options can be strings or objects. If they are objects, the label property is used by default for rendering the option content. The label property sets the left-side text content, and v-model sets the selected value. The label can be omitted. The title width can be set via label-width, which defaults to '33%'. Listen to the confirm event to get the selected value, which returns an event object: event = { value, selectedItems }. value is the bound value, and selectedItems is the selected option object(s).

<wd-picker :columns="columns" label="Single Column" v-model="value" @confirm="handleConfirm" />
const columns = ref(['Option 1', 'Option 2', 'Option 3', 'Option 4', 'Option 5', 'Option 6', 'Option 7'])
const value = ref('Option 1')

function handleConfirm({ value }) {
  value.value = value
}

When columns options are objects, their data structure is as follows:

Parameter Type Description Minimum Version
value string / number / boolean Option value. If the value property is missing, label is used as the value. -
label string Option text content -
disabled boolean Whether the option is disabled -

Disabled

Set the disabled property.

<wd-picker :columns="columns" label="Disabled" v-model="value" disabled />
const value = ref('Option 3')

const columns = ref(['Option 1', 'Option 2', 'Option 3', 'Option 4', 'Option 5', 'Option 6', 'Option 7'])

Readonly

Set the readonly property.

<wd-picker :columns="columns" label="Readonly" v-model="value" readonly />

Clear Button

Set the clearable property.

<wd-picker :columns="columns" label="Clear" v-model="value" clearable />

Title

Set the title property.

<wd-picker label="Title" :columns="columns" title="Picker Title"/>

Loading

Set the loading property.

<wd-picker-view :columns="columns" loading />

Multiple Columns

Set the columns property as a two-dimensional array, and value as an array.

<wd-picker :columns="columns" label="Multiple Columns" v-model="value" />
const value = ref(['Central South University', 'Software Engineering'])

const columns = ref([
  ['Sun Yat-sen University', 'Central South University', 'South China University of Technology'],
  ['Computer Science', 'Software Engineering', 'Communication Engineering', 'Law', 'Economics']
])

Cascading

Pass the column-change property, which is a function that receives the pickerView instance, selected item, current column index, and resolve as parameters. Based on the selected item and column index, modify the data source of other columns using the setColumnData method exposed by the pickerView instance. After modification, call resolve() to notify the component that the modification is complete. If column-change contains asynchronous operations, the component will execute them in order.

resolve() must be called after each modification.

<wd-picker
  :columns="columns"
  label="Cascading"
  v-model="value"
  :column-change="onChangeDistrict"
  :display-format="displayFormat"
 />
const district = {
  '0': [{ label: 'Beijing', value: '110000' }, { label: 'Guangdong', value: '440000' }],
  '110000': [{ label: 'Beijing', value: '110100' }],
  '440000': [{ label: 'Guangzhou', value: '440100' }, { label: 'Shaoguan', value: '440200' }, { label: 'Shenzhen', value: '440300' }, { label: 'Zhuhai', value: '440400' }, { label: 'Shantou', value: '440500' }],
  '110100': [{ label: 'Dongcheng District', value: '110101' }, { label: 'Xicheng District', value: '110102' }, { label: 'Chaoyang District', value: '110105' }, { label: 'Fengtai District', value: '110106' }, { label: 'Shijingshan District', value: '110107' }],
  '440100': [{ label: 'Liwan District', value: '440103' }, { label: 'Yuexiu District', value: '440104' }, { label: 'Haizhu District', value: '440105'}],
  '440200': [{ label: 'Wujiang District', value: '440203'}],
  '440300': [{ label: 'Luohu District', value: '440303' }, { label: 'Futian District', value: '440304' }],
  '440400': [{ label: 'Xiangzhou District', value: '440402' }, { label: 'Doumen District', value: '440403' }, { label: 'Jinwan District', value: '440404' }],
  '440500': [{ label: 'Longhu District', value: '440507' }, { label: 'Jinping District', value: '440511' }]
}

const value = ref(['110000', '110100', '110102'])

const columns = ref([district[0], district[district[0][0].value], district[district[district[0][0].value][0].value]])

const onChangeDistrict = (pickerView, value, columnIndex, resolve) => {
  const item = value[columnIndex]
  if (columnIndex === 0) {
    pickerView.setColumnData(1, district[item.value])
    pickerView.setColumnData(2, district[district[item.value][0].value])
  } else if (columnIndex === 1) {
    pickerView.setColumnData(2, district[item.value])
  }
  resolve()
}

const displayFormat = (items) => {
  return items
    .map((item) => {
      return item.label
    })
    .join('-')
}

Picker Size

Modify the picker size by setting size. When size is set to 'large', the font size becomes 16px.

<wd-picker label="Single Column" size="large" v-model="value" :columns="columns" />

Required

Set the required property to display the required style.

<wd-picker label="Required" error :columns="columns" v-model="value" required/>

Error State

Set the error property to display the picker value in red.

<wd-picker label="Single Column" error :columns="columns" v-model="value"/>

Right-Aligned Value

Set the align-right property to right-align the picker value.

<wd-picker label="Single Column" align-right :columns="columns" v-model="value"/>

Pre-Confirmation Validation

Set the before-confirm function. When the user clicks the "Confirm" button, the before-confirm function is executed, receiving value, resolve, and picker parameters. You can validate value and notify the component whether the validation passes via resolve. resolve accepts a boolean value: resolve(true) indicates validation passes, while resolve(false) indicates validation fails (the picker popup will not close). Properties like loading and columns can be directly set via the picker parameter.

<wd-toast />

<wd-picker label="Before Confirm" :columns="columns" v-model="value" :before-confirm="beforeConfirm" @confirm="handleConfirm" />
import { useToast } from '@/uni_modules/wot-design-uni'

const toast = useToast()

const beforeConfirm = (value, resolve, picker) => {
  picker.setLoading(true)
  setTimeout(() => {
    picker.setLoading(false)
    if (['Option 2', 'Option 3'].indexOf(value) > -1) {
      resolve(false)
      toast.error('Validation failed. Please reselect.')
    } else {
      resolve(true)
    }
  }, 2000)
}

const columns = ref(['Option 1', 'Option 2', 'Option 3', 'Option 4', 'Option 5', 'Option 6', 'Option 7'])
const value = ref('')

const beforeConfirm = (value, resolve, picker) => {
  picker.setLoading(true)
  setTimeout(() => {
    picker.setLoading(false)
    if (['Option 2', 'Option 3'].indexOf(value) > -1) {
      resolve(false)
      toast.error('Validation failed. Please reselect.')
    } else {
      resolve(true)
    }
  }, 2000)
}

function handleConfirm({ value }) {
  value.value = value
}

Trigger Slot

Enable use-default-slot and use the default slot to customize the picker trigger component.

<wd-picker :columns="columns" v-model="value" use-default-slot>
  <wd-button>Slot Trigger</wd-button>
</wd-picker>

Attributes

Parameter Description Type Options Default Minimum Version
v-model Selected value. For multi-column pickers, this should be an array. string/number/boolean/array - - -
columns Picker data. Can be an array of strings or objects. If a 2D array, it becomes a multi-column picker. array - - -
loading Loading state boolean - false -
loading-color Loading color (hexadecimal format, no shorthand). string - #4D80F0 -
columns-height Internal picker roller height number - 231 -
value-key Key for the value property in option objects string - value -
label-key Key for the label property in option objects string - label -
title Popup title string - - -
cancel-button-text Cancel button text string - Cancel -
confirm-button-text Confirm button text string - Confirm -
label Left-side text label string - - -
placeholder Placeholder text string - Select -
disabled Disabled state boolean - false -
readonly Readonly state boolean - false -
display-format Custom display text formatting function (returns a string) function - - -
column-change Function to handle column changes (receives pickerView instance, selected item, column index, and resolve) function - - -
size Picker size string large - -
label-width Left-side label width string - 33% -
error Error state (displays value in red) boolean - false -
required Required field style boolean - false -
marker-side Position of the required marker 'before' | 'after' - 'before' 1.12.0
align-right Right-align the picker value boolean - false -
use-label-slot Use label slot boolean - false -
use-default-slot Use default slot boolean - false -
before-confirm Pre-confirmation validation function (receives value, resolve, picker) function - - -
close-on-click-modal Close popup when clicking the mask boolean - true -
z-index Popup z-index number - 15 -
safe-area-inset-bottom Enable bottom safe area for iPhone X-type devices boolean - true -
ellipsis Enable text overflow ellipsis boolean - false -
prop Form model field name (required for form validation) string - - -
rules Form validation rules (used with wd-form) FormItemRule [] - [] -
immediate-change Trigger picker-view change event immediately on touch release (supported in WeChat Mini Program and Alipay Mini Program from v1.2.25) boolean - false 1.2.25
clearable Show clear button boolean - false 1.11.0
root-portal Detach from page to resolve fixed positioning issues boolean - false 1.11.0

FormItemRule Structure

Key Description Type
required Whether the field is required boolean
message Error message text string
validator Custom validation function (can return a Promise for async validation) (value, rule) => boolean | Promise
pattern Validate using a regular expression (fails if no match) RegExp

Events

Event Name Description Parameters Minimum Version
confirm Triggered on confirm button click { value, selectedItems }, where value is the selected value (array for multi-column), and selectedItems is the selected option(s) -
cancel Triggered on cancel button click - -
open Triggered when picker popup opens - -
clear Triggered on clear button click - 1.11.0

Methods

Method Name Description Parameters Minimum Version
open Open picker popup - -
close Close picker popup - -

Slots

Name Description Minimum Version
default Default slot content -
label Left-side label slot -

External Classes

Class Name Description Minimum Version
custom-class Root node styles -
custom-view-class Custom styles for pickerView -
custom-label-class Custom styles for label -
custom-value-class Custom styles for value -