waybillForm.vue 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  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. region: {
  78. required: true,
  79. message: '请选择省市区',
  80. trigger: 'blur,change'
  81. },
  82. address: {
  83. required: true,
  84. message: '请输入地址',
  85. trigger: 'blur'
  86. },
  87. }
  88. }
  89. },
  90. watch: {
  91. ruleForm: {
  92. handler(newVal) {
  93. this.selectedOptions = newVal.regionCode
  94. },
  95. deep: true // 开启深度监听
  96. }
  97. },
  98. methods: {
  99. addressBook() {
  100. this.$emit('addressBook')
  101. },
  102. clickitem(value) {
  103. value === this.radio ? this.radio = '' : this.radio = value
  104. this.$emit('conserveSelect', this.radio)
  105. },
  106. //子组件校验,传递到父组件
  107. validateForm() {
  108. let flag = null
  109. this.$refs['ruleForm'].validate(valid => {
  110. if (valid) {
  111. flag = true
  112. } else {
  113. flag = false
  114. }
  115. })
  116. return flag
  117. },
  118. // 重置
  119. resetForm() {
  120. this.selectedOptions = []
  121. this.$refs.ruleForm.resetFields();
  122. }
  123. }
  124. }
  125. </script>
  126. <style lang="scss" scoped>
  127. .head_title {
  128. display: flex;
  129. justify-content: center;
  130. width: calc(100% - 6px);
  131. padding-bottom: 6px;
  132. padding-left: 5px;
  133. border-bottom: 1px solid #E4E7ED;
  134. margin: 10px 0px;
  135. }
  136. .waybil_form {
  137. display: flex;
  138. flex-direction: column;
  139. align-items: flex-start;
  140. width: 100%;
  141. }
  142. .select_type {
  143. display: flex;
  144. align-items: center;
  145. margin-bottom: 20px;
  146. margin-left: 80px;
  147. }
  148. .icon_address {
  149. font-size: 23px;
  150. margin-right: 5px;
  151. }
  152. .card_book {
  153. display: flex;
  154. align-items: center;
  155. cursor: pointer;
  156. }
  157. .card_deliverer {
  158. cursor: pointer;
  159. margin-left: 80px;
  160. display: flex;
  161. justify-content: flex-end;
  162. align-items: center;
  163. margin-bottom: 20px;
  164. }
  165. .card_deliverer:hover {
  166. color: #409EFF;
  167. }
  168. .card_book:hover {
  169. color: #409EFF;
  170. }
  171. </style>