Add.vue 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212
  1. <template>
  2. <view>
  3. <up-form labelPosition="left" :model="modelForm" :rules="rulesForm" ref="formRef">
  4. <up-form-item label="姓名" prop="name" borderBottom>
  5. <up-input v-model="modelForm.name" border="none"></up-input>
  6. </up-form-item>
  7. <up-form-item label="性别" prop="sex" borderBottom @click="() => (sexFlag = true)">
  8. <up-input v-model="modelForm.sex" disabled disabledColor="#ffffff" placeholder="请选择性别"
  9. border="none"></up-input>
  10. <template #right>
  11. <up-icon name="arrow-right"></up-icon>
  12. </template>
  13. </up-form-item>
  14. <up-form-item label="关系" prop="label" borderBottom @click="() => labelFlag = true">
  15. <up-input v-model="modelForm.label" disabled disabledColor="#ffffff" placeholder="请选择关系"
  16. border="none"></up-input>
  17. <template #right>
  18. <up-icon name="arrow-right"></up-icon>
  19. </template>
  20. </up-form-item>
  21. <up-form-item label="年龄" prop="age" borderBottom>
  22. <up-input v-model="modelForm.age" border="none"></up-input>
  23. </up-form-item>
  24. <up-form-item label="手机号" prop="telephone" borderBottom
  25. :style="{ display: 'flex', justifyContent: 'space-between', alignItems: 'center' }">
  26. <up-input v-model="modelForm.telephone" border="none"></up-input>
  27. </up-form-item>
  28. <up-form-item label="是否有传染疾病" prop="isContagion" borderBottom>
  29. <up-radio-group v-model="modelForm.isContagion" placement="row" @change="groupChange">
  30. <up-radio :customStyle="{marginRight: '16px'}" v-for="(item, index) in isContagionOption" :key="index"
  31. :label="item.name" :name="item.name" @change="radioChange">
  32. </up-radio>
  33. </up-radio-group>
  34. </up-form-item>
  35. <up-form-item label="地区" prop="area" borderBottom @click="()=> addressShow = true">
  36. <up-icon name="arrow-right"></up-icon>
  37. <pickerAddress @change="addressChange" :selectValue="[ modelForm.area.provinceCode, modelForm.area.cityCode, modelForm.area.areaCode ]">
  38. <view class="inp" :class="modelForm.area.province&&modelForm.area.city&&modelForm.area.area?'':'address-inp'">
  39. {{modelForm.area.province ? modelForm.area.province:'省'}} /
  40. {{modelForm.area.city ? modelForm.area.city:'市'}} /
  41. {{modelForm.area.area ? modelForm.area.area:'区'}}
  42. </view>
  43. </pickerAddress>
  44. </up-form-item>
  45. <up-form-item label="地址" prop="address" borderBottom>
  46. <up-input v-model="modelForm.address" border="none"></up-input>
  47. </up-form-item>
  48. </up-form>
  49. <up-action-sheet :show="sexFlag" :actions="sexOptions" @select="sexSelect"
  50. @close="sexFlag = false"></up-action-sheet>
  51. <up-action-sheet :show="labelFlag" :actions="relaTionsHip" @select="sexSelectsHip"
  52. @close="labelFlag = false"></up-action-sheet>
  53. </view>
  54. </template>
  55. <script setup>
  56. import {
  57. ref,
  58. reactive
  59. } from 'vue';
  60. import pickerAddress from '@/components/pickerAddress/pickerAddress.vue' // 地区选择器组件
  61. const formRef = ref(null)
  62. const modelForm = ref({
  63. name: '',
  64. sex: '',
  65. label: '',
  66. age: '',
  67. telephone: '',
  68. isContagion: '',
  69. area: { // xxxxCode 储存所在数据下标,用来映射回显数据
  70. province: '', // 省
  71. provinceCode: 0,
  72. city: '', // 市
  73. cityCode: 0,
  74. area: '', // 区
  75. areaCode: 0
  76. },
  77. address: ''
  78. })
  79. const rulesForm = ref({
  80. name: {
  81. type: 'string',
  82. required: true,
  83. message: '请填写姓名',
  84. trigger: ['blur', 'change'],
  85. },
  86. sex: {
  87. type: 'string',
  88. required: true,
  89. message: '请选择性别',
  90. trigger: ['change']
  91. },
  92. label: {
  93. type: 'string',
  94. required: true,
  95. message: '请选择关系',
  96. trigger: ['change'],
  97. },
  98. userInfo: {
  99. type: 'string',
  100. required: true,
  101. message: '请填写年龄',
  102. trigger: ['blur', 'change'],
  103. },
  104. telephone: {
  105. type: 'string',
  106. required: true,
  107. message: '请填写手机号',
  108. trigger: ['blur', 'change'],
  109. },
  110. })
  111. let sexFlag = ref(false)
  112. let labelFlag = ref(false)
  113. let addressShow = ref(false)
  114. const sexOptions = ref([
  115. {
  116. name: '男'
  117. }, {
  118. name: '女'
  119. },
  120. ]);
  121. const isContagionOption = ref([
  122. {
  123. name: '是',
  124. key: 1,
  125. disabled: false,
  126. },
  127. {
  128. name: '否',
  129. key: 0,
  130. disabled: false,
  131. }
  132. ])
  133. const relaTionsHip = ref([
  134. {
  135. name: '父母'
  136. }, {
  137. name: '子女'
  138. },
  139. {
  140. name: '兄弟'
  141. },
  142. {
  143. name: '朋友'
  144. },
  145. {
  146. name: '同学'
  147. },
  148. {
  149. name: '同事'
  150. },
  151. {
  152. name: '配偶'
  153. }
  154. ]);
  155. function groupChange (n) {
  156. console.log('groupChange', n);
  157. }
  158. function radioChange (n) {
  159. console.log('radioChange', n);
  160. }
  161. function sexSelect(e) {
  162. modelForm.value.sex = e.name;
  163. sexFlag.value = false;
  164. }
  165. function sexSelectsHip(e) {
  166. modelForm.value.label = e.name;
  167. labelFlag.value = false;
  168. }
  169. function addressChange(data) {
  170. console.log(data, '>>>>data');
  171. let { data:date, index } = data
  172. modelForm.value.area.province = date[0]
  173. modelForm.value.area.provinceCode = index[0]
  174. modelForm.value.area.city = date[1]
  175. modelForm.value.area.cityCode = index[1]
  176. modelForm.value.area.area = date[2]
  177. modelForm.value.area.areaCode = index[2]
  178. }
  179. // 预留校验函数
  180. function handleVerify() {
  181. // formRef.value
  182. }
  183. defineExpose({
  184. modelForm: modelForm.value,
  185. handleVerify: handleVerify()
  186. })
  187. </script>
  188. <style>
  189. </style>