From 57d59e8a8640fb0fcfdbe2d0c09fac0f1cbe5697 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E9=99=88=E5=98=89=E6=B6=B5?= <chenjiahan@youzan.com>
Date: Wed, 12 Feb 2020 17:27:29 +0800
Subject: [PATCH] docs(Form): add async validation document

---
 src/form/README.md              | 48 ++++++++++++++++++++++-----------
 src/form/README.zh-CN.md        | 42 ++++++++++++++++++++---------
 src/form/demo/ValidateRules.vue |  6 ++++-
 3 files changed, 68 insertions(+), 28 deletions(-)

diff --git a/src/form/README.md b/src/form/README.md
index c21cf0f99..fdf5683e0 100644
--- a/src/form/README.md
+++ b/src/form/README.md
@@ -49,20 +49,15 @@ export default {
       console.log('submit', values);
     },
   },
-}
+};
 ```
 
 ### Validate Rules
 
 ```html
 <van-form @submit="onSubmit" @failed="onFailed">
-  <van-field
-    v-model="value"
-    name="phone"
-    label="Phone"
-    :rules="rules"
-    placeholder="Phone"
-  />
+  <van-field v-model="value" name="phone" label="Phone" :rules="rules.phone" />
+  <van-field v-model="code" name="code" label="Code" :rules="rules.code" />
   <div style="margin: 16px;">
     <van-button round block type="info">Submit</van-button>
   </div>
@@ -70,15 +65,36 @@ export default {
 ```
 
 ```js
+import { Toast } from 'vant';
+
 export default {
   data() {
-    this.rules = [
-      { required: true, message: 'Phone is required' },
-      { validator: val => /1\d{10}/.test(val), message: 'Incorrect format' },
-    ];
+    this.rules = {
+      phone: [
+        { required: true, message: 'Phone is required' },
+        { validator: val => this.validatePhone, message: 'Incorrect phone' },
+      ],
+      code: [
+        { required: true, message: 'Code is required' },
+        { validator: this.validateCode, message: 'Incorrect code' },
+      ],
+    };
     return { value: '' };
   },
   methods: {
+    validatePhone(val) {
+      return /1\d{10}/.test(val);
+    },
+    validateCode(val) {
+      return new Promise(resolve => {
+        Toast.loading('Validating...');
+
+        setTimeout(() => {
+          Toast.clear();
+          resolve(/\d{6}/.test(val));
+        }, 1000);
+      });
+    },
     onSubmit(values) {
       console.log('submit', values);
     },
@@ -334,7 +350,7 @@ export default {
     return {
       value: '',
       showArea: false,
-      areaList: {}
+      areaList: {},
     };
   },
   methods: {
@@ -383,7 +399,8 @@ export default {
 ### Props
 
 | Attribute | Description | Type | Default |
-|------|------|------|------|
+| --------- | ----------- | ---- | ------- |
+
 
 ### Events
 
@@ -392,4 +409,5 @@ export default {
 ### Slots
 
 | Name | Description |
-|------|------|
+| ---- | ----------- |
+
diff --git a/src/form/README.zh-CN.md b/src/form/README.zh-CN.md
index d1dc67c46..c57d50a9b 100644
--- a/src/form/README.zh-CN.md
+++ b/src/form/README.zh-CN.md
@@ -60,17 +60,12 @@ export default {
 
 ### 校验规则
 
-在`rules`中,可以通过`validator`字段定义校验函数,校验函数返回`false`时表示校验不通过,返回`Promise`时表示异步校验
+在`rules`中,可以通过`validator`字段定义校验函数
 
 ```html
 <van-form @submit="onSubmit" @failed="onFailed">
-  <van-field
-    v-model="value"
-    name="phone"
-    label="手机号"
-    :rules="rules"
-    placeholder="手机号"
-  />
+  <van-field v-model="value" name="phone" label="手机号" :rules="rules.phone" />
+  <van-field v-model="code" name="code" label="验证码" :rules="rules.code" />
   <div style="margin: 16px;">
     <van-button round block type="info">提交</van-button>
   </div>
@@ -78,15 +73,38 @@ export default {
 ```
 
 ```js
+import { Toast } from 'vant';
+
 export default {
   data() {
-    this.rules = [
-      { required: true, message: '请输入手机号' },
-      { validator: val => /1\d{10}/.test(val), message: '手机号格式错误' },
-    ];
+    this.rules = {
+      phone: [
+        { required: true, message: '请输入手机号' },
+        { validator: val => this.validatePhone, message: '手机号格式错误' },
+      ],
+      code: [
+        { required: true, message: '请输入验证码' },
+        { validator: this.validateCode, message: '验证码错误' },
+      ],
+    };
     return { value: '' };
   },
   methods: {
+    // 校验函数返回 true 表示校验通过,false 表示不通过
+    validatePhone(val) {
+      return /1\d{10}/.test(val);
+    },
+    // 校验函数返回 Promise 来实现异步校验
+    validateCode(val) {
+      return new Promise(resolve => {
+        Toast.loading('验证中...');
+
+        setTimeout(() => {
+          Toast.clear();
+          resolve(/\d{6}/.test(val));
+        }, 1000);
+      });
+    },
     onSubmit(values) {
       console.log('submit', values);
     },
diff --git a/src/form/demo/ValidateRules.vue b/src/form/demo/ValidateRules.vue
index d3834df7d..1aa434e73 100644
--- a/src/form/demo/ValidateRules.vue
+++ b/src/form/demo/ValidateRules.vue
@@ -61,7 +61,7 @@ export default {
       phone: [
         { required: true, message: this.$t('requirePhone') },
         {
-          validator: val => /1\d{10}/.test(val),
+          validator: this.validatePhone,
           message: this.$t('incorrectPhone'),
         },
       ],
@@ -76,6 +76,10 @@ export default {
   },
 
   methods: {
+    validatePhone(val) {
+      return /1\d{10}/.test(val);
+    },
+
     validateCode(val) {
       return new Promise(resolve => {
         this.$toast.loading(this.$t('validating'));