u-form.vue 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. <template>
  2. <view class="u-form"><slot /></view>
  3. </template>
  4. <script>
  5. export default {
  6. name: 'u-form',
  7. props: {
  8. // 当前form的需要验证字段的集合
  9. model: {
  10. type: Object,
  11. default() {
  12. return {};
  13. }
  14. },
  15. // 验证规则
  16. // rules: {
  17. // type: [Object, Function, Array],
  18. // default() {
  19. // return {};
  20. // }
  21. // },
  22. // 有错误时的提示方式,message-提示信息,border-如果input设置了边框,变成呈红色,
  23. // border-bottom-下边框呈现红色,none-无提示
  24. errorType: {
  25. type: Array,
  26. default() {
  27. return ['message']
  28. }
  29. }
  30. },
  31. provide() {
  32. return {
  33. uForm: this
  34. };
  35. },
  36. data() {
  37. return {
  38. rules: {}
  39. };
  40. },
  41. created() {
  42. // 存储当前form下的所有u-form-item的实例
  43. // 不能定义在data中,否则微信小程序会造成循环引用而报错
  44. this.fields = [];
  45. // 存当前实例
  46. let that = this;
  47. // 监听on-form-item-add事件,将子组件添加到fields中
  48. this.$on('on-form-item-add', item => {
  49. if (item) {
  50. that.fields.push(item);
  51. }
  52. });
  53. // 删除当前有的实例
  54. this.$on('on-form-item-remove', item => {
  55. // 如果当前没有prop的话表示当前不要进行删除(因为没有注入)
  56. if (item.prop) {
  57. that.fields.splice(that.fields.indexOf(item), 1);
  58. }
  59. });
  60. },
  61. methods: {
  62. setRules(rules) {
  63. this.rules = rules;
  64. },
  65. // 清空所有u-form-item组件的内容,本质上是调用了u-form-item组件中的resetField()方法
  66. resetFields() {
  67. this.fields.map(field => {
  68. field.resetField();
  69. });
  70. },
  71. // 校验全部数据
  72. validate(callback) {
  73. return new Promise(resolve => {
  74. // 对所有的u-form-item进行校验
  75. let valid = true; // 默认通过
  76. let count = 0; // 用于标记是否检查完毕
  77. this.fields.map(field => {
  78. // 调用每一个u-form-item实例的validation的校验方法
  79. field.validation('', error => {
  80. // 如果任意一个u-form-item校验不通过,就意味着整个表单不通过
  81. if (error) valid = false;
  82. // 当历遍了所有的u-form-item时,调用promise的then方法
  83. if (++count === this.fields.length) {
  84. resolve(valid); // 进入promise的then方法
  85. // 调用回调方法
  86. if (typeof callback == 'function') callback(valid);
  87. }
  88. });
  89. });
  90. });
  91. }
  92. }
  93. };
  94. </script>
  95. <style></style>