hookehuyr

地址控件联调

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">&nbsp;*</span></div> 10 + <div class="label">{{ item.component_props.label }}<span v-if="item.component_props.required">&nbsp;*</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 // 检查非表单输入项
......