Showing
2 changed files
with
86 additions
and
18 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-11-21 14:32:24 | 4 | + * @LastEditTime: 2022-12-06 15:42:08 |
| 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 | - <div class="label">{{ item.label }}<span v-if="item.required"> *</span></div> | 10 | + <div class="label">{{ item.component_props.label }}<span v-if="item.component_props.required"> *</span></div> |
| 11 | <van-field | 11 | <van-field |
| 12 | - v-model="item.value" | 12 | + v-model="fieldValue" |
| 13 | is-link | 13 | is-link |
| 14 | readonly | 14 | readonly |
| 15 | - :name="item.key" | 15 | + :required="item.component_props.required" |
| 16 | - :required="item.required" | 16 | + placeholder="请选择省市区" |
| 17 | - :placeholder="item.placeholder" | ||
| 18 | :rules="item.rules" | 17 | :rules="item.rules" |
| 19 | @click="showPicker = true" | 18 | @click="showPicker = true" |
| 20 | - :border="false" | 19 | + :border="true" |
| 21 | /> | 20 | /> |
| 22 | <van-field | 21 | <van-field |
| 23 | - name="address" | 22 | + v-model="address" |
| 24 | - v-model="item.address" | 23 | + :placeholder="item.component_props.placeholder" |
| 25 | - placeholder="详细地址" | 24 | + @blur="onBlur" |
| 26 | - :border="false" | 25 | + :rules="item.rules" |
| 26 | + :border="true" | ||
| 27 | /> | 27 | /> |
| 28 | + <div | ||
| 29 | + v-if="show_empty" | ||
| 30 | + class="van-field__error-message" | ||
| 31 | + style="padding: 0 1rem 1rem 1rem" | ||
| 32 | + > | ||
| 33 | + 地址不能为空 | ||
| 34 | + </div> | ||
| 28 | <van-popup v-model:show="showPicker" position="bottom"> | 35 | <van-popup v-model:show="showPicker" position="bottom"> |
| 29 | <van-area | 36 | <van-area |
| 30 | - name="city_code" | ||
| 31 | v-model="item.city_code" | 37 | v-model="item.city_code" |
| 32 | title="" | 38 | title="" |
| 33 | :area-list="areaList" | 39 | :area-list="areaList" |
| ... | @@ -45,16 +51,57 @@ const props = defineProps({ | ... | @@ -45,16 +51,57 @@ const props = defineProps({ |
| 45 | item: Object, | 51 | item: Object, |
| 46 | }); | 52 | }); |
| 47 | 53 | ||
| 48 | -const address = ref(""); | 54 | +const emit = defineEmits(["active"]); |
| 55 | +const show_empty = ref(false); | ||
| 49 | 56 | ||
| 57 | +const address = ref(""); | ||
| 58 | +const city_code = ref(""); | ||
| 50 | const showPicker = ref(false); | 59 | const showPicker = ref(false); |
| 51 | -const fieldValue = ref(""); | 60 | +let fieldValue = ref(""); |
| 52 | 61 | ||
| 53 | const onConfirm = ({ selectedOptions }) => { | 62 | const onConfirm = ({ selectedOptions }) => { |
| 54 | - props.item.value = selectedOptions.map((option) => option.text).join("/"); | 63 | + fieldValue.value = selectedOptions.map((option) => option.text).join(" "); |
| 55 | - props.item.city_code = selectedOptions[2]?.value; | 64 | + city_code.value = selectedOptions[2]?.value; |
| 65 | + props.item.value = { | ||
| 66 | + key: "area_picker", | ||
| 67 | + filed_name: props.item.key, | ||
| 68 | + value: { | ||
| 69 | + address: fieldValue.value + ' ' + address.value, | ||
| 70 | + city_code: city_code.value | ||
| 71 | + }, | ||
| 72 | + }; | ||
| 73 | + emit("active", props.item.value); | ||
| 74 | + console.warn(props.item.value); | ||
| 56 | showPicker.value = false; | 75 | showPicker.value = false; |
| 57 | }; | 76 | }; |
| 77 | + | ||
| 78 | +const onBlur = () => { | ||
| 79 | + props.item.value = { | ||
| 80 | + key: "area_picker", | ||
| 81 | + filed_name: props.item.key, | ||
| 82 | + value: { | ||
| 83 | + address: fieldValue.value + ' ' + address.value, | ||
| 84 | + city_code: city_code.value | ||
| 85 | + }, | ||
| 86 | + }; | ||
| 87 | + emit("active", props.item.value); | ||
| 88 | +} | ||
| 89 | + | ||
| 90 | +// 校验模块 | ||
| 91 | +const validAreaPicker = () => { | ||
| 92 | + // 必填项 | ||
| 93 | + if (props.item.component_props.required && !fieldValue.value) { | ||
| 94 | + show_empty.value = true; | ||
| 95 | + } else if (props.item.component_props.required && !address.value) { | ||
| 96 | + show_empty.value = true; | ||
| 97 | + } else { | ||
| 98 | + show_empty.value = false; | ||
| 99 | + } | ||
| 100 | + console.warn(show_empty.value); | ||
| 101 | + return !show_empty.value; | ||
| 102 | +}; | ||
| 103 | + | ||
| 104 | +defineExpose({ validAreaPicker }); | ||
| 58 | </script> | 105 | </script> |
| 59 | 106 | ||
| 60 | <style lang="less" scoped> | 107 | <style lang="less" scoped> | ... | ... |
| 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-11-22 17:59:56 | 4 | + * @LastEditTime: 2022-12-06 15:34:23 |
| 5 | * @FilePath: /data-table/src/views/index.vue | 5 | * @FilePath: /data-table/src/views/index.vue |
| 6 | * @Description: 首页 | 6 | * @Description: 首页 |
| 7 | --> | 7 | --> |
| ... | @@ -155,6 +155,7 @@ const formatData = (data) => { | ... | @@ -155,6 +155,7 @@ const formatData = (data) => { |
| 155 | 155 | ||
| 156 | // 处理没有绑定值的组件的赋值 | 156 | // 处理没有绑定值的组件的赋值 |
| 157 | // 图片上传,文件上传,电子签名,评分组件 | 157 | // 图片上传,文件上传,电子签名,评分组件 |
| 158 | +const area_picker = ref([]); | ||
| 158 | const image_uploader = ref([]); | 159 | const image_uploader = ref([]); |
| 159 | const file_uploader = ref([]); | 160 | const file_uploader = ref([]); |
| 160 | const sign = ref([]); | 161 | const sign = ref([]); |
| ... | @@ -162,6 +163,9 @@ const rate_picker = ref([]); | ... | @@ -162,6 +163,9 @@ const rate_picker = ref([]); |
| 162 | // 动态绑定ref数据 | 163 | // 动态绑定ref数据 |
| 163 | const setRefMap = (el, item) => { | 164 | const setRefMap = (el, item) => { |
| 164 | if (el) { | 165 | if (el) { |
| 166 | + if (item.component_props.name === "area_picker") { | ||
| 167 | + area_picker.value.push(el); | ||
| 168 | + } | ||
| 165 | if (item.component_props.name === "image_uploader") { | 169 | if (item.component_props.name === "image_uploader") { |
| 166 | image_uploader.value.push(el); | 170 | image_uploader.value.push(el); |
| 167 | } | 171 | } |
| ... | @@ -235,12 +239,16 @@ onMounted(async () => { | ... | @@ -235,12 +239,16 @@ onMounted(async () => { |
| 235 | // createComponentType(mockData.value); | 239 | // createComponentType(mockData.value); |
| 236 | createComponentType(formData.value); | 240 | createComponentType(formData.value); |
| 237 | // | 241 | // |
| 238 | - console.warn(formSetting.value); | 242 | + // console.warn(formSetting.value); |
| 239 | notice_text.value = "表单报名将在2022-12-21 12:32后结束"; | 243 | notice_text.value = "表单报名将在2022-12-21 12:32后结束"; |
| 240 | }); | 244 | }); |
| 241 | 245 | ||
| 242 | // 操作绑定自定义字段回调 | 246 | // 操作绑定自定义字段回调 |
| 243 | const onActive = (item) => { | 247 | const onActive = (item) => { |
| 248 | + if (item.key === "area_picker") { | ||
| 249 | + console.warn(item); | ||
| 250 | + postData.value[item.filed_name] = item.value; | ||
| 251 | + } | ||
| 244 | if (item.key === "image_uploader") { | 252 | if (item.key === "image_uploader") { |
| 245 | postData.value[item.filed_name] = item.value; | 253 | postData.value[item.filed_name] = item.value; |
| 246 | } | 254 | } |
| ... | @@ -261,6 +269,18 @@ const validOther = () => { | ... | @@ -261,6 +269,18 @@ const validOther = () => { |
| 261 | status: true, | 269 | status: true, |
| 262 | key: "", | 270 | key: "", |
| 263 | }; | 271 | }; |
| 272 | + if (area_picker.value) { | ||
| 273 | + // 省市区地址 | ||
| 274 | + area_picker.value.forEach((item, index) => { | ||
| 275 | + if (!area_picker.value[index].validAreaPicker()) { | ||
| 276 | + valid = { | ||
| 277 | + status: area_picker.value[index].validAreaPicker(), | ||
| 278 | + key: "area_picker", | ||
| 279 | + }; | ||
| 280 | + return false; | ||
| 281 | + } | ||
| 282 | + }); | ||
| 283 | + } | ||
| 264 | if (image_uploader.value) { | 284 | if (image_uploader.value) { |
| 265 | // 图片上传 | 285 | // 图片上传 |
| 266 | image_uploader.value.forEach((item, index) => { | 286 | image_uploader.value.forEach((item, index) => { |
| ... | @@ -313,6 +333,7 @@ const validOther = () => { | ... | @@ -313,6 +333,7 @@ const validOther = () => { |
| 313 | }; | 333 | }; |
| 314 | 334 | ||
| 315 | const onSubmit = async (values) => { | 335 | const onSubmit = async (values) => { |
| 336 | + console.warn(postData.value); | ||
| 316 | // 合并自定义字段到提交表单字段 | 337 | // 合并自定义字段到提交表单字段 |
| 317 | postData.value = _.assign(postData.value, values); | 338 | postData.value = _.assign(postData.value, values); |
| 318 | // 检查非表单输入项 | 339 | // 检查非表单输入项 | ... | ... |
-
Please register or login to post a comment