tn-form.vue 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. <template>
  2. <view class="tn-form-class tn-form">
  3. <slot></slot>
  4. </view>
  5. </template>
  6. <script>
  7. export default {
  8. name: 'tn-form',
  9. props: {
  10. // 表单数据对象(需要验证的表单数据)
  11. model: {
  12. type: Object,
  13. default() {
  14. return {}
  15. }
  16. },
  17. // 发生错误时的提示方式
  18. // toast - 弹出toast框
  19. // message - 提示信息
  20. // border - 如果设置了边框,边框会变成红色
  21. // border-bottom - 下边框会呈现红色
  22. // none - 无提示
  23. errorType: {
  24. type: Array,
  25. default() {
  26. return ['message', 'toast']
  27. }
  28. },
  29. // 是否显示表单域的下划线边框
  30. borderBottom: {
  31. type:Boolean,
  32. default: true
  33. },
  34. // label(标签名称)的位置
  35. // left - 左边
  36. // top - 上边
  37. labelPosition: {
  38. type: String,
  39. default: 'left'
  40. },
  41. // label的宽度
  42. labelWidth: {
  43. type: Number,
  44. default: 90
  45. },
  46. // label的对齐方式
  47. // left - 左对齐
  48. // center - 居中对齐
  49. // right - 右对齐
  50. labelAlign: {
  51. type: String,
  52. default: 'left'
  53. },
  54. // label 的样式
  55. labelStyle: {
  56. type: Object,
  57. default() {
  58. return {}
  59. }
  60. }
  61. },
  62. // 向子孙传递数据
  63. provide() {
  64. return {
  65. tnForm: this
  66. }
  67. },
  68. data() {
  69. return {
  70. rules: {}
  71. }
  72. },
  73. created() {
  74. // 存储当前form下的所有form-item的实例
  75. // 不能定义再data中,否则小程序会循环引用而报错
  76. this.fields = []
  77. },
  78. methods: {
  79. /**
  80. * 设置规则
  81. *
  82. * @param {Object} rules
  83. */
  84. setRules(rules) {
  85. this.rules = rules
  86. },
  87. /**
  88. * 清空form-item组件
  89. */
  90. resetFields() {
  91. this.fields.map(field => {
  92. field.resetField()
  93. })
  94. },
  95. /**
  96. * 校验数据
  97. * @param {Object} callback 校验回调方法
  98. */
  99. validate(callback) {
  100. return new Promise(resolve => {
  101. // 标记校验是否通过
  102. let valid = true
  103. // 标记是否检查完毕
  104. let count = 0
  105. // 存放错误信息
  106. let errors = []
  107. // 对所有form-item进行校验
  108. this.fields.map(field => {
  109. // 调用对应form-item实例的validation校验方法
  110. field.validation('', error => {
  111. // 如果有一个form-item校验不通过,则整个表单校验不通过
  112. if (error) {
  113. valid = false
  114. errors.push(error)
  115. }
  116. // 当遍历完所有的form-item的校验规则,返回信息
  117. if (++count === this.fields.length) {
  118. resolve(valid)
  119. // 判断是否设置了toast的提示方式,只提示表单域中最前面的一条错误信息
  120. if (this.errorType.indexOf('none') === -1 &&
  121. this.errorType.indexOf('toast') >= 0 &&
  122. errors.length > 0) {
  123. this.$t.message.toast(errors[0])
  124. }
  125. // 调用回调方法
  126. if (typeof callback == 'function') callback(valid)
  127. }
  128. })
  129. })
  130. })
  131. }
  132. }
  133. }
  134. </script>
  135. <style>
  136. </style>