waybillForm.vue 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  1. <template>
  2. <div class="waybil_form">
  3. <h4 class="head_title">{{title}}</h4>
  4. <div class="card_deliverer" v-if="deliverer" @click="addressBook"><i
  5. class="el-icon-collection icon_address"></i>配送人员薄</div>
  6. <div class="select_type" v-else>
  7. <div style="margin-right: 20px;" v-if="conserveFlag">
  8. <el-radio v-model="radio" label="1" @click.native.prevent="clickitem('1')">保存到地址簿</el-radio>
  9. </div>
  10. <div class="card_book" @click="addressBook"><i class="el-icon-collection icon_address"></i>{{thinTitle}}</div>
  11. </div>
  12. <el-form style="width: 100%;" :model="ruleForm" :rules="rules" :label-position="labelPosition" label-width="80px"
  13. ref="ruleForm">
  14. <el-form-item label="姓名" prop="name">
  15. <el-input v-model="ruleForm.name" placeholder="请输入姓名"></el-input>
  16. </el-form-item>
  17. <el-form-item label="电话" prop="phone">
  18. <el-input v-model="ruleForm.phone" placeholder="请输入电话"></el-input>
  19. </el-form-item>
  20. <el-form-item label="地址" prop="address" v-if="!deliverer">
  21. <el-input v-model="ruleForm.address" placeholder="请输入地址"></el-input>
  22. </el-form-item>
  23. </el-form>
  24. </div>
  25. </template>
  26. <script>
  27. import {
  28. regionData,
  29. CodeToText
  30. } from 'element-china-area-data'
  31. export default {
  32. name: 'waybillForm',
  33. props: {
  34. // 地址簿名称
  35. thinTitle: {
  36. type: String,
  37. default: () => '地址簿',
  38. },
  39. // 表单tabel数据
  40. title: {
  41. type: String,
  42. default: () => '',
  43. },
  44. // 绑定值
  45. ruleForm: {
  46. type: Object,
  47. default: () => {},
  48. },
  49. // 配送人
  50. deliverer: {
  51. type: Boolean,
  52. default: () => false,
  53. },
  54. // 配送人
  55. conserveFlag: {
  56. type: Boolean,
  57. default: () => true,
  58. },
  59. },
  60. data() {
  61. return {
  62. labelPosition: 'left',
  63. options: regionData,
  64. selectedOptions: [],
  65. radio: '1',
  66. rules: {
  67. name: {
  68. required: true,
  69. message: '请输入姓名',
  70. trigger: 'blur'
  71. },
  72. phone: [{
  73. required: true,
  74. message: '请输入电话',
  75. trigger: 'blur'
  76. }, {
  77. pattern: /^((0\d{2,3}-\d{7,8})|(1[34578]\d{9}))$/,
  78. message: '请输入正确手机号码',
  79. trigger: "blur"
  80. }],
  81. region: {
  82. required: true,
  83. message: '请选择省市区',
  84. trigger: 'blur,change'
  85. },
  86. address: {
  87. required: true,
  88. message: '请输入地址',
  89. trigger: 'blur'
  90. },
  91. }
  92. }
  93. },
  94. watch: {
  95. ruleForm: {
  96. handler(newVal) {
  97. this.selectedOptions = newVal.regionCode
  98. },
  99. deep: true // 开启深度监听
  100. }
  101. },
  102. methods: {
  103. addressBook() {
  104. this.$emit('addressBook')
  105. },
  106. clickitem(value) {
  107. value === this.radio ? this.radio = '' : this.radio = value
  108. this.$emit('conserveSelect', this.radio)
  109. },
  110. //子组件校验,传递到父组件
  111. validateForm() {
  112. let flag = null
  113. this.$refs['ruleForm'].validate(valid => {
  114. if (valid) {
  115. flag = true
  116. } else {
  117. flag = false
  118. }
  119. })
  120. return flag
  121. },
  122. // 重置
  123. resetForm() {
  124. this.selectedOptions = []
  125. this.$refs.ruleForm.resetFields();
  126. }
  127. }
  128. }
  129. </script>
  130. <style lang="scss" scoped>
  131. .head_title {
  132. display: flex;
  133. justify-content: center;
  134. width: calc(100% - 6px);
  135. padding-bottom: 6px;
  136. padding-left: 5px;
  137. border-bottom: 1px solid #E4E7ED;
  138. margin: 0px 0px 10px 0px;
  139. }
  140. .waybil_form {
  141. display: flex;
  142. flex-direction: column;
  143. align-items: flex-start;
  144. width: 100%;
  145. }
  146. .select_type {
  147. display: flex;
  148. align-items: center;
  149. margin-bottom: 20px;
  150. margin-left: 80px;
  151. }
  152. .icon_address {
  153. font-size: 23px;
  154. margin-right: 5px;
  155. }
  156. .card_book {
  157. display: flex;
  158. align-items: center;
  159. cursor: pointer;
  160. }
  161. .card_deliverer {
  162. cursor: pointer;
  163. margin-left: 80px;
  164. display: flex;
  165. justify-content: flex-end;
  166. align-items: center;
  167. margin-bottom: 20px;
  168. }
  169. .card_deliverer:hover {
  170. color: #409EFF;
  171. }
  172. .card_book:hover {
  173. color: #409EFF;
  174. }
  175. </style>