Add.vue 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238
  1. <template>
  2. <view>
  3. <up-form labelPosition="left" :model="modelForm" :rules="rulesForm" ref="formRef">
  4. <up-form-item label="姓名" prop="name" borderBottom labelWidth="70">
  5. <up-input v-model="modelForm.name" border="none" placeholder="请输入姓名"></up-input>
  6. </up-form-item>
  7. <up-form-item label="性别" prop="sex" borderBottom @click="() => (sexFlag = true)" labelWidth="70">
  8. <up-input v-model="displaySex" 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" labelWidth="70">
  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 labelWidth="70">
  22. <up-input v-model="modelForm.age" border="none" placeholder="请输入年龄"></up-input>
  23. </up-form-item>
  24. <up-form-item label="手机号" prop="telephone" borderBottom
  25. :style="{ display: 'flex', justifyContent: 'space-between', alignItems: 'center' }" labelWidth="70">
  26. <up-input v-model="modelForm.telephone" border="none" placeholder="请输入手机号"></up-input>
  27. </up-form-item>
  28. <up-form-item label="地区" prop="area" borderBottom @click="()=> addressShow = true" labelWidth="70">
  29. <pickerAddress @change="addressChange"
  30. :selectValue="[ modelForm.provinceInd, modelForm.cityInd, modelForm.districtInd ]">
  31. <view class="inp"
  32. :class="modelForm.provinceName&&modelForm.cityName&&modelForm.districtName?'':'address-inp'">
  33. {{modelForm.provinceName ? modelForm.provinceName:'省'}} /
  34. {{modelForm.cityName ? modelForm.cityName:'市'}} /
  35. {{modelForm.districtName ? modelForm.districtName:'区'}}
  36. </view>
  37. </pickerAddress>
  38. <template #right>
  39. <up-icon name="map" size="22" @click="onCityWx"></up-icon>
  40. </template>
  41. </up-form-item>
  42. <up-form-item label="地址" prop="address" borderBottom labelWidth="70">
  43. <up-input v-model="modelForm.address" border="none" placeholder="请输入地址"></up-input>
  44. </up-form-item>
  45. </up-form>
  46. <up-action-sheet :show="sexFlag" :actions="sexOptions" @select="sexSelect"
  47. @close="sexFlag = false"></up-action-sheet>
  48. <up-action-sheet :show="labelFlag" :actions="relaTionsHip" @select="sexSelectsHip"
  49. @close="labelFlag = false"></up-action-sheet>
  50. </view>
  51. </template>
  52. <script setup>
  53. import {
  54. ref,
  55. reactive,
  56. computed
  57. } from 'vue';
  58. import pickerAddress from '@/pages_mine/components/pickerAddress/pickerAddress.vue' // 地区选择器组件
  59. import { splitAddress } from '@/utils/adress'
  60. const formRef = ref(null)
  61. const modelForm = ref({
  62. name: '',
  63. sex: '',
  64. label: '',
  65. age: '',
  66. telephone: '',
  67. provinceName: '', // 省
  68. provinceCode: '',
  69. provinceInd: 0,
  70. cityName: '', // 市
  71. cityCode: '',
  72. cityInd: 0,
  73. districtName: '',
  74. districtCode: '',
  75. districtInd: 0,
  76. address: ''
  77. })
  78. const rulesForm = ref({
  79. name: {
  80. type: 'string',
  81. required: true,
  82. message: '请填写姓名',
  83. trigger: ['blur', 'change'],
  84. },
  85. sex: {
  86. type: 'string',
  87. required: true,
  88. message: '请选择性别',
  89. trigger: ['change']
  90. },
  91. label: {
  92. type: 'string',
  93. required: true,
  94. message: '请选择关系',
  95. trigger: ['change'],
  96. },
  97. userInfo: {
  98. type: 'string',
  99. required: true,
  100. message: '请填写年龄',
  101. trigger: ['blur', 'change'],
  102. },
  103. telephone: {
  104. type: 'string',
  105. required: true,
  106. message: '请填写手机号',
  107. trigger: ['blur', 'change'],
  108. },
  109. })
  110. let sexFlag = ref(false)
  111. let labelFlag = ref(false)
  112. let addressShow = ref(false)
  113. let index = ref(0)
  114. // 新增一个响应式变量,控制传染病内容的显示
  115. const showContagionContent = ref(false);
  116. const sexOptions = ref([{
  117. name: '男',
  118. value: 0,
  119. }, {
  120. name: '女',
  121. value: 1,
  122. }, ]);
  123. const relaTionsHip = ref([{
  124. name: '父母'
  125. }, {
  126. name: '子女'
  127. },
  128. {
  129. name: '兄弟'
  130. },
  131. {
  132. name: '朋友'
  133. },
  134. {
  135. name: '同学'
  136. },
  137. {
  138. name: '同事'
  139. },
  140. {
  141. name: '配偶'
  142. }
  143. ]);
  144. const displaySex = computed({
  145. get() {
  146. const option = sexOptions.value.find(item => item.value === modelForm.value.sex)
  147. return option ? option.name : ''
  148. },
  149. set(newValue) {
  150. const option = sexOptions.value.find(item => item.name === newValue)
  151. if (option) {
  152. modelForm.value.sex = option.value
  153. }
  154. }
  155. })
  156. // 性别选择处理
  157. function sexSelect(e) {
  158. modelForm.value.sex = e.value
  159. sexFlag.value = false
  160. }
  161. function sexSelectsHip(e) {
  162. modelForm.value.label = e.name;
  163. labelFlag.value = false;
  164. }
  165. function addressChange(info) {
  166. console.log(info, '>>>>data');
  167. const {
  168. data,
  169. code,
  170. index
  171. } = info
  172. modelForm.value.provinceName = data[0]
  173. modelForm.value.provinceCode = code[0]
  174. modelForm.value.provinceInd = index[0]
  175. modelForm.value.cityName = data[1]
  176. modelForm.value.cityCode = code[1]
  177. modelForm.value.cityInd = index[1]
  178. modelForm.value.districtName = data[2]
  179. modelForm.value.districtCode = code[2]
  180. modelForm.value.districtInd = index[2]
  181. }
  182. function onCityWx(row) {
  183. console.log('地区选点',row);
  184. wx.chooseLocation({
  185. success: function (res) {
  186. const result = splitAddress(res.address);
  187. console.log(res,result);
  188. modelForm.value.provinceName = result.province
  189. modelForm.value.cityName = result.city
  190. modelForm.value.districtName = result.district
  191. modelForm.value.address = result.detail
  192. modelForm.value.longitude =res.longitude
  193. modelForm.value.latitude = res.latitude
  194. },
  195. fail: function (err) {
  196. console.log(err);
  197. uni.showToast({
  198. title:'获取地址失败',
  199. icon: 'error',
  200. });
  201. },
  202. })
  203. }
  204. // 预留校验函数
  205. function handleVerify() {
  206. // formRef.value
  207. }
  208. defineExpose({
  209. modelForm: modelForm.value,
  210. handleVerify: handleVerify()
  211. })
  212. </script>
  213. <style>
  214. </style>