Skip to content

Commit

Permalink
增加 VanFieldPicker 组件
Browse files Browse the repository at this point in the history
  • Loading branch information
hooray committed Jul 31, 2024
1 parent 445ff75 commit 30e7bc9
Show file tree
Hide file tree
Showing 5 changed files with 73 additions and 0 deletions.
41 changes: 41 additions & 0 deletions src/components/VanFieldPicker/index.vue
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
<script setup lang="ts">
import type { FieldProps, PickerOption, PickerProps, PopupProps } from 'vant'
defineOptions({
name: 'VanFieldPicker',
})
const props = defineProps<{
label?: FieldProps['label']
name?: FieldProps['name']
id?: FieldProps['id']
size?: FieldProps['size']
placeholder?: FieldProps['placeholder']
border?: FieldProps['border']
colon?: FieldProps['colon']
required?: FieldProps['required']
center?: FieldProps['center']
arrowDirection?: FieldProps['arrowDirection']
labelClass?: FieldProps['labelClass']
labelWidth?: FieldProps['labelWidth']
labelAlign?: FieldProps['labelAlign']
leftIcon?: FieldProps['leftIcon']
rightIcon?: FieldProps['rightIcon']
rules?: FieldProps['rules']
round?: PopupProps['round']
columns?: PickerOption[]
}>()
const value = defineModel<string | number>()
const valuePicker = ref<any>([value.value])
const valueStr = computed(() => props.columns?.find((item: any) => item.value === value.value)?.text)
const showPicker = ref(false)
</script>

<template>
<van-field :id :model-value="valueStr" :label :name :size :placeholder :border :colon :required :center :arrow-direction :label-class :label-width :label-align :left-icon :right-icon :rules is-link readonly @click="showPicker = true" />
<van-popup v-model:show="showPicker" :round position="bottom" teleport="body">
<van-picker :model-value="valuePicker" :columns @confirm="({ selectedOptions }) => { value = selectedOptions[0]?.value; showPicker = false }" @cancel="showPicker = false" />
</van-popup>
</template>
1 change: 1 addition & 0 deletions src/types/components.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,5 +24,6 @@ declare module 'vue' {
RouterView: typeof import('vue-router')['RouterView']
SvgIcon: typeof import('./../components/SvgIcon/index.vue')['default']
Trend: typeof import('./../components/Trend/index.vue')['default']
VanFieldPicker: typeof import('./../components/VanFieldPicker/index.vue')['default']
}
}
1 change: 1 addition & 0 deletions src/types/typed-router.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ declare module 'vue-router/auto-routes' {
'/feature/': RouteRecordInfo<'/feature/', '/feature', Record<never, never>, Record<never, never>>,
'/feature/component/basic': RouteRecordInfo<'/feature/component/basic', '/feature/component/basic', Record<never, never>, Record<never, never>>,
'/feature/component/built-in': RouteRecordInfo<'/feature/component/built-in', '/feature/component/built-in', Record<never, never>, Record<never, never>>,
'/feature/component/composite': RouteRecordInfo<'/feature/component/composite', '/feature/component/composite', Record<never, never>, Record<never, never>>,
'/feature/component/pagemain-demo': RouteRecordInfo<'/feature/component/pagemain-demo', '/feature/component/pagemain-demo', Record<never, never>, Record<never, never>>,
'/feature/component/trend-demo': RouteRecordInfo<'/feature/component/trend-demo', '/feature/component/trend-demo', Record<never, never>, Record<never, never>>,
'/feature/function/icon': RouteRecordInfo<'/feature/function/icon', '/feature/function/icon', Record<never, never>, Record<never, never>>,
Expand Down
29 changes: 29 additions & 0 deletions src/views/feature/component/composite.vue
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
<script setup lang="ts">
definePage({
meta: {
title: '复合组件',
},
})
const fieldPickerValue = ref('')
const fieldPickerColumns = ref([
{ text: '杭州', value: 'Hangzhou' },
{ text: '宁波', value: 'Ningbo' },
{ text: '温州', value: 'Wenzhou' },
{ text: '绍兴', value: 'Shaoxing' },
{ text: '湖州', value: 'Huzhou' },
])
</script>

<template>
<PageLayout navbar navbar-start-side="back">
<PageMain>
Vant 提供的组件大多数比较原子化,在实际业务开发中,往往一个功能需要通过多个组件结合使用才能实现。本框架则将一些常用的功能封装成复合组件,方便开发者使用。
</PageMain>
<PageMain title="VanFieldPicker">
<van-field-picker v-model="fieldPickerValue" placeholder="请选择" :border="false" :columns="fieldPickerColumns" />
<van-divider />
选中值: {{ fieldPickerValue }}
</PageMain>
</PageLayout>
</template>
1 change: 1 addition & 0 deletions src/views/feature/index.vue
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,7 @@ const data: {
icon: 'i-bx:bxs-component',
routes: [
{ path: '/feature/component/basic', title: '基础组件' },
{ path: '/feature/component/composite', title: '复合组件' },
],
},
{
Expand Down

0 comments on commit 30e7bc9

Please sign in to comment.