Showing
3 changed files
with
43 additions
and
14 deletions
| 1 | <!-- | 1 | <!-- |
| 2 | * @Date: 2022-08-30 14:32:11 | 2 | * @Date: 2022-08-30 14:32:11 |
| 3 | * @LastEditors: hookehuyr hookehuyr@gmail.com | 3 | * @LastEditors: hookehuyr hookehuyr@gmail.com |
| 4 | - * @LastEditTime: 2022-08-30 14:46:53 | 4 | + * @LastEditTime: 2022-08-30 17:56:04 |
| 5 | * @FilePath: /data-table/src/components/AreaPickerField/index.vue | 5 | * @FilePath: /data-table/src/components/AreaPickerField/index.vue |
| 6 | * @Description: 文件描述 | 6 | * @Description: 文件描述 |
| 7 | --> | 7 | --> |
| 8 | <template> | 8 | <template> |
| 9 | <div class="area-picker-field"> | 9 | <div class="area-picker-field"> |
| 10 | - <van-area v-model="value" title="" :area-list="areaList" /> | 10 | + <div class="label">{{ item.label }}<span v-if="item.required"> *</span></div> |
| 11 | + <van-field v-model="item.value" is-link readonly :name="item.key" :required="item.required" | ||
| 12 | + :placeholder="item.placeholder" :rules="item.rules" @click="showPicker = true" /> | ||
| 13 | + <van-popup v-model:show="showPicker" position="bottom"> | ||
| 14 | + <van-area v-model="item.code" title="" :area-list="areaList" @confirm="onConfirm" @cancel="showPicker = false" /> | ||
| 15 | + </van-popup> | ||
| 11 | </div> | 16 | </div> |
| 12 | </template> | 17 | </template> |
| 13 | 18 | ||
| 14 | <script setup> | 19 | <script setup> |
| 15 | import { areaList } from '@vant/area-data'; | 20 | import { areaList } from '@vant/area-data'; |
| 16 | -const value = ref('330302'); | 21 | + |
| 22 | +const props = defineProps({ | ||
| 23 | + item: Object | ||
| 24 | +}) | ||
| 25 | + | ||
| 26 | +const showPicker = ref(false); | ||
| 27 | +const fieldValue = ref(''); | ||
| 28 | + | ||
| 29 | +const onConfirm = ({ selectedOptions }) => { | ||
| 30 | + props.item.value = selectedOptions.map((option) => option.text).join('/'); | ||
| 31 | + props.item.city_code = selectedOptions[2]?.value; | ||
| 32 | + showPicker.value = false; | ||
| 33 | +}; | ||
| 17 | </script> | 34 | </script> |
| 18 | 35 | ||
| 19 | <style lang="less" scoped> | 36 | <style lang="less" scoped> |
| 20 | .area-picker-field { | 37 | .area-picker-field { |
| 38 | + .label { | ||
| 39 | + padding: 1rem 1rem 0 1rem; | ||
| 40 | + font-size: 0.9rem; | ||
| 41 | + font-weight: bold; | ||
| 21 | 42 | ||
| 43 | + span { | ||
| 44 | + color: red; | ||
| 45 | + } | ||
| 46 | + } | ||
| 22 | } | 47 | } |
| 23 | </style> | 48 | </style> | ... | ... |
| ... | @@ -29,13 +29,13 @@ export function createComponentType(data) { | ... | @@ -29,13 +29,13 @@ export function createComponentType(data) { |
| 29 | item.name = item.key; | 29 | item.name = item.key; |
| 30 | item.component = TextField; | 30 | item.component = TextField; |
| 31 | } | 31 | } |
| 32 | - // if (item.component_type === 'textarea') { | 32 | + if (item.component_type === 'textarea') { |
| 33 | - // item.type = 'textarea'; | 33 | + item.type = 'textarea'; |
| 34 | - // item.name = item.key; | 34 | + item.name = item.key; |
| 35 | - // item.rows = 2; | 35 | + item.rows = 2; |
| 36 | - // item.autosize = true; | 36 | + item.autosize = true; |
| 37 | - // item.component = TextareaField; | 37 | + item.component = TextareaField; |
| 38 | - // } | 38 | + } |
| 39 | if (item.component_type === 'number') { | 39 | if (item.component_type === 'number') { |
| 40 | item.type = 'number'; | 40 | item.type = 'number'; |
| 41 | item.name = item.key; | 41 | item.name = item.key; | ... | ... |
| 1 | <!-- | 1 | <!-- |
| 2 | * @Date: 2022-07-18 10:22:22 | 2 | * @Date: 2022-07-18 10:22:22 |
| 3 | * @LastEditors: hookehuyr hookehuyr@gmail.com | 3 | * @LastEditors: hookehuyr hookehuyr@gmail.com |
| 4 | - * @LastEditTime: 2022-08-30 14:35:02 | 4 | + * @LastEditTime: 2022-08-30 17:55:45 |
| 5 | * @FilePath: /data-table/src/views/index.vue | 5 | * @FilePath: /data-table/src/views/index.vue |
| 6 | * @Description: 首页 | 6 | * @Description: 首页 |
| 7 | --> | 7 | --> |
| ... | @@ -30,7 +30,7 @@ const mockData = ref([]); | ... | @@ -30,7 +30,7 @@ const mockData = ref([]); |
| 30 | onMounted(() => { | 30 | onMounted(() => { |
| 31 | mockData.value = [{ | 31 | mockData.value = [{ |
| 32 | key: 'username', | 32 | key: 'username', |
| 33 | - value: 'Hooke', | 33 | + value: '', |
| 34 | label: '用户名', | 34 | label: '用户名', |
| 35 | placeholder: '请输入用户名', | 35 | placeholder: '请输入用户名', |
| 36 | component: '', | 36 | component: '', |
| ... | @@ -46,7 +46,7 @@ onMounted(() => { | ... | @@ -46,7 +46,7 @@ onMounted(() => { |
| 46 | required: false, | 46 | required: false, |
| 47 | }, { | 47 | }, { |
| 48 | key: 'gender', | 48 | key: 'gender', |
| 49 | - value: 'female', | 49 | + value: '', |
| 50 | label: '性别', | 50 | label: '性别', |
| 51 | placeholder: '', | 51 | placeholder: '', |
| 52 | component: '', | 52 | component: '', |
| ... | @@ -94,7 +94,10 @@ onMounted(() => { | ... | @@ -94,7 +94,10 @@ onMounted(() => { |
| 94 | required: true, | 94 | required: true, |
| 95 | }, { | 95 | }, { |
| 96 | key: 'city', | 96 | key: 'city', |
| 97 | - value: '', | 97 | + value: '天津市/天津市/和平区', |
| 98 | + city_code: '120101', | ||
| 99 | + label: '省市区', | ||
| 100 | + placeholder: '请选择省市区', | ||
| 98 | component_type: 'area_picker' | 101 | component_type: 'area_picker' |
| 99 | }]; | 102 | }]; |
| 100 | // 生成自定义组件 | 103 | // 生成自定义组件 |
| ... | @@ -103,6 +106,7 @@ onMounted(() => { | ... | @@ -103,6 +106,7 @@ onMounted(() => { |
| 103 | 106 | ||
| 104 | const onSubmit = (values) => { | 107 | const onSubmit = (values) => { |
| 105 | console.log('submit', values); | 108 | console.log('submit', values); |
| 109 | + // console.warn(mockData.value); | ||
| 106 | }; | 110 | }; |
| 107 | 111 | ||
| 108 | </script> | 112 | </script> | ... | ... |
-
Please register or login to post a comment