当前位置:   article > 正文

antdv a-form的校验方式(手把手 附送上传boundary二进制流方法)_a-form-item 如何进行深层对象校验

a-form-item 如何进行深层对象校验

最近换了新工作,新公司的主要开发框架使用 antd 的 ui 库进行开发,其中 <a-form> 的校验小红星就是出不来,经过探索和网上搜索发现,antdv 中的 <a-form> 校验方式和熟悉的 element ui 的校验方式有一些区别,具体体现在 antd 主要是使用 <a-form> 自带的 v-decorator 属性进行校验,而不是使用 element ui 的 <el-form-item> 标签中的 ref 进行绑定校验。

  1. <!--@author: fuyucong(congreat)-->
  2. <!--@description: 添加升级包抽屉-->
  3. <template>
  4. <a-drawer
  5. :title="title"
  6. :width="width"
  7. placement="right"
  8. :closable="false"
  9. @close="close"
  10. destroyOnClose
  11. :visible="modelVisible">
  12. <div class="tips-container">请添加要升级至的目标版本的完整的升级包</div>
  13. <a-form :form="form" :labelCol="labelCol" :wrapperCol="wrapperCol" @submit="submitForm">
  14. <a-form-item label="升级包名称">
  15. <a-input
  16. v-decorator="['name', { rules: [{ required: true, message: '请输入升级包名称' }] }]"
  17. placeholder="请输入升级包名称"/>
  18. </a-form-item>
  19. <a-form-item label="选择产品">
  20. <a-select
  21. v-decorator="['productId', { rules: [{ required: true, message: '请选择产品' }] }]"
  22. placeholder="请选择产品"
  23. >
  24. <a-select-option v-for="item in productList" :key="item.id" :value="item.id">{{ item.name }}</a-select-option>
  25. </a-select>
  26. </a-form-item>
  27. <a-form-item label="目标版本">
  28. <a-input
  29. v-decorator="['version', { rules: [{ required: true, message: '请输入目标版本' }] }]"
  30. />
  31. </a-form-item>
  32. <a-form-item label="验证状态">
  33. <a-radio-group
  34. v-decorator="['verify_state', { rules: [{ required: true, message: '请选择验证状态' }] }]"
  35. >
  36. <a-radio :value="1">需要验证</a-radio>
  37. <a-radio :value="0">不需验证</a-radio>
  38. </a-radio-group>
  39. </a-form-item>
  40. <a-form-item label="上传升级包">
  41. <a-upload
  42. v-decorator="['file', { rules: [{ required: true, message: '请上传升级包' }] }]"
  43. name="file"
  44. :multiple="true"
  45. :showUploadList="false"
  46. accept=".rar,.zip,.bin"
  47. :customRequest="fileUpload"
  48. :beforeUpload="beforeUpload"
  49. >
  50. <a-button>
  51. <a-icon type="upload"/>
  52. 选择文件
  53. </a-button>
  54. </a-upload>
  55. </a-form-item>
  56. </a-form>
  57. <div class="drawer-footer">
  58. <a-button @click="close" style="margin-bottom: 0;">关闭</a-button>
  59. <a-button v-if="!disableSubmit" @click="submitForm" type="primary" style="margin-bottom: 0;">提交</a-button>
  60. </div>
  61. </a-drawer>
  62. </template>
  63. <script>
  64. import productService from '@api/biz/product'
  65. import deviceOtaService from '@api/biz/deviceOta'
  66. export default {
  67. name: 'addFirmware',
  68. props: {
  69. visible: {
  70. type: Boolean,
  71. default: false
  72. },
  73. disableSubmit: {
  74. type: Boolean,
  75. default: false
  76. },
  77. },
  78. data() {
  79. return {
  80. title: '添加升级包',
  81. width: 650,
  82. labelCol: {
  83. span: 4,
  84. offset: 2
  85. },
  86. wrapperCol: {
  87. span: 17
  88. },
  89. productList: [],
  90. param: {
  91. module: 'default',
  92. version: 'v'
  93. },
  94. form: this.$form.createForm(this),
  95. }
  96. },
  97. created() {
  98. },
  99. mounted() {
  100. this.getProductList()
  101. },
  102. computed: {
  103. modelVisible: {
  104. get() {
  105. return this.visible
  106. },
  107. set(val) {
  108. this.$emit('update:visible', val)
  109. }
  110. }
  111. },
  112. methods: {
  113. close() {
  114. this.$emit('close');
  115. },
  116. handleOk(values) {
  117. // this.$emit('close');
  118. let params = new FormData();
  119. // params.name = new FormData().append('name', this.param.name)
  120. // params.productId = new FormData().append('productId', this.param.productId)
  121. // params.version = new FormData().append('version', this.param.version)
  122. // params.module = new FormData().append('module', this.param.module)
  123. params.append('name', values.name)
  124. params.append('product_id', values.productId)
  125. params.append('version', values.version)
  126. params.append('module', 'default')
  127. params.append('file', this.param.file)
  128. params.append('verify_state', values.verify_state)
  129. console.log(params, 'params')
  130. deviceOtaService.addFirmwares(params).then(res => {
  131. if (res.code === 0) {
  132. this.$message.success('添加成功');
  133. this.$emit('close');
  134. }
  135. })
  136. },
  137. getProductList() {
  138. productService.getProductList({
  139. page_index: 1,
  140. page_size: 1000
  141. }).then(res => {
  142. if (res.code === 0) {
  143. this.productList = res.data.data
  144. }
  145. })
  146. },
  147. async fileUpload(info) {
  148. this.param.file = info.file;
  149. },
  150. beforeUpload(file) {
  151. const isRar = file.type === '';
  152. const isBin = file.type === 'application/octet-stream';
  153. const isZip = file.type === 'application/x-zip-compressed';
  154. let isType = isRar || isBin || isZip;
  155. if (!isType) {
  156. this.$message.error('只能上传rar、bin、zip格式的文件!');
  157. }
  158. const isLt30M = file.size / 1024 / 1024 < 30;
  159. if (!isLt30M) {
  160. this.$message.error('文件大小不能超过30MB!');
  161. }
  162. return isType && isLt30M;
  163. },
  164. upload(file){
  165. return new Promise(resolve=>{
  166. let reader = new FileReader()
  167. reader.readAsBinaryString(file);//读取文件的原始二进制数据
  168. reader.onload = ev=>{
  169. resolve(ev.target.result)
  170. }
  171. })
  172. },
  173. submitForm() {
  174. this.form.validateFields((err, values) => {
  175. if (!err) {
  176. this.handleOk(values)
  177. }
  178. })
  179. }
  180. }
  181. }
  182. </script>

        校验的重点在于在 <a-form> 标签中的 :form="form" 绑定值

  1. <template>
  2. <a-form
  3. :form="form"
  4. @submit="submitForm"
  5. >
  6. <!-- 不要绑定 ref!不要绑定 v-model! -->
  7. <a-form-item label="目标版本>
  8. <a-input
  9. v-decorator="['version', { rules: [{ required: true, message: '请输入目标版本' }] }]"
  10. />
  11. </a-form-item>
  12. </a-form>
  13. </template>
  14. <script>
  15. export default {
  16. data() {
  17. return {
  18. form: this.$form.createForm(this) // 在此使用createForm方法绑定this,会自动创建this.form
  19. }
  20. },
  21. methods: {
  22. submitForm() {
  23. this.form.validateFields((err, values) => {
  24. if (!err) { // 校验通过
  25. console.log(values) // form中的值会通过values返回
  26. }
  27. }
  28. }
  29. }
  30. }
  31. </script>

切记:如果使用此种方法校验,不要在 <a-form-item> 上绑定 ref ,也不要在 <a-form-item> 中的元素(如 <a-input> 、<a-select> 等)中绑定 v-model ,否则会报错!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/91506
推荐阅读
相关标签
  

闽ICP备14008679号