hookehuyr

✨ feat: 新增单列选择器组件

1 +<!--
2 + * @Date: 2022-08-30 13:46:51
3 + * @LastEditors: hookehuyr hookehuyr@gmail.com
4 + * @LastEditTime: 2022-08-30 14:23:32
5 + * @FilePath: /data-table/src/components/PickerField/index.vue
6 + * @Description: 单列选择器组件
7 +-->
8 +<template>
9 + <div class="picker-field-page">
10 + <div class="label">{{ item.label }}<span v-if="item.required">&nbsp;*</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-picker :columns="item.options" @confirm="onConfirm" @cancel="showPicker = false" />
15 + </van-popup>
16 + </div>
17 +</template>
18 +
19 +<script setup>
20 +const props = defineProps({
21 + item: Object
22 +})
23 +const selectedValues = ref('');
24 +const showPicker = ref(false);
25 +
26 +const onConfirm = ({ selectedOptions }) => {
27 + props.item.value = selectedOptions[0]?.value;
28 + showPicker.value = false;
29 +};
30 +
31 +</script>
32 +
33 +<style lang="less" scoped>
34 +.picker-field-page {
35 + .label {
36 + padding: 1rem 1rem 0 1rem;
37 + font-size: 0.9rem;
38 + font-weight: bold;
39 +
40 + span {
41 + color: red;
42 + }
43 + }
44 +}
45 +</style>
...@@ -4,6 +4,7 @@ import TextField from '@/components/TextField/index.vue' ...@@ -4,6 +4,7 @@ import TextField from '@/components/TextField/index.vue'
4 import TextareaField from '@/components/TextareaField/index.vue' 4 import TextareaField from '@/components/TextareaField/index.vue'
5 import RadioField from '@/components/RadioField/index.vue' 5 import RadioField from '@/components/RadioField/index.vue'
6 import CheckboxField from '@/components/CheckboxField/index.vue' 6 import CheckboxField from '@/components/CheckboxField/index.vue'
7 +import PickerField from '@/components/PickerField/index.vue'
7 8
8 /** 9 /**
9 * 生成自定义组件类型 10 * 生成自定义组件类型
...@@ -12,6 +13,7 @@ import CheckboxField from '@/components/CheckboxField/index.vue' ...@@ -12,6 +13,7 @@ import CheckboxField from '@/components/CheckboxField/index.vue'
12 * @type textarea 多行文本 TextareaField 13 * @type textarea 多行文本 TextareaField
13 * @type radio 单选框 RadioField 14 * @type radio 单选框 RadioField
14 * @type checkbox 多选框 CheckboxField 15 * @type checkbox 多选框 CheckboxField
16 + * @type picker 单列选择器 PickerField
15 */ 17 */
16 export function createComponentType(data) { 18 export function createComponentType(data) {
17 // 判断类型和使用组件 19 // 判断类型和使用组件
...@@ -25,13 +27,13 @@ export function createComponentType(data) { ...@@ -25,13 +27,13 @@ export function createComponentType(data) {
25 item.name = item.key; 27 item.name = item.key;
26 item.component = TextField; 28 item.component = TextField;
27 } 29 }
28 - if (item.component_type === 'textarea') { 30 + // if (item.component_type === 'textarea') {
29 - item.type = 'textarea'; 31 + // item.type = 'textarea';
30 - item.name = item.key; 32 + // item.name = item.key;
31 - item.rows = 2; 33 + // item.rows = 2;
32 - item.autosize = true; 34 + // item.autosize = true;
33 - item.component = TextareaField; 35 + // item.component = TextareaField;
34 - } 36 + // }
35 if (item.component_type === 'number') { 37 if (item.component_type === 'number') {
36 item.type = 'number'; 38 item.type = 'number';
37 item.name = item.key; 39 item.name = item.key;
...@@ -43,5 +45,8 @@ export function createComponentType(data) { ...@@ -43,5 +45,8 @@ export function createComponentType(data) {
43 if (item.component_type === 'checkbox') { 45 if (item.component_type === 'checkbox') {
44 item.component = CheckboxField; 46 item.component = CheckboxField;
45 } 47 }
48 + if (item.component_type === 'picker') {
49 + item.component = PickerField;
50 + }
46 }) 51 })
47 } 52 }
......
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 13:28:54 4 + * @LastEditTime: 2022-08-30 14:23:18
5 * @FilePath: /data-table/src/views/index.vue 5 * @FilePath: /data-table/src/views/index.vue
6 * @Description: 首页 6 * @Description: 首页
7 --> 7 -->
...@@ -51,11 +51,11 @@ onMounted(() => { ...@@ -51,11 +51,11 @@ onMounted(() => {
51 placeholder: '', 51 placeholder: '',
52 component: '', 52 component: '',
53 component_type: 'radio', 53 component_type: 'radio',
54 - sub: [{ 54 + options: [{
55 - key: 'male', 55 + key: '',
56 value: '男' 56 value: '男'
57 }, { 57 }, {
58 - key: 'female', 58 + key: '',
59 value: '女' 59 value: '女'
60 }] 60 }]
61 }, { 61 }, {
...@@ -65,11 +65,11 @@ onMounted(() => { ...@@ -65,11 +65,11 @@ onMounted(() => {
65 placeholder: '', 65 placeholder: '',
66 component: '', 66 component: '',
67 component_type: 'checkbox', 67 component_type: 'checkbox',
68 - sub: [{ 68 + options: [{
69 - key: 'football', 69 + key: '足球',
70 value: '足球' 70 value: '足球'
71 }, { 71 }, {
72 - key: 'basketball', 72 + key: '篮球',
73 value: '篮球' 73 value: '篮球'
74 }] 74 }]
75 }, { 75 }, {
...@@ -79,6 +79,19 @@ onMounted(() => { ...@@ -79,6 +79,19 @@ onMounted(() => {
79 placeholder: '请输入留言', 79 placeholder: '请输入留言',
80 component: '', 80 component: '',
81 component_type: 'textarea', 81 component_type: 'textarea',
82 + }, {
83 + key: 'vehicle',
84 + value: '',
85 + label: '交通工具',
86 + placeholder: '请选择交通工具',
87 + component: '',
88 + component_type: 'picker',
89 + options: [
90 + { text: '自行车', value: '自行车' },
91 + { text: '汽车', value: '汽车' },
92 + { text: '地铁', value: '地铁' },
93 + ],
94 + required: true,
82 }]; 95 }];
83 // 生成自定义组件 96 // 生成自定义组件
84 createComponentType(mockData.value) 97 createComponentType(mockData.value)
......