Add.vue 6.4 KB

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