mirror of
				https://gitee.com/vant-contrib/vant.git
				synced 2025-11-04 12:52:08 +08:00 
			
		
		
		
	Merge branch 'dev'
This commit is contained in:
		
						commit
						9e8274309a
					
				@ -9,7 +9,6 @@ function buildVantEntry() {
 | 
			
		||||
  const uninstallComponents = [
 | 
			
		||||
    'Lazyload',
 | 
			
		||||
    'Waterfall',
 | 
			
		||||
    'Dialog',
 | 
			
		||||
    'Toast',
 | 
			
		||||
    'ImagePreview',
 | 
			
		||||
    'Locale'
 | 
			
		||||
 | 
			
		||||
@ -31,6 +31,8 @@ Vue.component('demo-section', DemoSection);
 | 
			
		||||
 | 
			
		||||
Locale.add({
 | 
			
		||||
  'zh-CN': {
 | 
			
		||||
    add: '增加',
 | 
			
		||||
    decrease: '减少',
 | 
			
		||||
    red: '红色',
 | 
			
		||||
    orange: '橙色',
 | 
			
		||||
    yellow: '黄色',
 | 
			
		||||
@ -45,13 +47,19 @@ Locale.add({
 | 
			
		||||
    search: '搜索',
 | 
			
		||||
    content: '内容',
 | 
			
		||||
    custom: '自定义',
 | 
			
		||||
    username: '用户名',
 | 
			
		||||
    password: '密码',
 | 
			
		||||
    loading: '加载状态',
 | 
			
		||||
    disabled: '禁用状态',
 | 
			
		||||
    uneditable: '不可编辑',
 | 
			
		||||
    basicUsage: '基础用法',
 | 
			
		||||
    advancedUsage: '高级用法'
 | 
			
		||||
    advancedUsage: '高级用法',
 | 
			
		||||
    usernamePlaceholder: '请输入用户名',
 | 
			
		||||
    passwordPlaceholder: '请输入密码'
 | 
			
		||||
  },
 | 
			
		||||
  'en-US': {
 | 
			
		||||
    add: 'Add',
 | 
			
		||||
    decrease: 'Decrease',
 | 
			
		||||
    red: 'Red',
 | 
			
		||||
    orange: 'Orange',
 | 
			
		||||
    yellow: 'Yellow',
 | 
			
		||||
@ -66,10 +74,14 @@ Locale.add({
 | 
			
		||||
    search: 'Search',
 | 
			
		||||
    content: 'Content',
 | 
			
		||||
    custom: 'Custom',
 | 
			
		||||
    username: 'Username',
 | 
			
		||||
    password: 'Password',
 | 
			
		||||
    loading: 'Loading',
 | 
			
		||||
    disabled: 'Disabled',
 | 
			
		||||
    uneditable: 'Uneditable',
 | 
			
		||||
    basicUsage: 'Basic Usage',
 | 
			
		||||
    advancedUsage: 'Advanced Usage'
 | 
			
		||||
    advancedUsage: 'Advanced Usage',
 | 
			
		||||
    usernamePlaceholder: 'Username',
 | 
			
		||||
    passwordPlaceholder: 'Password'
 | 
			
		||||
  }
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
@ -31,6 +31,7 @@ export default {
 | 
			
		||||
  'cell-swipe': asyncWrapper(r => require.ensure([], () => r(componentWrapper(require('./views/cell-swipe'), 'cell-swipe')), 'cell-swipe')),
 | 
			
		||||
  'cell': asyncWrapper(r => require.ensure([], () => r(componentWrapper(require('./views/cell'), 'cell')), 'cell')),
 | 
			
		||||
  'checkbox': asyncWrapper(r => require.ensure([], () => r(componentWrapper(require('./views/checkbox'), 'checkbox')), 'checkbox')),
 | 
			
		||||
  'circle': asyncWrapper(r => require.ensure([], () => r(componentWrapper(require('./views/circle'), 'circle')), 'circle')),
 | 
			
		||||
  'contact': asyncWrapper(r => require.ensure([], () => r(componentWrapper(require('./views/contact'), 'contact')), 'contact')),
 | 
			
		||||
  'coupon': asyncWrapper(r => require.ensure([], () => r(componentWrapper(require('./views/coupon'), 'coupon')), 'coupon')),
 | 
			
		||||
  'datetime-picker': asyncWrapper(r => require.ensure([], () => r(componentWrapper(require('./views/datetime-picker'), 'datetime-picker')), 'datetime-picker')),
 | 
			
		||||
 | 
			
		||||
@ -366,7 +366,7 @@ export default {
 | 
			
		||||
          extend: null,
 | 
			
		||||
          kdt_id: 55,
 | 
			
		||||
          discount_price: 0,
 | 
			
		||||
          stock_num: 6,
 | 
			
		||||
          stock_num: 4,
 | 
			
		||||
          stock_mode: 0,
 | 
			
		||||
          is_sell: null,
 | 
			
		||||
          combin_sku: false,
 | 
			
		||||
@ -506,7 +506,7 @@ export default {
 | 
			
		||||
    alias: '2oml0r0n5vytj',
 | 
			
		||||
    quota: 15,
 | 
			
		||||
    is_virtual: '0',
 | 
			
		||||
    quota_used: 0,
 | 
			
		||||
    quota_used: 1,
 | 
			
		||||
    goods_info: {
 | 
			
		||||
      title: 'Goods Name',
 | 
			
		||||
      picture: 'https://img.yzcdn.cn/upload_files/2017/03/16/Fs_OMbSFPa183sBwvG_94llUYiLa.jpeg?imageView2/2/w/100/h/100/q/75/format/jpg',
 | 
			
		||||
 | 
			
		||||
@ -92,6 +92,10 @@ export default {
 | 
			
		||||
    &--normal {
 | 
			
		||||
      margin-right: 10px;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .van-loading {
 | 
			
		||||
      margin: 0 18px;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  .van-doc-demo-block {
 | 
			
		||||
 | 
			
		||||
@ -1,7 +1,7 @@
 | 
			
		||||
<template>
 | 
			
		||||
  <div>
 | 
			
		||||
    <van-notice-bar>{{ $t('tips') }}</van-notice-bar>
 | 
			
		||||
    <demo-section>
 | 
			
		||||
      <van-notice-bar>{{ $t('tips') }}</van-notice-bar>
 | 
			
		||||
      <demo-block :title="$t('basicUsage')">
 | 
			
		||||
        <van-cell-swipe :right-width="65" :left-width="65">
 | 
			
		||||
          <span slot="left">{{ $t('button1') }}</span>
 | 
			
		||||
 | 
			
		||||
@ -65,8 +65,6 @@ export default {
 | 
			
		||||
 | 
			
		||||
<style lang="postcss">
 | 
			
		||||
.demo-checkbox {
 | 
			
		||||
  background: #fff;
 | 
			
		||||
 | 
			
		||||
  .van-checkbox {
 | 
			
		||||
    margin: 10px 0 0 20px;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										78
									
								
								docs/demos/views/circle.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										78
									
								
								docs/demos/views/circle.vue
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,78 @@
 | 
			
		||||
<template>
 | 
			
		||||
  <demo-section>
 | 
			
		||||
    <demo-block :title="$t('basicUsage')">
 | 
			
		||||
      <van-circle
 | 
			
		||||
        v-model="currentRate1"
 | 
			
		||||
        :rate="rate"
 | 
			
		||||
        :speed="100"
 | 
			
		||||
        size="120px"
 | 
			
		||||
        :text="currentRate1.toFixed(0) + '%'"
 | 
			
		||||
      />
 | 
			
		||||
      <van-circle
 | 
			
		||||
        v-model="currentRate2"
 | 
			
		||||
        color="#13ce66"
 | 
			
		||||
        fill="#fff"
 | 
			
		||||
        :rate="rate"
 | 
			
		||||
        size="120px"
 | 
			
		||||
        layer-color="#eee"
 | 
			
		||||
        :speed="100"
 | 
			
		||||
        :stroke-width="60"
 | 
			
		||||
        :clockwise="false"
 | 
			
		||||
        :text="currentRate2.toFixed(0) + '%'"
 | 
			
		||||
      />
 | 
			
		||||
      <div>
 | 
			
		||||
        <van-button :text="$t('add')" type="primary" size="small" @click="add" />
 | 
			
		||||
        <van-button :text="$t('decrease')" type="danger" size="small" @click="reduce" />
 | 
			
		||||
      </div>
 | 
			
		||||
    </demo-block>
 | 
			
		||||
  </demo-section>
 | 
			
		||||
</template>
 | 
			
		||||
 | 
			
		||||
<script>
 | 
			
		||||
const format = rate => Math.min(Math.max(rate, 0), 100);
 | 
			
		||||
 | 
			
		||||
export default {
 | 
			
		||||
  i18n: {
 | 
			
		||||
    'zh-CN': {
 | 
			
		||||
      title2: '样式定制'
 | 
			
		||||
    },
 | 
			
		||||
    'en-US': {
 | 
			
		||||
      title2: 'Custom Style'
 | 
			
		||||
    }
 | 
			
		||||
  },
 | 
			
		||||
 | 
			
		||||
  data() {
 | 
			
		||||
    return {
 | 
			
		||||
      rate: 30,
 | 
			
		||||
      currentRate1: 0,
 | 
			
		||||
      currentRate2: 0
 | 
			
		||||
    };
 | 
			
		||||
  },
 | 
			
		||||
 | 
			
		||||
  methods: {
 | 
			
		||||
    add() {
 | 
			
		||||
      this.rate = format(this.rate + 20);
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    reduce() {
 | 
			
		||||
      this.rate = format(this.rate - 20);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
</script>
 | 
			
		||||
 | 
			
		||||
<style lang="postcss">
 | 
			
		||||
.demo-circle {
 | 
			
		||||
  .van-circle {
 | 
			
		||||
    margin-left: 15px;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  .van-button {
 | 
			
		||||
    margin: 15px 0 0 10px;
 | 
			
		||||
 | 
			
		||||
    &:first-of-type {
 | 
			
		||||
      margin-left: 15px;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
</style>
 | 
			
		||||
@ -8,6 +8,26 @@
 | 
			
		||||
    <demo-block :title="$t('title2')">
 | 
			
		||||
      <van-button @click="onClickConfirm">Confirm</van-button>
 | 
			
		||||
    </demo-block>
 | 
			
		||||
 | 
			
		||||
    <demo-block :title="$t('advancedUsage')">
 | 
			
		||||
      <van-button @click="show = true">{{ $t('advancedUsage') }}</van-button>
 | 
			
		||||
      <van-dialog
 | 
			
		||||
        v-model="show"
 | 
			
		||||
        @confirm="show = false"
 | 
			
		||||
      >
 | 
			
		||||
        <van-field
 | 
			
		||||
          v-model="username"
 | 
			
		||||
          :label="$t('username')"
 | 
			
		||||
          :placeholder="$t('usernamePlaceholder')"
 | 
			
		||||
        />
 | 
			
		||||
        <van-field
 | 
			
		||||
          v-model="password"
 | 
			
		||||
          type="password"
 | 
			
		||||
          :label="$t('password')"
 | 
			
		||||
          :placeholder="$t('passwordPlaceholder')"
 | 
			
		||||
        />
 | 
			
		||||
      </van-dialog>
 | 
			
		||||
    </demo-block>
 | 
			
		||||
  </demo-section>
 | 
			
		||||
</template>
 | 
			
		||||
 | 
			
		||||
@ -26,6 +46,14 @@ export default {
 | 
			
		||||
    }
 | 
			
		||||
  },
 | 
			
		||||
 | 
			
		||||
  data() {
 | 
			
		||||
    return {
 | 
			
		||||
      show: false,
 | 
			
		||||
      username: '',
 | 
			
		||||
      password: ''
 | 
			
		||||
    };
 | 
			
		||||
  },
 | 
			
		||||
 | 
			
		||||
  methods: {
 | 
			
		||||
    onClickAlert() {
 | 
			
		||||
      Dialog.alert({
 | 
			
		||||
@ -52,7 +80,7 @@ export default {
 | 
			
		||||
 | 
			
		||||
<style lang="postcss">
 | 
			
		||||
.demo-dialog {
 | 
			
		||||
  .van-button {
 | 
			
		||||
  .van-doc-demo-block > .van-button {
 | 
			
		||||
    margin: 15px;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -68,13 +68,9 @@ export default {
 | 
			
		||||
      title3: '禁用输入框',
 | 
			
		||||
      title4: '错误提示',
 | 
			
		||||
      title5: '高度自适应',
 | 
			
		||||
      username: '用户名',
 | 
			
		||||
      password: '密码',
 | 
			
		||||
      message: '留言',
 | 
			
		||||
      phone: '手机号',
 | 
			
		||||
      phonePlaceholder: '请输入手机号',
 | 
			
		||||
      usernamePlaceholder: '请输入用户名',
 | 
			
		||||
      passwordPlaceholder: '请输入密码',
 | 
			
		||||
      messagePlaceholder: '请输入留言',
 | 
			
		||||
      inputDisabled: '输入框已禁用',
 | 
			
		||||
      phoneError: '手机号格式错误'
 | 
			
		||||
@ -84,13 +80,9 @@ export default {
 | 
			
		||||
      title3: 'Disabled',
 | 
			
		||||
      title4: 'Error info',
 | 
			
		||||
      title5: 'Auto resize',
 | 
			
		||||
      username: 'Username',
 | 
			
		||||
      password: 'Password',
 | 
			
		||||
      message: 'Message',
 | 
			
		||||
      phone: 'Phone',
 | 
			
		||||
      phonePlaceholder: 'Phone',
 | 
			
		||||
      usernamePlaceholder: 'Username',
 | 
			
		||||
      passwordPlaceholder: 'Password',
 | 
			
		||||
      messagePlaceholder: 'Message',
 | 
			
		||||
      inputDisabled: 'Disabled',
 | 
			
		||||
      phoneError: 'Invalid phone'
 | 
			
		||||
 | 
			
		||||
@ -1,18 +1,18 @@
 | 
			
		||||
<template>
 | 
			
		||||
  <demo-section>
 | 
			
		||||
    <demo-block :title="$t('title1')">
 | 
			
		||||
      <van-loading type="circle" color="black" />
 | 
			
		||||
      <van-loading type="circle" color="white" />
 | 
			
		||||
      <van-loading color="black" />
 | 
			
		||||
      <van-loading color="white" />
 | 
			
		||||
    </demo-block>
 | 
			
		||||
 | 
			
		||||
    <demo-block :title="$t('title2')">
 | 
			
		||||
      <van-loading type="gradient-circle" color="black" />
 | 
			
		||||
      <van-loading type="gradient-circle" color="white" />
 | 
			
		||||
      <van-loading type="spinner" color="black" />
 | 
			
		||||
      <van-loading type="spinner" color="white" />
 | 
			
		||||
    </demo-block>
 | 
			
		||||
 | 
			
		||||
    <demo-block :title="$t('title3')">
 | 
			
		||||
      <van-loading type="spinner" color="black" />
 | 
			
		||||
      <van-loading type="spinner" color="white" />
 | 
			
		||||
      <van-loading type="circle" color="black" />
 | 
			
		||||
      <van-loading type="circle" color="white" />
 | 
			
		||||
    </demo-block>
 | 
			
		||||
  </demo-section>
 | 
			
		||||
</template>
 | 
			
		||||
@ -21,14 +21,14 @@
 | 
			
		||||
export default {
 | 
			
		||||
  i18n: {
 | 
			
		||||
    'zh-CN': {
 | 
			
		||||
      title1: '单色圆环',
 | 
			
		||||
      title2: '渐变色圆环',
 | 
			
		||||
      title3: 'Spinner'
 | 
			
		||||
      title1: 'Circular',
 | 
			
		||||
      title2: 'Spinner',
 | 
			
		||||
      title3: 'Circle'
 | 
			
		||||
    },
 | 
			
		||||
    'en-US': {
 | 
			
		||||
      title1: 'Solid Circle',
 | 
			
		||||
      title2: 'Gradient Circle',
 | 
			
		||||
      title3: 'Spinner'
 | 
			
		||||
      title1: 'Circular',
 | 
			
		||||
      title2: 'Spinner',
 | 
			
		||||
      title3: 'Circle'
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
@ -38,7 +38,13 @@ export default {
 | 
			
		||||
.demo-loading {
 | 
			
		||||
  .van-loading {
 | 
			
		||||
    display: inline-block;
 | 
			
		||||
    margin: 10px 0 10px 20px;
 | 
			
		||||
    margin: 5px 0 5px 20px;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  .van-loading--white {
 | 
			
		||||
    padding: 10px;
 | 
			
		||||
    border-radius: 3px;
 | 
			
		||||
    background-color: rgba(0, 0, 0, .5);
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
</style>
 | 
			
		||||
 | 
			
		||||
@ -21,6 +21,10 @@
 | 
			
		||||
    <demo-block :title="$t('title4')">
 | 
			
		||||
      <van-picker :columns="columns" @change="onChange2" />
 | 
			
		||||
    </demo-block>
 | 
			
		||||
 | 
			
		||||
    <demo-block :title="$t('loading')">
 | 
			
		||||
      <van-picker :columns="columns" loading />
 | 
			
		||||
    </demo-block>
 | 
			
		||||
  </demo-section>
 | 
			
		||||
</template>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -1,21 +1,23 @@
 | 
			
		||||
<template>
 | 
			
		||||
  <van-pull-refresh v-model="isLoading">
 | 
			
		||||
    <demo-section name="pull-refresh" background="#fff">
 | 
			
		||||
  <demo-section name="pull-refresh">
 | 
			
		||||
    <van-pull-refresh v-model="isLoading" @refresh="onRefresh">
 | 
			
		||||
      <demo-block :title="$t('basicUsage')">
 | 
			
		||||
        <p>{{ $t('text') }}: {{ count }}</p>
 | 
			
		||||
      </demo-block>
 | 
			
		||||
    </demo-section>
 | 
			
		||||
    </van-pull-refresh>
 | 
			
		||||
  </demo-section>
 | 
			
		||||
</template>
 | 
			
		||||
 | 
			
		||||
<script>
 | 
			
		||||
export default {
 | 
			
		||||
  i18n: {
 | 
			
		||||
    'zh-CN': {
 | 
			
		||||
      text: '刷新次数'
 | 
			
		||||
      text: '刷新次数',
 | 
			
		||||
      success: '刷新成功'
 | 
			
		||||
    },
 | 
			
		||||
    'en-US': {
 | 
			
		||||
      text: 'Refresh Count'
 | 
			
		||||
      text: 'Refresh Count',
 | 
			
		||||
      success: 'Refresh success'
 | 
			
		||||
    }
 | 
			
		||||
  },
 | 
			
		||||
 | 
			
		||||
@ -26,22 +28,27 @@ export default {
 | 
			
		||||
    };
 | 
			
		||||
  },
 | 
			
		||||
 | 
			
		||||
  watch: {
 | 
			
		||||
    isLoading() {
 | 
			
		||||
      if (this.isLoading) {
 | 
			
		||||
  methods: {
 | 
			
		||||
    onRefresh() {
 | 
			
		||||
      setTimeout(() => {
 | 
			
		||||
          Toast('刷新成功');
 | 
			
		||||
        Toast(this.$t('success'));
 | 
			
		||||
        this.isLoading = false;
 | 
			
		||||
        this.count++;
 | 
			
		||||
      }, 500);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
</script>
 | 
			
		||||
 | 
			
		||||
<style lang="postcss">
 | 
			
		||||
.demo-pull-refresh {
 | 
			
		||||
  .van-pull-refresh {
 | 
			
		||||
    &,
 | 
			
		||||
    &__track {
 | 
			
		||||
      height: 100%;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  p {
 | 
			
		||||
    margin: 10px 0 0 15px;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
@ -66,8 +66,6 @@ export default {
 | 
			
		||||
 | 
			
		||||
<style lang="postcss">
 | 
			
		||||
.demo-radio {
 | 
			
		||||
  background: #fff;
 | 
			
		||||
 | 
			
		||||
  .van-radios {
 | 
			
		||||
    padding: 0 20px;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -11,18 +11,38 @@
 | 
			
		||||
          :quota="$t('sku').quota"
 | 
			
		||||
          :quota-used="$t('sku').quota_used"
 | 
			
		||||
          :reset-stepper-on-hide="true"
 | 
			
		||||
          :reset-selected-sku-on-hide="true"
 | 
			
		||||
          :disable-stepper-input="true"
 | 
			
		||||
          @buy-clicked="handleBuyClicked"
 | 
			
		||||
          @add-cart="handleAddCartClicked"
 | 
			
		||||
          :message-config="messageConfig"
 | 
			
		||||
          @buy-clicked="onBuyClicked"
 | 
			
		||||
          @add-cart="onAddCartClicked"
 | 
			
		||||
        />
 | 
			
		||||
        <van-button type="primary" @click="showBase = true" block>{{ $t('basicUsage') }}</van-button>
 | 
			
		||||
      </div>
 | 
			
		||||
    </demo-block>
 | 
			
		||||
 | 
			
		||||
    <demo-block :title="$t('title2')">
 | 
			
		||||
      <div class="sku-container">
 | 
			
		||||
        <van-sku
 | 
			
		||||
          v-model="showStepper"
 | 
			
		||||
          :sku="$t('sku').sku"
 | 
			
		||||
          :goods="$t('sku').goods_info"
 | 
			
		||||
          :goods-id="$t('sku').goods_id"
 | 
			
		||||
          :hide-stock="$t('sku').sku.hide_stock"
 | 
			
		||||
          :quota="$t('sku').quota"
 | 
			
		||||
          :quota-used="$t('sku').quota_used"
 | 
			
		||||
          :custom-stepper-config="customStepperConfig"
 | 
			
		||||
          @buy-clicked="onBuyClicked"
 | 
			
		||||
          @add-cart="onAddCartClicked"
 | 
			
		||||
        />
 | 
			
		||||
        <van-button type="primary" @click="showStepper = true" block>{{ $t('title2') }}</van-button>
 | 
			
		||||
      </div>
 | 
			
		||||
    </demo-block>
 | 
			
		||||
 | 
			
		||||
    <demo-block :title="$t('advancedUsage')">
 | 
			
		||||
      <div class="sku-container">
 | 
			
		||||
        <van-sku
 | 
			
		||||
          v-model="showCustomAction"
 | 
			
		||||
          v-model="showCustom"
 | 
			
		||||
          :stepper-title="$t('stepperTitle')"
 | 
			
		||||
          :sku="$t('sku').sku"
 | 
			
		||||
          :goods="$t('sku').goods_info"
 | 
			
		||||
@ -33,18 +53,17 @@
 | 
			
		||||
          :quota-used="$t('sku').quota_used"
 | 
			
		||||
          :reset-stepper-on-hide="true"
 | 
			
		||||
          :initial-sku="initialSku"
 | 
			
		||||
          @buy-clicked="handleBuyClicked"
 | 
			
		||||
          @add-cart="handleAddCartClicked"
 | 
			
		||||
          @buy-clicked="onBuyClicked"
 | 
			
		||||
          @add-cart="onAddCartClicked"
 | 
			
		||||
        >
 | 
			
		||||
          <template slot="sku-messages" />
 | 
			
		||||
          <template slot="sku-actions" slot-scope="props">
 | 
			
		||||
            <div class="van-sku-actions">
 | 
			
		||||
              <van-button bottom-action @click="handlePointClicked">{{ $t('button1') }}</van-button>
 | 
			
		||||
              <van-button bottom-action @click="onPointClicked">{{ $t('button1') }}</van-button>
 | 
			
		||||
              <van-button type="primary" bottom-action @click="props.skuEventBus.$emit('sku:buy')">{{ $t('button2') }}</van-button>
 | 
			
		||||
            </div>
 | 
			
		||||
          </template>
 | 
			
		||||
        </van-sku>
 | 
			
		||||
        <van-button type="primary" @click="showCustomAction = true" block>{{ $t('advancedUsage') }}</van-button>
 | 
			
		||||
        <van-button type="primary" @click="showCustom = true" block>{{ $t('advancedUsage') }}</van-button>
 | 
			
		||||
      </div>
 | 
			
		||||
    </demo-block>
 | 
			
		||||
  </demo-section>
 | 
			
		||||
@ -52,17 +71,20 @@
 | 
			
		||||
 | 
			
		||||
<script>
 | 
			
		||||
import data from '../mock/sku';
 | 
			
		||||
import { LIMIT_TYPE } from '../../../packages/sku/constants';
 | 
			
		||||
 | 
			
		||||
export default {
 | 
			
		||||
  i18n: {
 | 
			
		||||
    'zh-CN': {
 | 
			
		||||
      sku: data['zh-CN'],
 | 
			
		||||
      title2: '自定义步进器相关配置',
 | 
			
		||||
      stepperTitle: '我要买',
 | 
			
		||||
      button1: '积分兑换',
 | 
			
		||||
      button2: '买买买'
 | 
			
		||||
    },
 | 
			
		||||
    'en-US': {
 | 
			
		||||
      sku: data['en-US'],
 | 
			
		||||
      title2: 'Custom Stepper Related Config',
 | 
			
		||||
      stepperTitle: 'Stepper title',
 | 
			
		||||
      button1: 'Button',
 | 
			
		||||
      button2: 'Button'
 | 
			
		||||
@ -72,22 +94,49 @@ export default {
 | 
			
		||||
  data() {
 | 
			
		||||
    return {
 | 
			
		||||
      showBase: false,
 | 
			
		||||
      showCustomAction: false,
 | 
			
		||||
      showCustom: false,
 | 
			
		||||
      showStepper: false,
 | 
			
		||||
      initialSku: {
 | 
			
		||||
        s1: '30349',
 | 
			
		||||
        s2: '1193'
 | 
			
		||||
      },
 | 
			
		||||
      customStepperConfig: {
 | 
			
		||||
        quotaText: '单次限购100件',
 | 
			
		||||
        handleOverLimit: (data) => {
 | 
			
		||||
          const { action, limitType, quota } = data;
 | 
			
		||||
 | 
			
		||||
          if (action === 'minus') {
 | 
			
		||||
            Toast('至少选择一件商品');
 | 
			
		||||
          } else if (action === 'plus') {
 | 
			
		||||
            if (limitType === LIMIT_TYPE.QUOTA_LIMIT) {
 | 
			
		||||
              Toast(`限购${quota}件`);
 | 
			
		||||
            } else {
 | 
			
		||||
              Toast('库存不够了~~');
 | 
			
		||||
            }
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
      },
 | 
			
		||||
      messageConfig: {
 | 
			
		||||
        uploadImg: () => {
 | 
			
		||||
          return new Promise((resolve) => {
 | 
			
		||||
            setTimeout(() => resolve('https://img.yzcdn.cn/upload_files/2017/02/21/FjKTOxjVgnUuPmHJRdunvYky9OHP.jpg!100x100.jpg'), 1000);
 | 
			
		||||
          });
 | 
			
		||||
        },
 | 
			
		||||
        uploadMaxSize: 3
 | 
			
		||||
      }
 | 
			
		||||
    };
 | 
			
		||||
  },
 | 
			
		||||
 | 
			
		||||
  methods: {
 | 
			
		||||
    handleBuyClicked(data) {
 | 
			
		||||
    onBuyClicked(data) {
 | 
			
		||||
      Toast(JSON.stringify(data));
 | 
			
		||||
    },
 | 
			
		||||
    handleAddCartClicked(data) {
 | 
			
		||||
 | 
			
		||||
    onAddCartClicked(data) {
 | 
			
		||||
      Toast(JSON.stringify(data));
 | 
			
		||||
    },
 | 
			
		||||
    handlePointClicked() {
 | 
			
		||||
 | 
			
		||||
    onPointClicked() {
 | 
			
		||||
      Toast('积分兑换');
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
@ -47,6 +47,17 @@
 | 
			
		||||
        </van-tab>
 | 
			
		||||
      </van-tabs>
 | 
			
		||||
    </demo-block>
 | 
			
		||||
 | 
			
		||||
    <demo-block :title="$t('title7')">
 | 
			
		||||
      <van-tabs :active="active">
 | 
			
		||||
        <van-tab v-for="index in 2" :key="index">
 | 
			
		||||
          <div slot="title">
 | 
			
		||||
            <van-icon name="more-o" />{{ $t('tab') }}
 | 
			
		||||
          </div>
 | 
			
		||||
          {{ $t('content') }} {{ index }}
 | 
			
		||||
        </van-tab>
 | 
			
		||||
      </van-tabs>
 | 
			
		||||
    </demo-block>
 | 
			
		||||
  </demo-section>
 | 
			
		||||
</template>
 | 
			
		||||
 | 
			
		||||
@ -59,7 +70,8 @@ export default {
 | 
			
		||||
      title3: '禁用标签',
 | 
			
		||||
      title4: '样式风格',
 | 
			
		||||
      title5: '点击事件',
 | 
			
		||||
      title6: '粘性布局'
 | 
			
		||||
      title6: '粘性布局',
 | 
			
		||||
      title7: '自定义标签'
 | 
			
		||||
    },
 | 
			
		||||
    'en-US': {
 | 
			
		||||
      tab: 'Tab ',
 | 
			
		||||
@ -68,7 +80,8 @@ export default {
 | 
			
		||||
      title3: 'Disabled Tab',
 | 
			
		||||
      title4: 'Card Style',
 | 
			
		||||
      title5: 'Click Event',
 | 
			
		||||
      title6: 'Sticky'
 | 
			
		||||
      title6: 'Sticky',
 | 
			
		||||
      title7: 'Custom Tab'
 | 
			
		||||
    }
 | 
			
		||||
  },
 | 
			
		||||
 | 
			
		||||
@ -79,12 +92,6 @@ export default {
 | 
			
		||||
    };
 | 
			
		||||
  },
 | 
			
		||||
 | 
			
		||||
  mounted() {
 | 
			
		||||
    setTimeout(() => {
 | 
			
		||||
      this.active = 3;
 | 
			
		||||
    }, 1000);
 | 
			
		||||
  },
 | 
			
		||||
 | 
			
		||||
  methods: {
 | 
			
		||||
    onClickDisabled() {
 | 
			
		||||
      Toast('Disabled!');
 | 
			
		||||
@ -101,6 +108,11 @@ export default {
 | 
			
		||||
.demo-tab {
 | 
			
		||||
  margin-bottom: 700px;
 | 
			
		||||
 | 
			
		||||
  .van-tab .van-icon {
 | 
			
		||||
    margin-right: 5px;
 | 
			
		||||
    vertical-align: -2px;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  .van-tab__pane {
 | 
			
		||||
    background-color: #fff;
 | 
			
		||||
    padding: 20px;
 | 
			
		||||
 | 
			
		||||
@ -23,6 +23,7 @@
 | 
			
		||||
export default {
 | 
			
		||||
  i18n: {
 | 
			
		||||
    'zh-CN': {
 | 
			
		||||
      loading: '加载中',
 | 
			
		||||
      title1: '文字提示',
 | 
			
		||||
      title2: '加载提示',
 | 
			
		||||
      title3: '成功/失败提示',
 | 
			
		||||
@ -52,7 +53,7 @@ export default {
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    showLoadingToast() {
 | 
			
		||||
      Toast.loading({ mask: true });
 | 
			
		||||
      Toast.loading({ mask: true, message: this.$t('loading') + '...' });
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    showSuccessToast() {
 | 
			
		||||
 | 
			
		||||
@ -2,7 +2,7 @@
 | 
			
		||||
  <demo-section>
 | 
			
		||||
    <demo-block :title="$t('basicUsage')">
 | 
			
		||||
      <div class="demo-uploader-container">
 | 
			
		||||
        <van-uploader :after-read="logContent">
 | 
			
		||||
        <van-uploader :max-size="102400" @oversize="logContent('oversize')">
 | 
			
		||||
          <van-icon name="photograph" />
 | 
			
		||||
        </van-uploader>
 | 
			
		||||
      </div>
 | 
			
		||||
@ -10,7 +10,7 @@
 | 
			
		||||
 | 
			
		||||
    <demo-block :title="$t('title2')">
 | 
			
		||||
      <div class="demo-uploader-container">
 | 
			
		||||
        <van-uploader :after-read="logContent" accept="image/gif, image/jpeg" multiple>
 | 
			
		||||
        <van-uploader accept="image/gif, image/jpeg" multiple :max-size="36000" @oversize="logContent">
 | 
			
		||||
          <van-icon name="photograph" />
 | 
			
		||||
        </van-uploader>
 | 
			
		||||
      </div>
 | 
			
		||||
 | 
			
		||||
@ -61,6 +61,7 @@ Actionsheet will get another style if there is a `title` prop.
 | 
			
		||||
| cancel-text | Text of cancel button | `String` | - | - |
 | 
			
		||||
| overlay | Whether to show overlay | `Boolean` | - | - |
 | 
			
		||||
| close-on-click-overlay | Whether to close when click overlay | `Boolean` | - | - |
 | 
			
		||||
| get-container | Return the mount node for actionsheet | `Function` | - | `() => HTMLElement` |
 | 
			
		||||
 | 
			
		||||
### Data struct of actions
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -77,6 +77,12 @@ export default {
 | 
			
		||||
| delete | Triggered when click delete | content:Form content |
 | 
			
		||||
| change-detail | Triggered when address detail changed | value: address detail |
 | 
			
		||||
 | 
			
		||||
### Slot
 | 
			
		||||
 | 
			
		||||
| Name | Description |
 | 
			
		||||
|-----------|-----------|
 | 
			
		||||
| - | Custom content below postal |
 | 
			
		||||
 | 
			
		||||
### Data Structure
 | 
			
		||||
 | 
			
		||||
#### addressInfo Data Structure
 | 
			
		||||
 | 
			
		||||
@ -44,6 +44,9 @@ Set `columns-num` with 2, you'll have a 2 level picker.
 | 
			
		||||
| title | Toolbar title | `String` | `''` | - |
 | 
			
		||||
| area-list | an object contains these properties: `province_list`, `city_list` and `county_list`  | `Object` | - | - |
 | 
			
		||||
| columns-num | level of picker | `String`,`Number` | 3 | - |
 | 
			
		||||
| item-height | Option height | `Number` | `44` | - |
 | 
			
		||||
| loading | Whether to show loading prompt | `Boolean` | `false` | - |
 | 
			
		||||
| visible-item-count | Count of visible columns | `Number` | `5` | - |
 | 
			
		||||
 | 
			
		||||
### Event
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -69,6 +69,7 @@ Use `tag` prop to custom button tag
 | 
			
		||||
|-----------|-----------|-----------|-------------|-------------|
 | 
			
		||||
| type | Type | `String` | `default` | `primary` `danger` |
 | 
			
		||||
| size | Size | `String` | `normal` | `large` `small` `mini` |
 | 
			
		||||
| text | Text | `String` | - | - |
 | 
			
		||||
| tag | Tag | `String` | `button` | - |
 | 
			
		||||
| native-type | Native Type Attribute | `String` | `''` | - |
 | 
			
		||||
| disabled | Whether disable button | `Boolean` | `false` | - |
 | 
			
		||||
 | 
			
		||||
@ -4,8 +4,7 @@
 | 
			
		||||
``` javascript
 | 
			
		||||
import { Cell, CellGroup } from 'vant';
 | 
			
		||||
 | 
			
		||||
Vue.use(Cell);
 | 
			
		||||
Vue.use(CellGroup);
 | 
			
		||||
Vue.use(Cell).use(CellGroup);
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
### Usage
 | 
			
		||||
 | 
			
		||||
@ -1,5 +1,78 @@
 | 
			
		||||
## Changelog
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
### [0.12.8](https://github.com/youzan/vant/tree/v0.12.8)
 | 
			
		||||
`2018-02-07`
 | 
			
		||||
 | 
			
		||||
**Improvements**
 | 
			
		||||
* add Circle component [\#608](https://github.com/youzan/vant/pull/608) [@chenjiahan](https://github.com/chenjiahan)
 | 
			
		||||
* Tab: add title slot [\#603](https://github.com/youzan/vant/pull/603) [@chenjiahan](https://github.com/chenjiahan)
 | 
			
		||||
* Toast: adjust background color [\#601](https://github.com/youzan/vant/pull/601) [@chenjiahan](https://github.com/chenjiahan)
 | 
			
		||||
* Popup: support getContaienr [\#611](https://github.com/youzan/vant/pull/611) [@chenjiahan](https://github.com/chenjiahan)
 | 
			
		||||
* Sku: support imgage upload [\#612](https://github.com/youzan/vant/pull/612) [@w91](https://github.com/w91)
 | 
			
		||||
* Sku: support custom stepper [\#600](https://github.com/youzan/vant/pull/600) [@w91](https://github.com/w91)
 | 
			
		||||
 | 
			
		||||
**Bug Fixes**
 | 
			
		||||
* fix Picker style error in some andriod devices [\#609](https://github.com/youzan/vant/pull/609) [@chenjiahan](https://github.com/chenjiahan)
 | 
			
		||||
* fix TreeSelect arrow position error [\#605](https://github.com/youzan/vant/pull/605) [@chenjiahan](https://github.com/chenjiahan)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
### [0.12.7](https://github.com/youzan/vant/tree/v0.12.7)
 | 
			
		||||
`2018-01-31`
 | 
			
		||||
 | 
			
		||||
**Improvements**
 | 
			
		||||
* Area: add item-height & visible-item-count props [\#591](https://github.com/youzan/vant/pull/591) [@chenjiahan](https://github.com/chenjiahan)
 | 
			
		||||
* Dialog: support component call [\#593](https://github.com/youzan/vant/pull/593) [@chenjiahan](https://github.com/chenjiahan)
 | 
			
		||||
* Toast: support multiple instance [\#586](https://github.com/youzan/vant/pull/586) [@chenjiahan](https://github.com/chenjiahan)
 | 
			
		||||
* Sku: add getSkuData method [\#585](https://github.com/youzan/vant/pull/585) [@chenjiahan](https://github.com/chenjiahan)
 | 
			
		||||
 | 
			
		||||
**Bug Fixes**
 | 
			
		||||
* fix Field multi line label style error [\#583](https://github.com/youzan/vant/pull/583) [@chenjiahan](https://github.com/chenjiahan)
 | 
			
		||||
 | 
			
		||||
### [0.12.6](https://github.com/youzan/vant/tree/v0.12.6)
 | 
			
		||||
`2018-01-25`
 | 
			
		||||
 | 
			
		||||
**Improvements**
 | 
			
		||||
 | 
			
		||||
* AddressEdit: add default slot [\#573](https://github.com/youzan/vant/pull/573) [@chenjiahan](https://github.com/chenjiahan)
 | 
			
		||||
* Uploader: support maxSize prop [\#575](https://github.com/youzan/vant/pull/575) [@chenjiahan](https://github.com/chenjiahan)
 | 
			
		||||
* Sku: add sku-body-top slot and resetSelectedSkuOnHide prop [\#568](https://github.com/youzan/vant/pull/568) [@w91](https://github.com/w91)
 | 
			
		||||
 | 
			
		||||
**Bug Fixes**
 | 
			
		||||
 | 
			
		||||
* fix Sku message error when overlimit [\#568](https://github.com/youzan/vant/pull/568) [@w91](https://github.com/w91)
 | 
			
		||||
* fix Toast work break [\#567](https://github.com/youzan/vant/pull/567) [@chenjiahan](https://github.com/chenjiahan)
 | 
			
		||||
* fix Tab active not work [\#572](https://github.com/youzan/vant/pull/572) [@chenjiahan](https://github.com/chenjiahan)
 | 
			
		||||
 | 
			
		||||
### [0.12.5](https://github.com/youzan/vant/tree/v0.12.5)
 | 
			
		||||
`2018-01-23`
 | 
			
		||||
 | 
			
		||||
**Improvements**
 | 
			
		||||
 | 
			
		||||
* Button: add text prop [\#563](https://github.com/youzan/vant/pull/563) [@chenjiahan](https://github.com/chenjiahan)
 | 
			
		||||
* CouponList: support v-model、exchangeButtonLoading、exchangeMinLength [\#556](https://github.com/youzan/vant/pull/556) [\#566](https://github.com/youzan/vant/pull/566) [@chenjiahan](https://github.com/chenjiahan)
 | 
			
		||||
* Icon: update share icon [\#562](https://github.com/youzan/vant/pull/562) [@chenjiahan](https://github.com/chenjiahan)
 | 
			
		||||
* Sku: improve render performance [\#550](https://github.com/youzan/vant/pull/550) [@chenjiahan](https://github.com/chenjiahan)
 | 
			
		||||
 | 
			
		||||
**Bug Fixes**
 | 
			
		||||
* Area: should not display city & county list when not select province [\#560](https://github.com/youzan/vant/pull/560) [@chenjiahan](https://github.com/chenjiahan)
 | 
			
		||||
* Cell: fix required style [\#553](https://github.com/youzan/vant/pull/553) [@qianzhaoy](https://github.com/qianzhaoy)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
### [0.12.4](https://github.com/youzan/vant/tree/v0.12.4)
 | 
			
		||||
`2018-01-18`
 | 
			
		||||
 | 
			
		||||
**Improvements**
 | 
			
		||||
 | 
			
		||||
* Picker: add props to custom button text [\#548](https://github.com/youzan/vant/pull/548) [@chenjiahan](https://github.com/chenjiahan)
 | 
			
		||||
* Toast: add setDefaultOptions method [\#541](https://github.com/youzan/vant/pull/541) [@chenjiahan](https://github.com/chenjiahan)
 | 
			
		||||
* Dialog: add setDefaultOptions method [\#539](https://github.com/youzan/vant/pull/539) [@chenjiahan](https://github.com/chenjiahan)
 | 
			
		||||
 | 
			
		||||
**Bug Fixes**
 | 
			
		||||
 | 
			
		||||
* Stepper: not fire event on changing the value prop [\#546](https://github.com/youzan/vant/pull/546) [@chuangbo](https://github.com/chuangbo)
 | 
			
		||||
* Picker: fix misspelling of visibleItemCount prop [\#549](https://github.com/youzan/vant/pull/549) [@chenjiahan](https://github.com/chenjiahan)
 | 
			
		||||
 | 
			
		||||
### [0.12.3](https://github.com/youzan/vant/tree/v0.12.3)
 | 
			
		||||
 | 
			
		||||
`2018-01-12`
 | 
			
		||||
 | 
			
		||||
@ -4,8 +4,7 @@
 | 
			
		||||
``` javascript
 | 
			
		||||
import { Checkbox, CheckboxGroup } from 'vant';
 | 
			
		||||
 | 
			
		||||
Vue.use(Checkbox);
 | 
			
		||||
Vue.use(CheckboxGroup);
 | 
			
		||||
Vue.use(Checkbox).use(CheckboxGroup);
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
### Usage
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										69
									
								
								docs/markdown/en-US/circle.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										69
									
								
								docs/markdown/en-US/circle.md
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,69 @@
 | 
			
		||||
## Circle
 | 
			
		||||
 | 
			
		||||
### Install
 | 
			
		||||
``` javascript
 | 
			
		||||
import { Circle } from 'vant';
 | 
			
		||||
 | 
			
		||||
Vue.use(Circle);
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
### Usage
 | 
			
		||||
 | 
			
		||||
#### Basic Usage
 | 
			
		||||
 | 
			
		||||
```html
 | 
			
		||||
<van-circle
 | 
			
		||||
  v-model="currentRate"
 | 
			
		||||
  :rate="30"
 | 
			
		||||
  :speed="100"
 | 
			
		||||
  :text="text"
 | 
			
		||||
/>
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
``` javascript
 | 
			
		||||
export default {
 | 
			
		||||
  data() {
 | 
			
		||||
    return {
 | 
			
		||||
      currentRate: 0
 | 
			
		||||
    };
 | 
			
		||||
  },
 | 
			
		||||
  computed: {
 | 
			
		||||
    text() {
 | 
			
		||||
      return this.currentRate.toFixed(0) + '%'
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
#### Custom style
 | 
			
		||||
 | 
			
		||||
```html
 | 
			
		||||
<van-circle
 | 
			
		||||
  v-model="currentRate"
 | 
			
		||||
  color="#13ce66"
 | 
			
		||||
  fill="#fff"
 | 
			
		||||
  size="120px"
 | 
			
		||||
  layer-color="#eee"
 | 
			
		||||
  :text="text"
 | 
			
		||||
  :rate="rate"
 | 
			
		||||
  :speed="100"
 | 
			
		||||
  :clockwise="false"
 | 
			
		||||
  :stroke-width="60"
 | 
			
		||||
/>
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
### API
 | 
			
		||||
 | 
			
		||||
| Attribute | Description | Type | Default | Accepted Values |
 | 
			
		||||
|-----------|-----------|-----------|-------------|-------------|
 | 
			
		||||
| v-model | Current rate | `Number` | - | - |
 | 
			
		||||
| rate | Target rate | `Number` | `100` | - |
 | 
			
		||||
| size | Circle size | `String` | `100px` | - |
 | 
			
		||||
| color | Progress bar color | `String` | `#38f` | - |
 | 
			
		||||
| layer-color | Layer color | `String` | `#fff` | - |
 | 
			
		||||
| fill | Fill color | `String` | `none` | - |
 | 
			
		||||
| speed | Animate speed(rate/s)| `Number` | - | - |
 | 
			
		||||
| text | Text | `String` | - | - |
 | 
			
		||||
| stroke-width | Stroke width | `Number` | `40` | - |
 | 
			
		||||
| clockwise | Is clockwise | `Boolean` | `true` | - |
 | 
			
		||||
@ -4,9 +4,10 @@
 | 
			
		||||
``` javascript
 | 
			
		||||
import { ContactCard, ContactList, ContactEdit } from 'vant';
 | 
			
		||||
 | 
			
		||||
Vue.use(ContactCard);
 | 
			
		||||
Vue.use(ContactList);
 | 
			
		||||
Vue.use(ContactEdit);
 | 
			
		||||
Vue
 | 
			
		||||
  .use(ContactCard)
 | 
			
		||||
  .use(ContactList)
 | 
			
		||||
  .use(ContactEdit);
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
### Usage
 | 
			
		||||
 | 
			
		||||
@ -4,8 +4,7 @@
 | 
			
		||||
``` javascript
 | 
			
		||||
import { CouponCell, CouponList } from 'vant';
 | 
			
		||||
 | 
			
		||||
Vue.use(CouponCell);
 | 
			
		||||
Vue.use(CouponList);
 | 
			
		||||
Vue.use(CouponCell).use(CouponList);
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
### Usage
 | 
			
		||||
@ -79,11 +78,14 @@ export default {
 | 
			
		||||
 | 
			
		||||
| Attribute | Description | Type | Default | Accepted Values |
 | 
			
		||||
|-----------|-----------|-----------|-------------|-------------|
 | 
			
		||||
| v-model | Current exchange code | `String` | - | - |
 | 
			
		||||
| chosen-coupon | Index of chosen coupon | `Number` | `-1` | - |
 | 
			
		||||
| coupons | Coupon list | `Array` | `[]` | - |
 | 
			
		||||
| disabled-coupons | Disabled voupon list | `Array` | `[]` | - |
 | 
			
		||||
| exchange-button-text | Exchange button text | `String` | `Exchange` | - |
 | 
			
		||||
| exchange-button-loading | Whether to show loading in exchange button | `Boolean` | `false` | - |
 | 
			
		||||
| exchange-button-disabled | Whether to disable exchange button | `Boolean` | `false` | - |
 | 
			
		||||
| exchange-min-length | Min length to enable exchange button | `Number` | `1` | - |
 | 
			
		||||
| displayed-coupon-index | Index of displayed coupon | `Number` | - | - |
 | 
			
		||||
| close-button-text | Close button text | `String` | `Close` | - |
 | 
			
		||||
| disabled-list-title | Disabled list title | `String` | `Unavailable` | - |
 | 
			
		||||
 | 
			
		||||
@ -77,3 +77,64 @@ export default {
 | 
			
		||||
| overlay | Whether to show overlay | `Boolean` | `true` | - |
 | 
			
		||||
| closeOnClickOverlay | Whether to close when click overlay | `Boolean` | `false` | - |
 | 
			
		||||
| lockOnScroll | Whether to lock body scroll | `Boolean` | `true` | - |
 | 
			
		||||
 | 
			
		||||
#### Advanced Usage
 | 
			
		||||
If you need to render vue components within a dialog, you can use dialog component.
 | 
			
		||||
 | 
			
		||||
```html
 | 
			
		||||
<van-dialog v-model="show" @confirm="onConfirm">
 | 
			
		||||
  <van-field
 | 
			
		||||
    v-model="username"
 | 
			
		||||
    label="Username"
 | 
			
		||||
    placeholder="Username"
 | 
			
		||||
  />
 | 
			
		||||
  <van-field
 | 
			
		||||
    v-model="password"
 | 
			
		||||
    type="password"
 | 
			
		||||
    :label="Password"
 | 
			
		||||
    :placeholder="Password"
 | 
			
		||||
  />
 | 
			
		||||
</van-dialog>
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
```js
 | 
			
		||||
Vue.use(Dialog);
 | 
			
		||||
 | 
			
		||||
export default {
 | 
			
		||||
  data() {
 | 
			
		||||
    return {
 | 
			
		||||
      show: false,
 | 
			
		||||
      username: '',
 | 
			
		||||
      password: ''
 | 
			
		||||
    };
 | 
			
		||||
  },
 | 
			
		||||
  
 | 
			
		||||
  methods: {
 | 
			
		||||
    onConfirm() {
 | 
			
		||||
      this.show = false;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
### API
 | 
			
		||||
 | 
			
		||||
| Attribute | Description | Type | Default | Accepted Values |
 | 
			
		||||
|-----------|-----------|-----------|-------------|-------------|
 | 
			
		||||
| v-model | Whether to show dialog | `Boolean` | - | - |
 | 
			
		||||
| title | Title | `String` | - | - |
 | 
			
		||||
| message | Message | `String` | - | - |
 | 
			
		||||
| show-confirm-button | Whether to show confirm button | `Boolean` |  `true` | - |
 | 
			
		||||
| show-cancel-button | Whether to show cancel button | `Boolean` |  `false` | - |
 | 
			
		||||
| confirm-button-text | Confirm button text | `String` |  `Confirm` | - |
 | 
			
		||||
| cancel-button-text | Cancel button test | `String` | `Cancel` | - |
 | 
			
		||||
| overlay | Whether to show overlay | `Boolean` | `true` | - |
 | 
			
		||||
| close-on-click-overlay | Whether to close when click overlay | `Boolean` | `false` | - |
 | 
			
		||||
| lock-on-scroll | Whether to lock body scroll | `Boolean` | `true` | - |
 | 
			
		||||
 | 
			
		||||
### Event
 | 
			
		||||
 | 
			
		||||
| Event | Description | Parameters |
 | 
			
		||||
|-----------|-----------|-----------|
 | 
			
		||||
| confirm | Triggered when click confirm button | - |
 | 
			
		||||
| cancel | Triggered when click cancel button | - |
 | 
			
		||||
@ -8,9 +8,10 @@ import {
 | 
			
		||||
  GoodsActionMiniBtn
 | 
			
		||||
} from 'vant';
 | 
			
		||||
 | 
			
		||||
Vue.use(GoodsAction);
 | 
			
		||||
Vue.use(GoodsActionBigBtn);
 | 
			
		||||
Vue.use(GoodsActionMiniBtn);
 | 
			
		||||
Vue
 | 
			
		||||
  .use(GoodsAction)
 | 
			
		||||
  .use(GoodsActionBigBtn)
 | 
			
		||||
  .use(GoodsActionMiniBtn);
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
### Usage
 | 
			
		||||
 | 
			
		||||
@ -6,8 +6,7 @@ Quickly and easily create layouts with `van-row` and `van-col`
 | 
			
		||||
``` javascript
 | 
			
		||||
import { Row, Col } from 'vant';
 | 
			
		||||
 | 
			
		||||
Vue.use(Row);
 | 
			
		||||
Vue.use(Col);
 | 
			
		||||
Vue.use(Row).use(Col);
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
### Usage
 | 
			
		||||
 | 
			
		||||
@ -9,18 +9,11 @@ Vue.use(Loading);
 | 
			
		||||
 | 
			
		||||
### Usage
 | 
			
		||||
 | 
			
		||||
#### Solid Circle
 | 
			
		||||
#### Circular
 | 
			
		||||
 | 
			
		||||
```html
 | 
			
		||||
<van-loading type="circle" color="black" />
 | 
			
		||||
<van-loading type="circle" color="white" />
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
#### Gradient Circle
 | 
			
		||||
 | 
			
		||||
```html
 | 
			
		||||
<van-loading type="gradient-circle" color="black" />
 | 
			
		||||
<van-loading type="gradient-circle" color="white" />
 | 
			
		||||
<van-loading color="black" />
 | 
			
		||||
<van-loading color="white" />
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
#### Spinner
 | 
			
		||||
@ -30,9 +23,17 @@ Vue.use(Loading);
 | 
			
		||||
<van-loading type="spinner" color="white" />
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
#### Circle
 | 
			
		||||
 | 
			
		||||
```html
 | 
			
		||||
<van-loading type="circle" color="black" />
 | 
			
		||||
<van-loading type="circle" color="white" />
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
### API
 | 
			
		||||
 | 
			
		||||
| Attribute | Description | Type | Default | Accepted Values |
 | 
			
		||||
|-----------|-----------|-----------|-------------|-------------|
 | 
			
		||||
| color | Color | `String` | `black` | `black` `white` |
 | 
			
		||||
| type | Type | `String` | `gradient-circle` | `spinner` `circle` |
 | 
			
		||||
| type | Type | `String` | `circular` | `spinner` `circle` |
 | 
			
		||||
| size | Size | `String` | `30px` | - |
 | 
			
		||||
 | 
			
		||||
@ -5,8 +5,7 @@ The PasswordInput component is usually used with [NumberKeyboard](#/en-US/compon
 | 
			
		||||
``` javascript
 | 
			
		||||
import { PasswordInput, NumberKeyboard } from 'vant';
 | 
			
		||||
 | 
			
		||||
Vue.use(PasswordInput);
 | 
			
		||||
Vue.use(NumberKeyboard);
 | 
			
		||||
Vue.use(PasswordInput).use(NumberKeyboard);
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
### Usage
 | 
			
		||||
 | 
			
		||||
@ -114,6 +114,13 @@ export default {
 | 
			
		||||
};
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
#### Loading
 | 
			
		||||
When Picker columns data is acquired asynchronously, use `loading` prop to show loading prompt
 | 
			
		||||
 | 
			
		||||
```html
 | 
			
		||||
<van-picker :columns="columns" loading />
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
### API
 | 
			
		||||
 | 
			
		||||
| Attribute | Description | Type | Default | Accepted Values |
 | 
			
		||||
@ -121,6 +128,7 @@ export default {
 | 
			
		||||
| columns | Columns data | `Array` | `[]` | - |
 | 
			
		||||
| show-toolbar | Whether to show toolbar | `Boolean` | `false` | - |
 | 
			
		||||
| title | Toolbar title | `String` | `''` | - |
 | 
			
		||||
| loading | Whether to show loading prompt | `Boolean` | `false` | - |
 | 
			
		||||
| confirm-button-text | Text of confirm button | `String` | `Confirm` | - |
 | 
			
		||||
| cancel-button-text | Text of cancel button | `String` | `Cancel` | - |
 | 
			
		||||
| item-height | Option height | `Number` | `44` | - |
 | 
			
		||||
 | 
			
		||||
@ -48,3 +48,4 @@ Use `position` prop to set popup display position
 | 
			
		||||
| close-on-click-overlay | Close popup when click overlay | `Boolean` | `true` | - |
 | 
			
		||||
| transition | Transition | `String` | `popup-slide` | - |
 | 
			
		||||
| prevent-scroll | Prevent background scroll | `Boolean` | `false` | - |
 | 
			
		||||
| get-container | Return the mount node for Popup | `Function` | - | `() => HTMLElement` |
 | 
			
		||||
 | 
			
		||||
@ -9,14 +9,11 @@ Vue.use(PullRefresh);
 | 
			
		||||
 | 
			
		||||
### Usage
 | 
			
		||||
 | 
			
		||||
#### Basic Usage
 | 
			
		||||
The `refresh` event will be triggered when pull refresh, you should set `v-model` to `false` to reset loading status after process refresh event.
 | 
			
		||||
 | 
			
		||||
```html
 | 
			
		||||
<!-- use v-model to control loading status -->
 | 
			
		||||
<van-pull-refresh
 | 
			
		||||
  v-model="isLoading"
 | 
			
		||||
  pulling-text="Pull to refresh..."
 | 
			
		||||
  loosing-text="Loose to refresh..."
 | 
			
		||||
  loading-text="Loading..."
 | 
			
		||||
>
 | 
			
		||||
<van-pull-refresh v-model="isLoading" @refresh="onRefresh">
 | 
			
		||||
  <p>Refresh Count: {{ count }}</p>
 | 
			
		||||
</van-pull-refresh>
 | 
			
		||||
```
 | 
			
		||||
@ -30,17 +27,15 @@ export default {
 | 
			
		||||
    }
 | 
			
		||||
  },
 | 
			
		||||
 | 
			
		||||
  watch: {
 | 
			
		||||
    isLoading() {
 | 
			
		||||
      if (this.isLoading) {
 | 
			
		||||
  methods: {
 | 
			
		||||
    onRefresh() {
 | 
			
		||||
      setTimeout(() => {
 | 
			
		||||
          Toast('Refresh Success');
 | 
			
		||||
        this.$toast('Refresh Success');
 | 
			
		||||
        this.isLoading = false;
 | 
			
		||||
        this.count++;
 | 
			
		||||
      }, 500);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
@ -49,12 +44,19 @@ export default {
 | 
			
		||||
| Attribute | Description | Type | Default | Accepted Values |
 | 
			
		||||
|-----------|-----------|-----------|-------------|-------------|
 | 
			
		||||
| v-model | Loading status | `Boolean` | - | - |
 | 
			
		||||
| pulling-text | Text to show when pulling | `String` | `下拉即可刷新...` | - |
 | 
			
		||||
| loosing-text | Text to show when loosing | `String` | `释放即可刷新...` | - |
 | 
			
		||||
| loading-text | Text to show when loading | `String` | `加载中...` | - |
 | 
			
		||||
| pulling-text | Text to show when pulling | `String` | `Pull to refresh...` | - |
 | 
			
		||||
| loosing-text | Text to show when loosing | `String` | `Loose to refresh...` | - |
 | 
			
		||||
| loading-text | Text to show when loading | `String` | `Loading...` | - |
 | 
			
		||||
| animation-duration | Animation duration | `Number` | `300` | - |
 | 
			
		||||
| head-height | Height of head | `Number` | `50` | - |
 | 
			
		||||
 | 
			
		||||
### Event
 | 
			
		||||
 | 
			
		||||
| Event | Description | Parameters |
 | 
			
		||||
|-----------|-----------|-----------|
 | 
			
		||||
| refresh | Triggered when pull refresh | - |
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
### Slot
 | 
			
		||||
 | 
			
		||||
| name | Description |
 | 
			
		||||
 | 
			
		||||
@ -20,9 +20,28 @@ Vue.use(Sku);
 | 
			
		||||
  :quota="quota"
 | 
			
		||||
  :quota-used="quotaUsed"
 | 
			
		||||
  :reset-stepper-on-hide="resetStepperOnHide"
 | 
			
		||||
  :reset-selected-sku-on-hide="resetSelectedSkuOnHide"
 | 
			
		||||
  :disable-stepper-input="disableStepperInput"
 | 
			
		||||
  @buy-clicked="handleBuyClicked"
 | 
			
		||||
  @add-cart="handleAddCartClicked"
 | 
			
		||||
  :message-config="messageConfig"
 | 
			
		||||
  @buy-clicked="onBuyClicked"
 | 
			
		||||
  @add-cart="onAddCartClicked"
 | 
			
		||||
/>
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
#### Custom Stepper Config
 | 
			
		||||
 | 
			
		||||
```html
 | 
			
		||||
<van-sku
 | 
			
		||||
  v-model="showBase"
 | 
			
		||||
  :sku="sku"
 | 
			
		||||
  :goods="goods"
 | 
			
		||||
  :goods-id="goodsId"
 | 
			
		||||
  :hide-stock="sku.hide_stock"
 | 
			
		||||
  :quota="quota"
 | 
			
		||||
  :quota-used="quotaUsed"
 | 
			
		||||
  :custom-stepper-config="customStepperConfig"
 | 
			
		||||
  @buy-clicked="onBuyClicked"
 | 
			
		||||
  @add-cart="onAddCartClicked"
 | 
			
		||||
/>
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
@ -41,15 +60,13 @@ Vue.use(Sku);
 | 
			
		||||
  :quota-used="quotaUsed"
 | 
			
		||||
  :reset-stepper-on-hide="true"
 | 
			
		||||
  :initial-sku="initialSku"
 | 
			
		||||
  @buy-clicked="handleBuyClicked"
 | 
			
		||||
  @add-cart="handleAddCartClicked"
 | 
			
		||||
  @buy-clicked="onBuyClicked"
 | 
			
		||||
  @add-cart="onAddCartClicked"
 | 
			
		||||
>
 | 
			
		||||
  <!-- hide sku messages -->
 | 
			
		||||
  <template slot="sku-messages"></template>
 | 
			
		||||
  <!-- custom sku actions -->
 | 
			
		||||
  <template slot="sku-actions" slot-scope="props">
 | 
			
		||||
    <div class="van-sku-actions">
 | 
			
		||||
      <van-button bottom-action @click="handlePointClicked">Button</van-button>
 | 
			
		||||
      <van-button bottom-action @click="onPointClicked">Button</van-button>
 | 
			
		||||
      <!-- trigger sku inner event -->
 | 
			
		||||
      <van-button type="primary" bottom-action @click="props.skuEventBus.$emit('sku:buy')">Button</van-button>
 | 
			
		||||
    </div>
 | 
			
		||||
@ -70,8 +87,12 @@ Vue.use(Sku);
 | 
			
		||||
| quota | Quota (0 as no limit) | `Number` | `0` | - |
 | 
			
		||||
| quota-used | Used quota | `Number` | `0` | - |
 | 
			
		||||
| reset-stepper-on-hide | Whether to reset stepper when hide | `Boolean` | `false` | - |
 | 
			
		||||
| reset-selected-sku-on-hide | Whether to reset selected sku when hide | `Boolean` | `false` | - |
 | 
			
		||||
| disable-stepper-input | Whether to disable stepper input | `Boolean` | `false` | - |
 | 
			
		||||
| stepper-title | Quantity title | `String` | `Quantity` | - |
 | 
			
		||||
| custom-stepper-config | Custom stepper related config | `Object` | `{}` | - |
 | 
			
		||||
| message-config | Message related config | `Object` | `{}` | - |
 | 
			
		||||
| get-container | Return the mount node for sku | `Function` | - | `() => HTMLElement` |
 | 
			
		||||
 | 
			
		||||
### Event
 | 
			
		||||
 | 
			
		||||
@ -80,11 +101,18 @@ Vue.use(Sku);
 | 
			
		||||
| add-cart | Triggered when click cart button | data: Object |
 | 
			
		||||
| buy-clicked | Triggered when click buy button | data: Object |
 | 
			
		||||
 | 
			
		||||
### Methods
 | 
			
		||||
 | 
			
		||||
| Method | Description |
 | 
			
		||||
|-----------|-----------|
 | 
			
		||||
| getSkuData() | Get current sku data |
 | 
			
		||||
 | 
			
		||||
### Slot
 | 
			
		||||
 | 
			
		||||
| Name | Description | 
 | 
			
		||||
|-----------|-----------|
 | 
			
		||||
| sku-header | Custom header |
 | 
			
		||||
| sku-body-top | Custom content before sku-group |
 | 
			
		||||
| sku-group | Custom sku |
 | 
			
		||||
| extra-sku-group | Extra custom content |
 | 
			
		||||
| sku-stepper | Custom stepper |
 | 
			
		||||
@ -149,6 +177,52 @@ goods: {
 | 
			
		||||
}
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#### customStepperConfig Data Structure
 | 
			
		||||
```javascript
 | 
			
		||||
customStepperConfig: {
 | 
			
		||||
  // custom quota text
 | 
			
		||||
  quotaText: 'only 5 can buy',
 | 
			
		||||
  // custom callback when over limit
 | 
			
		||||
  handleOverLimit: (data) => {
 | 
			
		||||
    const { action, limitType, quota, quotaUsed } = data;
 | 
			
		||||
 | 
			
		||||
    if (action === 'minus') {
 | 
			
		||||
      Toast('at least select one');
 | 
			
		||||
    } else if (action === 'plus') {
 | 
			
		||||
      // const { LIMIT_TYPE } = Sku.skuConstants;
 | 
			
		||||
      if (limitType === LIMIT_TYPE.QUOTA_LIMIT) {
 | 
			
		||||
        let msg = `Buy up to ${quota}`;
 | 
			
		||||
        if (quotaUsed > 0) msg += `,you already buy ${quotaUsed}`;
 | 
			
		||||
        Toast(msg);
 | 
			
		||||
      } else {
 | 
			
		||||
        Toast('not enough stock');
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
#### messageConfig Data Structure
 | 
			
		||||
```javascript
 | 
			
		||||
messageConfig: {
 | 
			
		||||
  // the upload image callback
 | 
			
		||||
  uploadImg: () => {
 | 
			
		||||
    return new Promise((resolve) => {
 | 
			
		||||
      setTimeout(() => resolve('https://img.yzcdn.cn/upload_files/2017/02/21/FjKTOxjVgnUuPmHJRdunvYky9OHP.jpg!100x100.jpg'), 1000);
 | 
			
		||||
    });
 | 
			
		||||
  },
 | 
			
		||||
  // max file size (MB)
 | 
			
		||||
  uploadMaxSize: 3,
 | 
			
		||||
  // placehold config
 | 
			
		||||
  placeholderMap: {
 | 
			
		||||
    text: 'xxx',
 | 
			
		||||
    tel: 'xxx',
 | 
			
		||||
    ...
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
#### Event Params Data Structure
 | 
			
		||||
 | 
			
		||||
```javascript
 | 
			
		||||
 | 
			
		||||
@ -4,8 +4,7 @@
 | 
			
		||||
``` javascript
 | 
			
		||||
import { Step, Steps } from 'vant';
 | 
			
		||||
 | 
			
		||||
Vue.use(Step);
 | 
			
		||||
Vue.use(Steps);
 | 
			
		||||
Vue.use(Step).use(Steps);
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
### Usage
 | 
			
		||||
 | 
			
		||||
@ -4,8 +4,7 @@
 | 
			
		||||
``` javascript
 | 
			
		||||
import { Swipe, SwipeItem } from 'vant';
 | 
			
		||||
 | 
			
		||||
Vue.use(Swipe);
 | 
			
		||||
Vue.use(SwipeItem);
 | 
			
		||||
Vue.use(Swipe).use(SwipeItem);
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
### Usage
 | 
			
		||||
 | 
			
		||||
@ -4,8 +4,7 @@
 | 
			
		||||
``` javascript
 | 
			
		||||
import { Tab, Tabs } from 'vant';
 | 
			
		||||
 | 
			
		||||
Vue.use(Tab);
 | 
			
		||||
Vue.use(Tabs);
 | 
			
		||||
Vue.use(Tab).use(Tabs);
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
### Usage
 | 
			
		||||
@ -105,8 +104,22 @@ In sticky mode, the tab will be fixed to top when scroll to top
 | 
			
		||||
 | 
			
		||||
```html
 | 
			
		||||
<van-tabs :active="active" sticky>
 | 
			
		||||
  <van-tab v-for="index in 4" :title="'选项 ' + index">
 | 
			
		||||
    内容 {{ index }}
 | 
			
		||||
  <van-tab v-for="index in 4" :title="'tab ' + index">
 | 
			
		||||
    content {{ index }}
 | 
			
		||||
  </van-tab>
 | 
			
		||||
</van-tabs>
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
#### Custom title
 | 
			
		||||
Use title slot to custom tab title
 | 
			
		||||
 | 
			
		||||
```html
 | 
			
		||||
<van-tabs :active="active">
 | 
			
		||||
  <van-tab v-for="index in 2">
 | 
			
		||||
    <div slot="title">
 | 
			
		||||
      <van-icon name="more-o" />tab
 | 
			
		||||
    </div>
 | 
			
		||||
    content {{ index }}
 | 
			
		||||
  </van-tab>
 | 
			
		||||
</van-tabs>
 | 
			
		||||
```
 | 
			
		||||
@ -127,6 +140,13 @@ In sticky mode, the tab will be fixed to top when scroll to top
 | 
			
		||||
| title | Tab title | `String` | - | - |
 | 
			
		||||
| disabled | Whether disabled current tab | `Boolean` | `false` | - |
 | 
			
		||||
 | 
			
		||||
### Tab Slot
 | 
			
		||||
 | 
			
		||||
| name | Description |
 | 
			
		||||
|-----------|-----------|
 | 
			
		||||
| - | Content |
 | 
			
		||||
| title | Custom tab |
 | 
			
		||||
 | 
			
		||||
### Tabs Event
 | 
			
		||||
 | 
			
		||||
| Event | Description | Arguments |
 | 
			
		||||
 | 
			
		||||
@ -4,8 +4,7 @@
 | 
			
		||||
``` javascript
 | 
			
		||||
import { Tabbar, TabbarItem } from 'vant';
 | 
			
		||||
 | 
			
		||||
Vue.use(Tabbar);
 | 
			
		||||
Vue.use(TabbarItem);
 | 
			
		||||
Vue.use(Tabbar).use(TabbarItem);
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
### Usage
 | 
			
		||||
 | 
			
		||||
@ -18,7 +18,10 @@ Toast('Some messages');
 | 
			
		||||
#### Loading
 | 
			
		||||
 | 
			
		||||
```javascript
 | 
			
		||||
Toast.loading({ mask: true });
 | 
			
		||||
Toast.loading({
 | 
			
		||||
  mask: true,
 | 
			
		||||
  message: 'Loading...'
 | 
			
		||||
});
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -62,6 +65,19 @@ export default {
 | 
			
		||||
}
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
#### Singleton
 | 
			
		||||
Toast use singleton mode by default, if you need to pop multiple Toast at the same time, you can refer to the following example
 | 
			
		||||
 | 
			
		||||
```js
 | 
			
		||||
Toast.allowMultiple();
 | 
			
		||||
 | 
			
		||||
const toast1 = Toast('First Toast');
 | 
			
		||||
const toast2 = Toast.success('Second Toast');
 | 
			
		||||
 | 
			
		||||
toast1.clear();
 | 
			
		||||
toast2.clear();
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
### Methods
 | 
			
		||||
 | 
			
		||||
| Methods | Attribute | Return value | Description |
 | 
			
		||||
@ -70,9 +86,10 @@ export default {
 | 
			
		||||
| Toast.loading | `options | message` | toast instance | Show loading toast |
 | 
			
		||||
| Toast.success | `options | message` | toast instance | Show success toast |
 | 
			
		||||
| Toast.fail | `options | message` | toast instance | Show fail toast |
 | 
			
		||||
| Toast.clear | `clearAll` | `void` | Close  |
 | 
			
		||||
| Toast.allowMultiple | - | `void` | Allow multlple toast at the same time |
 | 
			
		||||
| Toast.setDefaultOptions | `options` | `void` | Set default options of all toasts |
 | 
			
		||||
| Toast.resetDefaultOptions | - | `void` | Reset default options of all toasts |
 | 
			
		||||
| Toast.clear | - | `void` | Close  |
 | 
			
		||||
 | 
			
		||||
### Options
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -42,13 +42,26 @@ You can set native properties such as `accpet`、`multiple` on Uploader, and the
 | 
			
		||||
 | 
			
		||||
| Attribute | Description | Type | Default | Accepted Values |
 | 
			
		||||
|-----------|-----------|-----------|-------------|-------------|
 | 
			
		||||
| result-type | The way to read the file, read as base64; read as text | `String` | `dataUrl` | `text` |
 | 
			
		||||
| disable | Whether to disable the upload, set to true during the image upload to prevent users from clicking this component to upload pictures | `Boolean` | `false` | - |
 | 
			
		||||
| before-read | Hook before reading the file, the first parameter is the selected file, return false to stop reading the file | `Function` | - | - |
 | 
			
		||||
| after-read | Hook after reading the file, parameter format: { file ,content } | `Function` | - | - |
 | 
			
		||||
| result-type | Type of file read result | `String` | `dataUrl` | `text` |
 | 
			
		||||
| disable | Whether to disable the upload | `Boolean` | `false` | - |
 | 
			
		||||
| before-read | Hook before reading the file, return false to stop reading the file | `Function` | - | - |
 | 
			
		||||
| after-read | Hook after reading the file | `Function` | - | - |
 | 
			
		||||
| max-size | Max size of file | `Number` | - | - |
 | 
			
		||||
 | 
			
		||||
### Event
 | 
			
		||||
 | 
			
		||||
| Event | Description | Arguments |
 | 
			
		||||
|-----------|-----------|-----------|
 | 
			
		||||
| oversize | Triggered when file size over limit | Same as after-read |
 | 
			
		||||
 | 
			
		||||
### Slot
 | 
			
		||||
 | 
			
		||||
| name | Description |
 | 
			
		||||
| Name | Description |
 | 
			
		||||
|-----------|-----------|
 | 
			
		||||
| - | Custom icon |
 | 
			
		||||
 | 
			
		||||
### afterRead parematers
 | 
			
		||||
| Key | Description | Type |
 | 
			
		||||
|-----------|-----------|-----------|
 | 
			
		||||
| file | file object | `Object` |
 | 
			
		||||
| content | file content | `String` |
 | 
			
		||||
@ -25,6 +25,7 @@ export default {
 | 
			
		||||
  'zh-CN/changelog-generated': wrapper(r => require.ensure([], () => r(require('./zh-CN/changelog-generated.md')), 'zh-CN/changelog-generated')),
 | 
			
		||||
  'zh-CN/changelog': wrapper(r => require.ensure([], () => r(require('./zh-CN/changelog.md')), 'zh-CN/changelog')),
 | 
			
		||||
  'zh-CN/checkbox': wrapper(r => require.ensure([], () => r(require('./zh-CN/checkbox.md')), 'zh-CN/checkbox')),
 | 
			
		||||
  'zh-CN/circle': wrapper(r => require.ensure([], () => r(require('./zh-CN/circle.md')), 'zh-CN/circle')),
 | 
			
		||||
  'zh-CN/contact': wrapper(r => require.ensure([], () => r(require('./zh-CN/contact.md')), 'zh-CN/contact')),
 | 
			
		||||
  'zh-CN/coupon': wrapper(r => require.ensure([], () => r(require('./zh-CN/coupon.md')), 'zh-CN/coupon')),
 | 
			
		||||
  'zh-CN/datetime-picker': wrapper(r => require.ensure([], () => r(require('./zh-CN/datetime-picker.md')), 'zh-CN/datetime-picker')),
 | 
			
		||||
@ -77,6 +78,7 @@ export default {
 | 
			
		||||
  'en-US/cell': wrapper(r => require.ensure([], () => r(require('./en-US/cell.md')), 'en-US/cell')),
 | 
			
		||||
  'en-US/changelog': wrapper(r => require.ensure([], () => r(require('./en-US/changelog.md')), 'en-US/changelog')),
 | 
			
		||||
  'en-US/checkbox': wrapper(r => require.ensure([], () => r(require('./en-US/checkbox.md')), 'en-US/checkbox')),
 | 
			
		||||
  'en-US/circle': wrapper(r => require.ensure([], () => r(require('./en-US/circle.md')), 'en-US/circle')),
 | 
			
		||||
  'en-US/contact': wrapper(r => require.ensure([], () => r(require('./en-US/contact.md')), 'en-US/contact')),
 | 
			
		||||
  'en-US/coupon': wrapper(r => require.ensure([], () => r(require('./en-US/coupon.md')), 'en-US/coupon')),
 | 
			
		||||
  'en-US/datetime-picker': wrapper(r => require.ensure([], () => r(require('./en-US/datetime-picker.md')), 'en-US/datetime-picker')),
 | 
			
		||||
 | 
			
		||||
@ -72,6 +72,7 @@ export default {
 | 
			
		||||
| cancel-text | 取消按钮文案 | `String` | - | - |
 | 
			
		||||
| overlay | 是否显示遮罩 | `Boolean` | - | - |
 | 
			
		||||
| close-on-click-overlay | 点击遮罩是否关闭`Actionsheet` | `Boolean` | - | - |
 | 
			
		||||
| get-container | 指定挂载的 HTML 节点 | `Function` | - | `() => HTMLElement` |
 | 
			
		||||
 | 
			
		||||
### actions
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -79,6 +79,13 @@ export default {
 | 
			
		||||
| change-area | 修改收件地区时触发 | values: 地区信息 |
 | 
			
		||||
| change-detail | 修改详细地址时触发 | value: 详细地址内容 |
 | 
			
		||||
 | 
			
		||||
### Slot
 | 
			
		||||
 | 
			
		||||
| 名称 | 说明 |
 | 
			
		||||
|-----------|-----------|
 | 
			
		||||
| - | 在邮政编码下方插入内容 |
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
### 数据格式
 | 
			
		||||
 | 
			
		||||
#### addressInfo 数据格式
 | 
			
		||||
 | 
			
		||||
@ -42,6 +42,9 @@ Vue.use(Area);
 | 
			
		||||
| title | 顶部栏标题 | `String` | `''`   | - |
 | 
			
		||||
| area-list | 省市县数据,格式见下方 | `Object` | - | - |
 | 
			
		||||
| columns-num | 省市县显示列数,3-省市县,2-省市,1-省 | `String`,`Number` | `3` | - |
 | 
			
		||||
| loading | 是否显示加载状态 | `Boolean` | `false` | - |
 | 
			
		||||
| item-height | 选项高度 | `Number` | `44` | - |
 | 
			
		||||
| visible-item-count | 可见的选项个数 | `Number` | `5` | - |
 | 
			
		||||
 | 
			
		||||
### Event
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -73,8 +73,9 @@ Vue.use(Button);
 | 
			
		||||
|-----------|-----------|-----------|-------------|-------------|
 | 
			
		||||
| type | 按钮类型 | `String` | `default` | `primary` `danger` |
 | 
			
		||||
| size | 按钮尺寸 | `String` | `normal` | `large` `small` `mini` |
 | 
			
		||||
| text | 按钮文字 | `String` | - | - |
 | 
			
		||||
| tag | 按钮标签 | `String` | `button` | 任意`HTML`标签 |
 | 
			
		||||
| native-type | 按钮类型(原生) | `String` | `''` | - |
 | 
			
		||||
| native-type | 按钮类型(原生) | `String` | - | - |
 | 
			
		||||
| disabled | 是否禁用 | `Boolean` |  `false` | - |
 | 
			
		||||
| loading | 是否显示为加载状态 | `Boolean` |  `false` | - |
 | 
			
		||||
| block | 是否为块级元素 | `Boolean` |   `false` | - |
 | 
			
		||||
 | 
			
		||||
@ -52,7 +52,7 @@ Vue.use(Card);
 | 
			
		||||
 | 
			
		||||
### Slot
 | 
			
		||||
 | 
			
		||||
| name | 描述 |
 | 
			
		||||
| 名称 | 说明 |
 | 
			
		||||
|-----------|-----------|
 | 
			
		||||
| title | 自定义标题 |
 | 
			
		||||
| desc | 自定义描述 |
 | 
			
		||||
 | 
			
		||||
@ -66,7 +66,7 @@ export default {
 | 
			
		||||
 | 
			
		||||
### Slot
 | 
			
		||||
 | 
			
		||||
| name | 描述 |
 | 
			
		||||
| 名称 | 说明 |
 | 
			
		||||
|-----------|-----------|
 | 
			
		||||
| - | 自定义显示内容 |
 | 
			
		||||
| left | 左侧滑动内容 |
 | 
			
		||||
 | 
			
		||||
@ -4,8 +4,7 @@
 | 
			
		||||
``` javascript
 | 
			
		||||
import { Cell, CellGroup } from 'vant';
 | 
			
		||||
 | 
			
		||||
Vue.use(Cell);
 | 
			
		||||
Vue.use(CellGroup);
 | 
			
		||||
Vue.use(Cell).use(CellGroup);
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
### 代码演示
 | 
			
		||||
@ -92,7 +91,7 @@ Vue.use(CellGroup);
 | 
			
		||||
 | 
			
		||||
### Slot
 | 
			
		||||
 | 
			
		||||
| name | 描述 |
 | 
			
		||||
| 名称 | 说明 |
 | 
			
		||||
|-----------|-----------|
 | 
			
		||||
| - | 自定义显示内容 |
 | 
			
		||||
| icon | 自定义`icon` |
 | 
			
		||||
 | 
			
		||||
@ -1,5 +1,132 @@
 | 
			
		||||
## 更新日志
 | 
			
		||||
 | 
			
		||||
## [v0.12.8](https://github.com/youzan/vant/tree/v0.12.8) (2018-02-07)
 | 
			
		||||
[Full Changelog](https://github.com/youzan/vant/compare/v0.12.7...v0.12.8)
 | 
			
		||||
 | 
			
		||||
**Issue**
 | 
			
		||||
 | 
			
		||||
- 一些小小提议 [\#616](https://github.com/youzan/vant/issues/616)
 | 
			
		||||
- Toast提示显示时间的问题 [\#613](https://github.com/youzan/vant/issues/613)
 | 
			
		||||
- CheckboxGroup 里面的chekBox的prop, name的类型效验 [\#610](https://github.com/youzan/vant/issues/610)
 | 
			
		||||
- Waterfall 跳转路由触发 [\#607](https://github.com/youzan/vant/issues/607)
 | 
			
		||||
- van-tabs 组件 @click事件 只能传入Index吗。是否可把van-tab绑定的item 传入处理。 [\#606](https://github.com/youzan/vant/issues/606)
 | 
			
		||||
- Cell 组件,title 属性传递数字 0时,不显示内容 [\#604](https://github.com/youzan/vant/issues/604)
 | 
			
		||||
- QA: questions for your builds-tools  [\#602](https://github.com/youzan/vant/issues/602)
 | 
			
		||||
- vue开发中报t.\_g is not a function,是版本原因? [\#598](https://github.com/youzan/vant/issues/598)
 | 
			
		||||
- 使用PostCSS 插件定制主题报错,找不到$poses变量 [\#597](https://github.com/youzan/vant/issues/597)
 | 
			
		||||
- 为什么引用的插件在微信编辑器里可以正常使用,在手机上Toast的提示成功的对号图片就不显示了? [\#595](https://github.com/youzan/vant/issues/595)
 | 
			
		||||
- android\_23 save事件里获取到的中文,get请求显示乱码?需要转码?这个问题我也再看看,先看看大家有遇到过没? [\#594](https://github.com/youzan/vant/issues/594)
 | 
			
		||||
- 关于Icon图标组件使用本地字体的问题 [\#592](https://github.com/youzan/vant/issues/592)
 | 
			
		||||
- tabs组件问题 [\#589](https://github.com/youzan/vant/issues/589)
 | 
			
		||||
- 请问Area组件,能否定义item-height [\#588](https://github.com/youzan/vant/issues/588)
 | 
			
		||||
- waterfall waterfall-offset  瀑布流 阀值 [\#584](https://github.com/youzan/vant/issues/584)
 | 
			
		||||
- 关闭sku层后,无法获取到skuData? [\#580](https://github.com/youzan/vant/issues/580)
 | 
			
		||||
- Toast组件能否触发多个 [\#571](https://github.com/youzan/vant/issues/571)
 | 
			
		||||
 | 
			
		||||
**Improvements**
 | 
			
		||||
 | 
			
		||||
- \[new feature\] sku组件增加图片上传功能 [\#612](https://github.com/youzan/vant/pull/612) ([w91](https://github.com/w91))
 | 
			
		||||
- \[new feature\] Popup: support getContaienr [\#611](https://github.com/youzan/vant/pull/611) ([chenjiahan](https://github.com/chenjiahan))
 | 
			
		||||
- \[bugfix\] Picker: style error in some andriod devices [\#609](https://github.com/youzan/vant/pull/609) ([chenjiahan](https://github.com/chenjiahan))
 | 
			
		||||
- \[new feature\] add Circle component [\#608](https://github.com/youzan/vant/pull/608) ([chenjiahan](https://github.com/chenjiahan))
 | 
			
		||||
- \[bugfix\] TreeSelect: arrow position error [\#605](https://github.com/youzan/vant/pull/605) ([chenjiahan](https://github.com/chenjiahan))
 | 
			
		||||
- \[Improvement\] Tab: add title slot [\#603](https://github.com/youzan/vant/pull/603) ([chenjiahan](https://github.com/chenjiahan))
 | 
			
		||||
- \[Improvement\] Toast: adjust background color [\#601](https://github.com/youzan/vant/pull/601) ([chenjiahan](https://github.com/chenjiahan))
 | 
			
		||||
- \[new feature\] sku组件增加步进器相关自定义配置 [\#600](https://github.com/youzan/vant/pull/600) ([w91](https://github.com/w91))
 | 
			
		||||
 | 
			
		||||
## [v0.12.7](https://github.com/youzan/vant/tree/v0.12.7) (2018-01-31)
 | 
			
		||||
[Full Changelog](https://github.com/youzan/vant/compare/v0.12.6...v0.12.7)
 | 
			
		||||
 | 
			
		||||
**Breaking changes**
 | 
			
		||||
 | 
			
		||||
-  关于上传组件的一些功能扩展 [\#526](https://github.com/youzan/vant/issues/526)
 | 
			
		||||
 | 
			
		||||
**Issue**
 | 
			
		||||
 | 
			
		||||
- 业务组件比如地址编辑,按钮文本支持修改吗?(比如保存改成提交) [\#590](https://github.com/youzan/vant/issues/590)
 | 
			
		||||
- \[求教\] Dialog.alert 的message可以是tab组件吗? [\#587](https://github.com/youzan/vant/issues/587)
 | 
			
		||||
- 社区能活跃点吗? [\#582](https://github.com/youzan/vant/issues/582)
 | 
			
		||||
- 页面初始化后Toast自动弹出 [\#581](https://github.com/youzan/vant/issues/581)
 | 
			
		||||
- \</van-cell-group\>组件嵌套不正确 [\#578](https://github.com/youzan/vant/issues/578)
 | 
			
		||||
- Dialog需求prompt功能 [\#577](https://github.com/youzan/vant/issues/577)
 | 
			
		||||
- 遍历对象数组动态生成tab,active不起效 [\#569](https://github.com/youzan/vant/issues/569)
 | 
			
		||||
- 没有重置Sku下的规格选项 [\#564](https://github.com/youzan/vant/issues/564)
 | 
			
		||||
- 地址编辑 如何新增表单项? [\#555](https://github.com/youzan/vant/issues/555)
 | 
			
		||||
 | 
			
		||||
**Improvements**
 | 
			
		||||
 | 
			
		||||
- \[new feature\] Dialog: support component call [\#593](https://github.com/youzan/vant/pull/593) ([chenjiahan](https://github.com/chenjiahan))
 | 
			
		||||
- \[Improvement\] Area: add item-height & visible-item-count props [\#591](https://github.com/youzan/vant/pull/591) ([chenjiahan](https://github.com/chenjiahan))
 | 
			
		||||
- \[new feature\] Toast: support multiple instance [\#586](https://github.com/youzan/vant/pull/586) ([chenjiahan](https://github.com/chenjiahan))
 | 
			
		||||
- \[Improvement\] Sku: add getSkuData method [\#585](https://github.com/youzan/vant/pull/585) ([chenjiahan](https://github.com/chenjiahan))
 | 
			
		||||
- \[bugfix\] Field: multi line label stye error [\#583](https://github.com/youzan/vant/pull/583) ([chenjiahan](https://github.com/chenjiahan))
 | 
			
		||||
 | 
			
		||||
## [v0.12.6](https://github.com/youzan/vant/tree/v0.12.6) (2018-01-25)
 | 
			
		||||
[Full Changelog](https://github.com/youzan/vant/compare/v0.12.5...v0.12.6)
 | 
			
		||||
 | 
			
		||||
**Issue**
 | 
			
		||||
 | 
			
		||||
- 能否去除cell的下边框线 [\#576](https://github.com/youzan/vant/issues/576)
 | 
			
		||||
- 地址编辑 areaList 请求后 赋值不可以? [\#570](https://github.com/youzan/vant/issues/570)
 | 
			
		||||
 | 
			
		||||
**Improvements**
 | 
			
		||||
 | 
			
		||||
- \[new feature\] Uploader: support maxSize prop [\#575](https://github.com/youzan/vant/pull/575) ([chenjiahan](https://github.com/chenjiahan))
 | 
			
		||||
- \[Improvement\] AddressEdit: add default slot [\#573](https://github.com/youzan/vant/pull/573) ([chenjiahan](https://github.com/chenjiahan))
 | 
			
		||||
- \[bugfix\] Tab: active not work [\#572](https://github.com/youzan/vant/pull/572) ([chenjiahan](https://github.com/chenjiahan))
 | 
			
		||||
- \[bugfix\] 修复限购情况下,未超出限购数时的错误文案显示;\[new feature\] 增加sku-body-top slot;\[new feature\] 增加resetSelectedSkuOnHide参数 [\#568](https://github.com/youzan/vant/pull/568) ([w91](https://github.com/w91))
 | 
			
		||||
- \[bugfix\] Toast: work break [\#567](https://github.com/youzan/vant/pull/567) ([chenjiahan](https://github.com/chenjiahan))
 | 
			
		||||
 | 
			
		||||
## [v0.12.5](https://github.com/youzan/vant/tree/v0.12.5) (2018-01-23)
 | 
			
		||||
[Full Changelog](https://github.com/youzan/vant/compare/v0.12.4...v0.12.5)
 | 
			
		||||
 | 
			
		||||
**Issue**
 | 
			
		||||
 | 
			
		||||
- ssr项目使用时css加载错误 [\#561](https://github.com/youzan/vant/issues/561)
 | 
			
		||||
- css加载报错 [\#559](https://github.com/youzan/vant/issues/559)
 | 
			
		||||
- tabbar的active手动设置不生效 [\#558](https://github.com/youzan/vant/issues/558)
 | 
			
		||||
- 页面手动刷新 tabbar 会 回到起始路由页面对应的 active icon [\#557](https://github.com/youzan/vant/issues/557)
 | 
			
		||||
- 轮播图van-swipe 懒加载图片v-lazy 使用报错Failed to resolve directive: lazy [\#554](https://github.com/youzan/vant/issues/554)
 | 
			
		||||
- ssr 使用 babel-plugin-import报错 [\#552](https://github.com/youzan/vant/issues/552)
 | 
			
		||||
- stepper如何放到cell里面? [\#551](https://github.com/youzan/vant/issues/551)
 | 
			
		||||
- DatetimePicker设置每一列可见元素个数visibile-column-count失效 [\#547](https://github.com/youzan/vant/issues/547)
 | 
			
		||||
- Toast 和 Dialog 增加全局参数配置 [\#538](https://github.com/youzan/vant/issues/538)
 | 
			
		||||
- picker 组件文档 [\#537](https://github.com/youzan/vant/issues/537)
 | 
			
		||||
 | 
			
		||||
**Improvements**
 | 
			
		||||
 | 
			
		||||
- \[Improvement\] CouponList: support v-model & exchangeButtonLoading [\#566](https://github.com/youzan/vant/pull/566) ([chenjiahan](https://github.com/chenjiahan))
 | 
			
		||||
- \[Improvement\] update dependencies [\#565](https://github.com/youzan/vant/pull/565) ([chenjiahan](https://github.com/chenjiahan))
 | 
			
		||||
- \[Improvement\] Button: add text prop [\#563](https://github.com/youzan/vant/pull/563) ([chenjiahan](https://github.com/chenjiahan))
 | 
			
		||||
- \[Improvement\] Icon: update share icon [\#562](https://github.com/youzan/vant/pull/562) ([chenjiahan](https://github.com/chenjiahan))
 | 
			
		||||
- \[bugfix\] Area: should not display city & county list when not select province [\#560](https://github.com/youzan/vant/pull/560) ([chenjiahan](https://github.com/chenjiahan))
 | 
			
		||||
- \[Improvement\] CouponList: add exchangeMinLength prop [\#556](https://github.com/youzan/vant/pull/556) ([chenjiahan](https://github.com/chenjiahan))
 | 
			
		||||
- \[bugfix\] Cell: fix required style [\#553](https://github.com/youzan/vant/pull/553) ([qianzhaoy](https://github.com/qianzhaoy))
 | 
			
		||||
- \[Improvement\] Sku: improve render performance [\#550](https://github.com/youzan/vant/pull/550) ([chenjiahan](https://github.com/chenjiahan))
 | 
			
		||||
 | 
			
		||||
## [v0.12.4](https://github.com/youzan/vant/tree/v0.12.4) (2018-01-18)
 | 
			
		||||
[Full Changelog](https://github.com/youzan/vant/compare/v0.12.3...v0.12.4)
 | 
			
		||||
 | 
			
		||||
**Issue**
 | 
			
		||||
 | 
			
		||||
- \[Stepper\]: should not fire the events on changing the value prop [\#545](https://github.com/youzan/vant/issues/545)
 | 
			
		||||
- 有关vant导入所有组件用法示例异常 [\#543](https://github.com/youzan/vant/issues/543)
 | 
			
		||||
- 密码输入框组件与数字键盘组件报错 [\#542](https://github.com/youzan/vant/issues/542)
 | 
			
		||||
- ImagePreview 组件文档 [\#540](https://github.com/youzan/vant/issues/540)
 | 
			
		||||
- 官网文档 Button组件API   "disabled" 拼写错误 [\#536](https://github.com/youzan/vant/issues/536)
 | 
			
		||||
- TabBar切换颜色没有加深 [\#535](https://github.com/youzan/vant/issues/535)
 | 
			
		||||
- 问一个swipe的问题?为什么写了img 写上了v-lazy 没效果 [\#534](https://github.com/youzan/vant/issues/534)
 | 
			
		||||
- checkbox的全选取消的问题 [\#533](https://github.com/youzan/vant/issues/533)
 | 
			
		||||
 | 
			
		||||
**Improvements**
 | 
			
		||||
 | 
			
		||||
- \[bugfix\] Picker: misspelling of visibleItemCount [\#549](https://github.com/youzan/vant/pull/549) ([chenjiahan](https://github.com/chenjiahan))
 | 
			
		||||
- \[Improvement\] Picker: add props to custom button text [\#548](https://github.com/youzan/vant/pull/548) ([chenjiahan](https://github.com/chenjiahan))
 | 
			
		||||
- \[bug fix\] Stepper: not fire event on changing the value prop [\#546](https://github.com/youzan/vant/pull/546) ([chuangbo](https://github.com/chuangbo))
 | 
			
		||||
- \[Doc\] fix misspelling of NumberKeyboard [\#544](https://github.com/youzan/vant/pull/544) ([chenjiahan](https://github.com/chenjiahan))
 | 
			
		||||
- \[Improvement\] Toast: add setDefaultOptions method [\#541](https://github.com/youzan/vant/pull/541) ([chenjiahan](https://github.com/chenjiahan))
 | 
			
		||||
- \[Improvement\] Dialog: add setDefaultOptions method [\#539](https://github.com/youzan/vant/pull/539) ([chenjiahan](https://github.com/chenjiahan))
 | 
			
		||||
 | 
			
		||||
## [v0.12.3](https://github.com/youzan/vant/tree/v0.12.3) (2018-01-12)
 | 
			
		||||
[Full Changelog](https://github.com/youzan/vant/compare/v0.12.2...v0.12.3)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -1,5 +1,79 @@
 | 
			
		||||
## 更新日志
 | 
			
		||||
 | 
			
		||||
### [0.12.8](https://github.com/youzan/vant/tree/v0.12.8)
 | 
			
		||||
`2018-02-07`
 | 
			
		||||
 | 
			
		||||
**Improvements**
 | 
			
		||||
* 新增 Circle 组件 [\#608](https://github.com/youzan/vant/pull/608) [@chenjiahan](https://github.com/chenjiahan)
 | 
			
		||||
* Tab: 新增 title slot [\#603](https://github.com/youzan/vant/pull/603) [@chenjiahan](https://github.com/chenjiahan)
 | 
			
		||||
* Toast: 加深背景色 [\#601](https://github.com/youzan/vant/pull/601) [@chenjiahan](https://github.com/chenjiahan)
 | 
			
		||||
* Popup: 新增 getContaienr 属性 [\#611](https://github.com/youzan/vant/pull/611) [@chenjiahan](https://github.com/chenjiahan)
 | 
			
		||||
* Sku: 支持图片上传 [\#612](https://github.com/youzan/vant/pull/612) [@w91](https://github.com/w91)
 | 
			
		||||
* Sku: 支持自定义 Stepper [\#600](https://github.com/youzan/vant/pull/600) [@w91](https://github.com/w91)
 | 
			
		||||
 | 
			
		||||
**Bug Fixes**
 | 
			
		||||
* 修复 Picker 在部分设备下的样式问题 [\#609](https://github.com/youzan/vant/pull/609) [@chenjiahan](https://github.com/chenjiahan)
 | 
			
		||||
* 修复 TreeSelect 箭头位置错误 [\#605](https://github.com/youzan/vant/pull/605) [@chenjiahan](https://github.com/chenjiahan)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
### [0.12.7](https://github.com/youzan/vant/tree/v0.12.7)
 | 
			
		||||
`2018-01-31`
 | 
			
		||||
 | 
			
		||||
**Improvements**
 | 
			
		||||
* Area: 新增 item-height、visible-item-count 属性 [\#591](https://github.com/youzan/vant/pull/591) [@chenjiahan](https://github.com/chenjiahan)
 | 
			
		||||
* Dialog: 支持以组件形式调用 [\#593](https://github.com/youzan/vant/pull/593) [@chenjiahan](https://github.com/chenjiahan)
 | 
			
		||||
* Toast: 支持同时弹出多个 Toast [\#586](https://github.com/youzan/vant/pull/586) [@chenjiahan](https://github.com/chenjiahan)
 | 
			
		||||
* Sku: 新增 getSkuData 方法 [\#585](https://github.com/youzan/vant/pull/585) [@chenjiahan](https://github.com/chenjiahan)
 | 
			
		||||
 | 
			
		||||
**Bug Fixes**
 | 
			
		||||
* 修复 Field label 多行时样式错误的问题 [\#583](https://github.com/youzan/vant/pull/583) [@chenjiahan](https://github.com/chenjiahan)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
### [0.12.6](https://github.com/youzan/vant/tree/v0.12.6)
 | 
			
		||||
`2018-01-25`
 | 
			
		||||
 | 
			
		||||
**Improvements**
 | 
			
		||||
 | 
			
		||||
- AddressEdit: 增加默认 slot [\#573](https://github.com/youzan/vant/pull/573) [@chenjiahan](https://github.com/chenjiahan)
 | 
			
		||||
- Uploader: 新增 maxSize 属性 [\#575](https://github.com/youzan/vant/pull/575) [@chenjiahan](https://github.com/chenjiahan)
 | 
			
		||||
- Sku: 新增 sku-body-top slot、resetSelectedSkuOnHide 属性 [\#568](https://github.com/youzan/vant/pull/568) [@w91](https://github.com/w91)
 | 
			
		||||
 | 
			
		||||
**Bug Fixes**
 | 
			
		||||
 | 
			
		||||
- 修复 Toast 文案换行 [\#567](https://github.com/youzan/vant/pull/567) [@chenjiahan](https://github.com/chenjiahan)
 | 
			
		||||
- 修复 Sku 限购情况下,未超出限购数时的错误文案显示 [\#568](https://github.com/youzan/vant/pull/568) [@w91](https://github.com/w91)
 | 
			
		||||
- 修复 Tab active 在初始化时未生效的问题 [\#572](https://github.com/youzan/vant/pull/572) [@chenjiahan](https://github.com/chenjiahan)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
### [0.12.5](https://github.com/youzan/vant/tree/v0.12.5)
 | 
			
		||||
`2018-01-23`
 | 
			
		||||
 | 
			
		||||
**Improvements**
 | 
			
		||||
 | 
			
		||||
* Button: 新增 text 属性 [\#563](https://github.com/youzan/vant/pull/563) [@chenjiahan](https://github.com/chenjiahan)
 | 
			
		||||
* CouponList: 支持 v-model、exchangeButtonLoading、exchangeMinLength [\#556](https://github.com/youzan/vant/pull/556) [\#566](https://github.com/youzan/vant/pull/566) [@chenjiahan](https://github.com/chenjiahan)
 | 
			
		||||
* Icon: 更新 share 图标 [\#562](https://github.com/youzan/vant/pull/562) [@chenjiahan](https://github.com/chenjiahan)
 | 
			
		||||
* Sku: 优化渲染性能 [\#550](https://github.com/youzan/vant/pull/550) [@chenjiahan](https://github.com/chenjiahan)
 | 
			
		||||
 | 
			
		||||
**Bug Fixes**
 | 
			
		||||
* Area: 修复未选中省份时市区展示错误的问题 [\#560](https://github.com/youzan/vant/pull/560) [@chenjiahan](https://github.com/chenjiahan)
 | 
			
		||||
* Cell: 修复 required 样式错误的问题 [\#553](https://github.com/youzan/vant/pull/553) [@qianzhaoy](https://github.com/qianzhaoy)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
### [0.12.4](https://github.com/youzan/vant/tree/v0.12.4)
 | 
			
		||||
`2018-01-18`
 | 
			
		||||
 | 
			
		||||
**Improvements**
 | 
			
		||||
 | 
			
		||||
* Picker: 新增 confirmButtonText、cancelButtonText 属性 [\#548](https://github.com/youzan/vant/pull/548) [@chenjiahan](https://github.com/chenjiahan)
 | 
			
		||||
* Toast: 新增 setDefaultOptions 方法 [\#541](https://github.com/youzan/vant/pull/541) [@chenjiahan](https://github.com/chenjiahan)
 | 
			
		||||
* Dialog: 新增 setDefaultOptions 方法 [\#539](https://github.com/youzan/vant/pull/539) [@chenjiahan](https://github.com/chenjiahan)
 | 
			
		||||
 | 
			
		||||
**Bug Fixes**
 | 
			
		||||
 | 
			
		||||
* Stepper: 修改 value 值时不触发 change 事件 [\#546](https://github.com/youzan/vant/pull/546) [@chuangbo](https://github.com/chuangbo)
 | 
			
		||||
* Picker: 修复 visibleItemCount 属性拼写错误 [\#549](https://github.com/youzan/vant/pull/549) [@chenjiahan](https://github.com/chenjiahan)
 | 
			
		||||
 | 
			
		||||
### [0.12.3](https://github.com/youzan/vant/tree/v0.12.3)
 | 
			
		||||
 | 
			
		||||
`2018-01-12`
 | 
			
		||||
 | 
			
		||||
@ -4,8 +4,7 @@
 | 
			
		||||
``` javascript
 | 
			
		||||
import { Checkbox, CheckboxGroup } from 'vant';
 | 
			
		||||
 | 
			
		||||
Vue.use(Checkbox);
 | 
			
		||||
Vue.use(CheckboxGroup);
 | 
			
		||||
Vue.use(Checkbox).use(CheckboxGroup);
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
### 代码演示
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										70
									
								
								docs/markdown/zh-CN/circle.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										70
									
								
								docs/markdown/zh-CN/circle.md
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,70 @@
 | 
			
		||||
## Circle 环形进度条
 | 
			
		||||
 | 
			
		||||
### 使用指南
 | 
			
		||||
``` javascript
 | 
			
		||||
import { Circle } from 'vant';
 | 
			
		||||
 | 
			
		||||
Vue.use(Circle);
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
### 代码演示
 | 
			
		||||
 | 
			
		||||
#### 基础用法
 | 
			
		||||
通过 `rate` 指定目标进度,`v-model` 代表当前进度,`speed` 控制动画速度
 | 
			
		||||
 | 
			
		||||
```html
 | 
			
		||||
<van-circle
 | 
			
		||||
  v-model="currentRate"
 | 
			
		||||
  :rate="30"
 | 
			
		||||
  :speed="100"
 | 
			
		||||
  :text="text"
 | 
			
		||||
/>
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
``` javascript
 | 
			
		||||
export default {
 | 
			
		||||
  data() {
 | 
			
		||||
    return {
 | 
			
		||||
      currentRate: 0
 | 
			
		||||
    };
 | 
			
		||||
  },
 | 
			
		||||
  computed: {
 | 
			
		||||
    text() {
 | 
			
		||||
      return this.currentRate.toFixed(0) + '%'
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
#### 样式定制
 | 
			
		||||
 | 
			
		||||
```html
 | 
			
		||||
<van-circle
 | 
			
		||||
  v-model="currentRate"
 | 
			
		||||
  color="#13ce66"
 | 
			
		||||
  fill="#fff"
 | 
			
		||||
  size="120px"
 | 
			
		||||
  layer-color="#eee"
 | 
			
		||||
  :text="text"
 | 
			
		||||
  :rate="rate"
 | 
			
		||||
  :speed="100"
 | 
			
		||||
  :clockwise="false"
 | 
			
		||||
  :stroke-width="60"
 | 
			
		||||
/>
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
### API
 | 
			
		||||
 | 
			
		||||
| 参数 | 说明 | 类型 | 默认值 | 可选值 |
 | 
			
		||||
|-----------|-----------|-----------|-------------|-------------|
 | 
			
		||||
| v-model | 当前进度 | `Number` | - | - |
 | 
			
		||||
| rate | 目标进度 | `Number` | `100` | - |
 | 
			
		||||
| size | 圆环直径 | `String` | `100px` | - |
 | 
			
		||||
| color | 进度条颜色 | `String` | `#38f` | - |
 | 
			
		||||
| layer-color | 轨道颜色 | `String` | `#fff` | - |
 | 
			
		||||
| fill | 填充颜色 | `String` | `none` | - |
 | 
			
		||||
| speed | 动画速度(单位为 rate/s)| `Number` | - | - |
 | 
			
		||||
| text | 文字 | `String` | - | - |
 | 
			
		||||
| stroke-width | 进度条宽度 | `Number` | `40` | - |
 | 
			
		||||
| clockwise | 是否顺时针增加 | `Boolean` | `true` | - |
 | 
			
		||||
@ -5,9 +5,10 @@
 | 
			
		||||
``` javascript
 | 
			
		||||
import { ContactCard, ContactList, ContactEdit } from 'vant';
 | 
			
		||||
 | 
			
		||||
Vue.use(ContactCard);
 | 
			
		||||
Vue.use(ContactList);
 | 
			
		||||
Vue.use(ContactEdit);
 | 
			
		||||
Vue
 | 
			
		||||
  .use(ContactCard)
 | 
			
		||||
  .use(ContactList)
 | 
			
		||||
  .use(ContactEdit);
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
### 代码演示
 | 
			
		||||
 | 
			
		||||
@ -4,8 +4,7 @@
 | 
			
		||||
``` javascript
 | 
			
		||||
import { CouponCell, CouponList } from 'vant';
 | 
			
		||||
 | 
			
		||||
Vue.use(CouponCell);
 | 
			
		||||
Vue.use(CouponList);
 | 
			
		||||
Vue.use(CouponCell).use(CouponList);
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
### 代码演示
 | 
			
		||||
@ -69,7 +68,7 @@ export default {
 | 
			
		||||
 | 
			
		||||
### CouponCell API
 | 
			
		||||
 | 
			
		||||
| 参数 | 说明 | 类型 | 默认值 | 必须 |
 | 
			
		||||
| 参数 | 说明 | 类型 | 默认值 | 可选值 |
 | 
			
		||||
|-----------|-----------|-----------|-------------|-------------|
 | 
			
		||||
| title | 单元格标题 | `String` | `优惠券码` | - |
 | 
			
		||||
| chosen-coupon | 当前选中优惠券的索引 | `Number` | `-1` | - |
 | 
			
		||||
@ -78,13 +77,16 @@ export default {
 | 
			
		||||
 | 
			
		||||
### CouponList API
 | 
			
		||||
 | 
			
		||||
| 参数 | 说明 | 类型 | 默认值 | 必须 |
 | 
			
		||||
| 参数 | 说明 | 类型 | 默认值 | 可选值 |
 | 
			
		||||
|-----------|-----------|-----------|-------------|-------------|
 | 
			
		||||
| v-model | 当前输入的兑换码 | `String` | - | - |
 | 
			
		||||
| chosen-coupon | 当前选中优惠券的索引 | `Number` | `-1` | - |
 | 
			
		||||
| coupons | 可用优惠券列表 | `Array` | `[]` | - |
 | 
			
		||||
| disabled-doupons | 不可用优惠券列表 | `Array` | `[]` | - |
 | 
			
		||||
| exchange-button-text | 兑换按钮文字 | `String` | `兑换` | - |
 | 
			
		||||
| exchange-button-loading | 是否在兑换按钮上显示加载动画 | `Boolean` | `false` | - |
 | 
			
		||||
| exchange-button-disabled | 是否禁用兑换按钮 | `Boolean` | `false` | - |
 | 
			
		||||
| exchange-min-length | 兑换码最小长度 | `Number` | `1` | - |
 | 
			
		||||
| displayed-coupon-index | 滚动至特定优惠券位置 | `Number` | - | - |
 | 
			
		||||
| show-close-button | 是否显示列表底部按钮 | `Boolean` | `true` | - |
 | 
			
		||||
| close-button-text | 列表底部按钮文字 | `String` | `不使用优惠` | - |
 | 
			
		||||
 | 
			
		||||
@ -1,4 +1,5 @@
 | 
			
		||||
## Dialog 弹出框
 | 
			
		||||
Dialog 组件支持函数调用和组件调用两种形式
 | 
			
		||||
 | 
			
		||||
### 使用指南
 | 
			
		||||
 | 
			
		||||
@ -40,8 +41,8 @@ Dialog.confirm({
 | 
			
		||||
});
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
#### 组件内调用
 | 
			
		||||
引入 Dialog 组件后,会自动在 Vue 的 prototype 上挂载 $dialog 方法,便于在组件内调用。
 | 
			
		||||
#### 全局方法
 | 
			
		||||
引入 Dialog 组件后,会自动在 Vue 的 prototype 上挂载 $dialog 方法,在所有组件内部都可以直接调用此方法
 | 
			
		||||
 | 
			
		||||
```js
 | 
			
		||||
export default {
 | 
			
		||||
@ -77,3 +78,65 @@ export default {
 | 
			
		||||
| overlay | 是否展示蒙层 | `Boolean` | `true` | - |
 | 
			
		||||
| closeOnClickOverlay | 点击蒙层时是否关闭弹窗 | `Boolean` | `false` | - |
 | 
			
		||||
| lockOnScroll | 是否禁用背景滚动 | `Boolean` | `true` | - |
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#### 高级用法
 | 
			
		||||
如果需要在弹窗内实现更复杂的交互,可以通过组件形式来调用 Dialog
 | 
			
		||||
 | 
			
		||||
```html
 | 
			
		||||
<van-dialog v-model="show" @confirm="onConfirm">
 | 
			
		||||
  <van-field
 | 
			
		||||
    v-model="username"
 | 
			
		||||
    label="用户名"
 | 
			
		||||
    placeholder="请输入用户名"
 | 
			
		||||
  />
 | 
			
		||||
  <van-field
 | 
			
		||||
    v-model="password"
 | 
			
		||||
    type="password"
 | 
			
		||||
    :label="密码"
 | 
			
		||||
    :placeholder="请输入密码"
 | 
			
		||||
  />
 | 
			
		||||
</van-dialog>
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
```js
 | 
			
		||||
Vue.use(Dialog);
 | 
			
		||||
 | 
			
		||||
export default {
 | 
			
		||||
  data() {
 | 
			
		||||
    return {
 | 
			
		||||
      show: false,
 | 
			
		||||
      username: '',
 | 
			
		||||
      password: ''
 | 
			
		||||
    };
 | 
			
		||||
  },
 | 
			
		||||
  
 | 
			
		||||
  methods: {
 | 
			
		||||
    onConfirm() {
 | 
			
		||||
      this.show = false;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
### API
 | 
			
		||||
 | 
			
		||||
| 参数 | 说明 | 类型 | 默认值 | 可选值 |
 | 
			
		||||
|-----------|-----------|-----------|-------------|-------------|
 | 
			
		||||
| v-model | 是否显示弹窗 | `Boolean` | - | - |
 | 
			
		||||
| title | 标题 | `String` | - | - |
 | 
			
		||||
| message | 内容 | `String` | - | - |
 | 
			
		||||
| show-confirm-button | 是否展示确认按钮 | `Boolean` |  `true` | - |
 | 
			
		||||
| show-cancel-button | 是否展示取消按钮 | `Boolean` |  `false` | - |
 | 
			
		||||
| confirm-button-text | 确认按钮的文案 | `String` |  `确认` | - |
 | 
			
		||||
| cancel-button-text | 取消按钮的文案 | `String` | `取消` | - |
 | 
			
		||||
| overlay | 是否展示蒙层 | `Boolean` | `true` | - |
 | 
			
		||||
| close-on-click-overlay | 点击蒙层时是否关闭弹窗 | `Boolean` | `false` | - |
 | 
			
		||||
| lock-on-scroll | 是否禁用背景滚动 | `Boolean` | `true` | - |
 | 
			
		||||
 | 
			
		||||
### Event
 | 
			
		||||
 | 
			
		||||
| 事件 | 说明 | 回调参数 |
 | 
			
		||||
|-----------|-----------|-----------|
 | 
			
		||||
| confirm | 点击确认按钮时触发 | - |
 | 
			
		||||
| cancel | 点击取消按钮时触发 | - |
 | 
			
		||||
@ -107,12 +107,12 @@ Filed 默认支持 Input 标签所有的原生属性,比如 `maxlength`、`pla
 | 
			
		||||
### Event
 | 
			
		||||
Filed 默认支持 Input 标签所有的原生事件,如 `focus`、`blur`、`keypress` 等
 | 
			
		||||
 | 
			
		||||
| 事件名称 | 说明 | 回调参数 |
 | 
			
		||||
| 事件 | 说明 | 回调参数 |
 | 
			
		||||
|-----------|-----------|-----------|
 | 
			
		||||
| click-icon | 点击尾部图标时触发 | - |
 | 
			
		||||
 | 
			
		||||
### Slot
 | 
			
		||||
 | 
			
		||||
| name | 描述 |
 | 
			
		||||
| 名称 | 说明 |
 | 
			
		||||
|-----------|-----------|
 | 
			
		||||
| icon | 自定义icon |
 | 
			
		||||
 | 
			
		||||
@ -8,9 +8,10 @@ import {
 | 
			
		||||
  GoodsActionMiniBtn
 | 
			
		||||
} from 'vant';
 | 
			
		||||
 | 
			
		||||
Vue.use(GoodsAction);
 | 
			
		||||
Vue.use(GoodsActionBigBtn);
 | 
			
		||||
Vue.use(GoodsActionMiniBtn);
 | 
			
		||||
Vue
 | 
			
		||||
  .use(GoodsAction)
 | 
			
		||||
  .use(GoodsActionBigBtn)
 | 
			
		||||
  .use(GoodsActionMiniBtn);
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
### 代码演示
 | 
			
		||||
 | 
			
		||||
@ -6,8 +6,7 @@
 | 
			
		||||
``` javascript
 | 
			
		||||
import { Row, Col } from 'vant';
 | 
			
		||||
 | 
			
		||||
Vue.use(Row);
 | 
			
		||||
Vue.use(Col);
 | 
			
		||||
Vue.use(Row).use(Col);
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
### 代码演示
 | 
			
		||||
 | 
			
		||||
@ -9,18 +9,11 @@ Vue.use(Loading);
 | 
			
		||||
 | 
			
		||||
### 代码演示
 | 
			
		||||
 | 
			
		||||
#### 单色圆环
 | 
			
		||||
#### Circular
 | 
			
		||||
 | 
			
		||||
```html
 | 
			
		||||
<van-loading type="circle" color="black" />
 | 
			
		||||
<van-loading type="circle" color="white" />
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
#### 渐变色圆环
 | 
			
		||||
 | 
			
		||||
```html
 | 
			
		||||
<van-loading type="gradient-circle" color="black" />
 | 
			
		||||
<van-loading type="gradient-circle" color="white" />
 | 
			
		||||
<van-loading color="black" />
 | 
			
		||||
<van-loading color="white" />
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
#### Spinner
 | 
			
		||||
@ -30,9 +23,17 @@ Vue.use(Loading);
 | 
			
		||||
<van-loading type="spinner" color="white" />
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
#### Circle
 | 
			
		||||
 | 
			
		||||
```html
 | 
			
		||||
<van-loading type="circle" color="black" />
 | 
			
		||||
<van-loading type="circle" color="white" />
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
### API
 | 
			
		||||
 | 
			
		||||
| 参数 | 说明 | 类型 | 默认值 | 可选值 |
 | 
			
		||||
|-----------|-----------|-----------|-------------|-------------|
 | 
			
		||||
| color | 颜色 | `String` | `black` | `black` `white` |
 | 
			
		||||
| type | 类型 | `String` | `gradient-circle` | `spinner` `circle` |
 | 
			
		||||
| type | 类型 | `String` | `circular` | `spinner` `circle` |
 | 
			
		||||
| size | 大小 | `String` | `30px` | - |
 | 
			
		||||
 | 
			
		||||
@ -57,7 +57,7 @@ export default {
 | 
			
		||||
 | 
			
		||||
### Slot
 | 
			
		||||
 | 
			
		||||
| name | 描述 |
 | 
			
		||||
| 名称 | 说明 |
 | 
			
		||||
|-----------|-----------|
 | 
			
		||||
| title | 自定义标题 |
 | 
			
		||||
| left | 自定义左侧区域内容 |
 | 
			
		||||
 | 
			
		||||
@ -41,7 +41,7 @@ Vue.use(Panel);
 | 
			
		||||
 | 
			
		||||
### Slot
 | 
			
		||||
 | 
			
		||||
| name | 描述 |
 | 
			
		||||
| 名称 | 说明 |
 | 
			
		||||
|-----------|-----------|
 | 
			
		||||
| - | 自定义内容 |
 | 
			
		||||
| header | 自定义 header |
 | 
			
		||||
 | 
			
		||||
@ -5,8 +5,7 @@
 | 
			
		||||
``` javascript
 | 
			
		||||
import { PasswordInput, NumberKeyboard } from 'vant';
 | 
			
		||||
 | 
			
		||||
Vue.use(PasswordInput);
 | 
			
		||||
Vue.use(NumberKeyboard);
 | 
			
		||||
Vue.use(PasswordInput).use(NumberKeyboard);
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
### 代码演示
 | 
			
		||||
 | 
			
		||||
@ -116,6 +116,13 @@ export default {
 | 
			
		||||
};
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
#### 加载状态
 | 
			
		||||
当 Picker 数据是通过异步获取时,可以通过 `loading` 属性显示加载提示
 | 
			
		||||
 | 
			
		||||
```html
 | 
			
		||||
<van-picker :columns="columns" loading />
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
### API
 | 
			
		||||
 | 
			
		||||
| 参数 | 说明 | 类型 | 默认值 | 可选值 |
 | 
			
		||||
@ -123,6 +130,7 @@ export default {
 | 
			
		||||
| columns | 对象数组,配置每一列显示的数据 | `Array` | `[]` | - |
 | 
			
		||||
| show-toolbar | 是否显示顶部栏 | `Boolean` | `false` | - |
 | 
			
		||||
| title | 顶部栏标题 | `String` | `''` | - |
 | 
			
		||||
| loading | 是否显示加载状态 | `Boolean` | `false` | - |
 | 
			
		||||
| confirm-button-text | 确认按钮文字 | `String` | `完成` | - |
 | 
			
		||||
| cancel-button-text | 取消按钮文字 | `String` | `取消` | - |
 | 
			
		||||
| item-height | 选项高度 | `Number` | `44` | - |
 | 
			
		||||
 | 
			
		||||
@ -48,3 +48,4 @@ export default {
 | 
			
		||||
| close-on-click-overlay | 点击蒙层是否关闭 Popup | `Boolean` | `true` | - |
 | 
			
		||||
| transition | transition 名称 | `String` | `popup-slide` | - |
 | 
			
		||||
| prevent-scroll | 是否防止滚动穿透 | `Boolean` | `false` | - |
 | 
			
		||||
| get-container | 指定弹出层挂载的 HTML 节点 | `Function` | - | `() => HTMLElement` |
 | 
			
		||||
 | 
			
		||||
@ -9,9 +9,11 @@ Vue.use(PullRefresh);
 | 
			
		||||
 | 
			
		||||
### 代码演示
 | 
			
		||||
 | 
			
		||||
#### 基础用法
 | 
			
		||||
下拉刷新时会触发 `refresh` 事件,在事件的回调函数中可以进行同步或异步操作,操作完成后将 `v-model` 设置为 `false`,表示加载完成。
 | 
			
		||||
 | 
			
		||||
```html
 | 
			
		||||
<!-- 通过 v-model 控制加载状态 -->
 | 
			
		||||
<van-pull-refresh v-model="isLoading">
 | 
			
		||||
<van-pull-refresh v-model="isLoading" @refresh="onRefresh">
 | 
			
		||||
  <p>刷新次数: {{ count }}</p>
 | 
			
		||||
</van-pull-refresh>
 | 
			
		||||
```
 | 
			
		||||
@ -25,17 +27,15 @@ export default {
 | 
			
		||||
    }
 | 
			
		||||
  },
 | 
			
		||||
 | 
			
		||||
  watch: {
 | 
			
		||||
    isLoading() {
 | 
			
		||||
      if (this.isLoading) {
 | 
			
		||||
  methods: {
 | 
			
		||||
    onRefresh() {
 | 
			
		||||
      setTimeout(() => {
 | 
			
		||||
          Toast('刷新成功');
 | 
			
		||||
        this.$toast('刷新成功');
 | 
			
		||||
        this.isLoading = false;
 | 
			
		||||
        this.count++;
 | 
			
		||||
      }, 500);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
@ -50,9 +50,15 @@ export default {
 | 
			
		||||
| animation-duration | 动画时长 | `Number` | `300` | - |
 | 
			
		||||
| head-height | 顶部内容高度 | `Number` | `50` | - |
 | 
			
		||||
 | 
			
		||||
### Event
 | 
			
		||||
 | 
			
		||||
| 事件名 | 说明 | 参数 |
 | 
			
		||||
|-----------|-----------|-----------|
 | 
			
		||||
| refresh | 下拉刷新时触发 | - |
 | 
			
		||||
 | 
			
		||||
### Slot
 | 
			
		||||
 | 
			
		||||
| name | 描述 |
 | 
			
		||||
| 名称 | 说明 |
 | 
			
		||||
|-----------|-----------|
 | 
			
		||||
| - | 自定义内容 |
 | 
			
		||||
| normal | 非下拉状态时顶部内容 |
 | 
			
		||||
 | 
			
		||||
@ -64,6 +64,6 @@ Search 默认支持 Input 标签所有的原生事件,如 `focus`、`blur`、`
 | 
			
		||||
 | 
			
		||||
### Slot
 | 
			
		||||
 | 
			
		||||
| name | 描述 |
 | 
			
		||||
| 名称 | 说明 |
 | 
			
		||||
|-----------|-----------|
 | 
			
		||||
| action | 自定义搜索框右侧按钮,需要在`showAction`为 true 时才会显示 |
 | 
			
		||||
 | 
			
		||||
@ -20,9 +20,28 @@ Vue.use(Sku);
 | 
			
		||||
  :quota="quota"
 | 
			
		||||
  :quota-used="quotaUsed"
 | 
			
		||||
  :reset-stepper-on-hide="resetStepperOnHide"
 | 
			
		||||
  :reset-selected-sku-on-hide="resetSelectedSkuOnHide"
 | 
			
		||||
  :disable-stepper-input="disableStepperInput"
 | 
			
		||||
  @buy-clicked="handleBuyClicked"
 | 
			
		||||
  @add-cart="handleAddCartClicked"
 | 
			
		||||
  :message-config="messageConfig"
 | 
			
		||||
  @buy-clicked="onBuyClicked"
 | 
			
		||||
  @add-cart="onAddCartClicked"
 | 
			
		||||
/>
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
#### 自定义步进器相关配置
 | 
			
		||||
 | 
			
		||||
```html
 | 
			
		||||
<van-sku
 | 
			
		||||
  v-model="showBase"
 | 
			
		||||
  :sku="sku"
 | 
			
		||||
  :goods="goods"
 | 
			
		||||
  :goods-id="goodsId"
 | 
			
		||||
  :hide-stock="sku.hide_stock"
 | 
			
		||||
  :quota="quota"
 | 
			
		||||
  :quota-used="quotaUsed"
 | 
			
		||||
  :custom-stepper-config="customStepperConfig"
 | 
			
		||||
  @buy-clicked="onBuyClicked"
 | 
			
		||||
  @add-cart="onAddCartClicked"
 | 
			
		||||
/>
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
@ -41,16 +60,14 @@ Vue.use(Sku);
 | 
			
		||||
  :quota-used="quotaUsed"
 | 
			
		||||
  :reset-stepper-on-hide="true"
 | 
			
		||||
  :initial-sku="initialSku"
 | 
			
		||||
  @buy-clicked="handleBuyClicked"
 | 
			
		||||
  @add-cart="handleAddCartClicked"
 | 
			
		||||
  @buy-clicked="onBuyClicked"
 | 
			
		||||
  @add-cart="onAddCartClicked"
 | 
			
		||||
>
 | 
			
		||||
  <!-- 隐藏 sku messages -->
 | 
			
		||||
  <template slot="sku-messages"></template>
 | 
			
		||||
  <!-- 自定义 sku actions -->
 | 
			
		||||
  <template slot="sku-actions" slot-scope="props">
 | 
			
		||||
    <div class="van-sku-actions">
 | 
			
		||||
      <van-button bottom-action @click="handlePointClicked">积分兑换</van-button>
 | 
			
		||||
      <!-- 直接触发 sku 内部事件,通过内部事件执行 handleBuyClicked 回调 -->
 | 
			
		||||
      <van-button bottom-action @click="onPointClicked">积分兑换</van-button>
 | 
			
		||||
      <!-- 直接触发 sku 内部事件,通过内部事件执行 onBuyClicked 回调 -->
 | 
			
		||||
      <van-button type="primary" bottom-action @click="props.skuEventBus.$emit('sku:buy')">买买买</van-button>
 | 
			
		||||
    </div>
 | 
			
		||||
  </template>
 | 
			
		||||
@ -71,8 +88,12 @@ Vue.use(Sku);
 | 
			
		||||
| quota | 限购数(0表示不限购) | `Number` | `0` | - |
 | 
			
		||||
| quota-used | 已经购买过的数量 | `Number` | `0` | - |
 | 
			
		||||
| reset-stepper-on-hide | 窗口隐藏时重置选择的商品数量 | `Boolean` | `false` | - |
 | 
			
		||||
| reset-selected-sku-on-hide | 窗口隐藏时重置已选择的sku | `Boolean` | `false` | - |
 | 
			
		||||
| disable-stepper-input | 是否禁用sku中stepper的input框 | `Boolean` | `false` | - |
 | 
			
		||||
| stepper-title | 数量选择组件左侧文案 | `String` | `购买数量` | - |
 | 
			
		||||
| custom-stepper-config | 步进器相关自定义配置 | `Object` | `{}` | - |
 | 
			
		||||
| message-config | 留言相关配置 | `Object` | `{}` | - |
 | 
			
		||||
| get-container | 指定挂载的 HTML 节点 | `Function` | - | `() => HTMLElement` |
 | 
			
		||||
 | 
			
		||||
### Event
 | 
			
		||||
 | 
			
		||||
@ -81,6 +102,11 @@ Vue.use(Sku);
 | 
			
		||||
| add-cart | 点击添加购物车回调 | skuData: Object |
 | 
			
		||||
| buy-clicked | 点击购买回调 | skuData: Object |
 | 
			
		||||
 | 
			
		||||
### 方法
 | 
			
		||||
 | 
			
		||||
| 函数 | 说明 |
 | 
			
		||||
|-----------|-----------|
 | 
			
		||||
| getSkuData() | 获取当前 skuData |
 | 
			
		||||
 | 
			
		||||
### Slot
 | 
			
		||||
Sku 组件默认划分好了若干区块,这些区块都定义成了 slot,可以按需进行替换。区块顺序见下表:
 | 
			
		||||
@ -88,6 +114,7 @@ Sku 组件默认划分好了若干区块,这些区块都定义成了 slot,
 | 
			
		||||
| 名称 | 说明 | 
 | 
			
		||||
|-----------|-----------|
 | 
			
		||||
| sku-header | 商品信息展示区,包含商品图片、名称、价格等信息 |
 | 
			
		||||
| sku-body-top | sku展示区上方的slot,无默认展示内容,按需使用 |
 | 
			
		||||
| sku-group | 商品sku展示区 |
 | 
			
		||||
| extra-sku-group | 额外商品sku展示区,一般用不到 |
 | 
			
		||||
| sku-stepper | 商品数量选择区 |
 | 
			
		||||
@ -157,6 +184,51 @@ goods: {
 | 
			
		||||
}
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
#### customStepperConfig 对象结构
 | 
			
		||||
```javascript
 | 
			
		||||
customStepperConfig: {
 | 
			
		||||
  // 自定义限购文案
 | 
			
		||||
  quotaText: '每次限购xxx件',
 | 
			
		||||
  // 自定义步进器超过限制时的回调
 | 
			
		||||
  handleOverLimit: (data) => {
 | 
			
		||||
    const { action, limitType, quota, quotaUsed } = data;
 | 
			
		||||
 | 
			
		||||
    if (action === 'minus') {
 | 
			
		||||
      Toast('至少选择一件商品');
 | 
			
		||||
    } else if (action === 'plus') {
 | 
			
		||||
      // const { LIMIT_TYPE } = Sku.skuConstants;
 | 
			
		||||
      if (limitType === LIMIT_TYPE.QUOTA_LIMIT) {
 | 
			
		||||
        let msg = `单次限购${quota}件`;
 | 
			
		||||
        if (quotaUsed > 0) msg += `,您已购买${quotaUsed}`;
 | 
			
		||||
        Toast(msg);
 | 
			
		||||
      } else {
 | 
			
		||||
        Toast('库存不够了~~');
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
#### messageConfig Data Structure
 | 
			
		||||
```javascript
 | 
			
		||||
messageConfig: {
 | 
			
		||||
  // 图片上传回调,需要返回一个promise,promise正确执行的结果需要是一个图片url
 | 
			
		||||
  uploadImg: () => {
 | 
			
		||||
    return new Promise((resolve) => {
 | 
			
		||||
      setTimeout(() => resolve('https://img.yzcdn.cn/upload_files/2017/02/21/FjKTOxjVgnUuPmHJRdunvYky9OHP.jpg!100x100.jpg'), 1000);
 | 
			
		||||
    });
 | 
			
		||||
  },
 | 
			
		||||
  // 最大上传体积 (MB)
 | 
			
		||||
  uploadMaxSize: 3,
 | 
			
		||||
  // placehold配置
 | 
			
		||||
  placeholderMap: {
 | 
			
		||||
    text: 'xxx',
 | 
			
		||||
    tel: 'xxx',
 | 
			
		||||
    ...
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
#### 添加购物车和点击购买回调函数接收的 skuData 对象结构
 | 
			
		||||
```javascript
 | 
			
		||||
skuData: {
 | 
			
		||||
 | 
			
		||||
@ -4,8 +4,7 @@
 | 
			
		||||
``` javascript
 | 
			
		||||
import { Step, Steps } from 'vant';
 | 
			
		||||
 | 
			
		||||
Vue.use(Step);
 | 
			
		||||
Vue.use(Steps);
 | 
			
		||||
Vue.use(Step).use(Steps);
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
### 代码演示
 | 
			
		||||
 | 
			
		||||
@ -80,7 +80,7 @@ Vue.use(SubmitBar);
 | 
			
		||||
 | 
			
		||||
### Slot
 | 
			
		||||
 | 
			
		||||
| Name | 说明 |
 | 
			
		||||
| 名称 | 说明 |
 | 
			
		||||
|-----------|-----------|
 | 
			
		||||
| default | 自定义订单栏左侧内容 |
 | 
			
		||||
| tip | 提示文案中的额外操作和说明 |
 | 
			
		||||
 | 
			
		||||
@ -4,8 +4,7 @@
 | 
			
		||||
``` javascript
 | 
			
		||||
import { Swipe, SwipeItem } from 'vant';
 | 
			
		||||
 | 
			
		||||
Vue.use(Swipe);
 | 
			
		||||
Vue.use(SwipeItem);
 | 
			
		||||
Vue.use(Swipe).use(SwipeItem);
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
### 代码演示
 | 
			
		||||
 | 
			
		||||
@ -4,8 +4,7 @@
 | 
			
		||||
``` javascript
 | 
			
		||||
import { Tab, Tabs } from 'vant';
 | 
			
		||||
 | 
			
		||||
Vue.use(Tab);
 | 
			
		||||
Vue.use(Tabs);
 | 
			
		||||
Vue.use(Tab).use(Tabs);
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
### 代码演示
 | 
			
		||||
@ -111,6 +110,20 @@ export default {
 | 
			
		||||
</van-tabs>
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
#### 自定义标签
 | 
			
		||||
通过 title slot 可以自定义标签内容
 | 
			
		||||
 | 
			
		||||
```html
 | 
			
		||||
<van-tabs :active="active">
 | 
			
		||||
  <van-tab v-for="index in 2">
 | 
			
		||||
    <div slot="title">
 | 
			
		||||
      <van-icon name="more-o" />选项
 | 
			
		||||
    </div>
 | 
			
		||||
    内容 {{ index }}
 | 
			
		||||
  </van-tab>
 | 
			
		||||
</van-tabs>
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
### Tabs API
 | 
			
		||||
 | 
			
		||||
| 参数 | 说明 | 类型 | 默认值 | 可选 |
 | 
			
		||||
@ -128,6 +141,13 @@ export default {
 | 
			
		||||
| title | tab的标题 | `String` | - | - |
 | 
			
		||||
| disabled | 是否禁用这个tab | `Boolean` | `false` | - |
 | 
			
		||||
 | 
			
		||||
### Tab Slot
 | 
			
		||||
 | 
			
		||||
| 名称 | 说明 |
 | 
			
		||||
|-----------|-----------|
 | 
			
		||||
| - | 标签页内容 |
 | 
			
		||||
| title | 自定义标签 |
 | 
			
		||||
 | 
			
		||||
### Tabs Event
 | 
			
		||||
 | 
			
		||||
| 事件名 | 说明 | 参数 |
 | 
			
		||||
 | 
			
		||||
@ -4,8 +4,7 @@
 | 
			
		||||
``` javascript
 | 
			
		||||
import { Tabbar, TabbarItem } from 'vant';
 | 
			
		||||
 | 
			
		||||
Vue.use(Tabbar);
 | 
			
		||||
Vue.use(TabbarItem);
 | 
			
		||||
Vue.use(Tabbar).use(TabbarItem);
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
### 代码演示
 | 
			
		||||
 | 
			
		||||
@ -49,6 +49,6 @@ Vue.use(Tag);
 | 
			
		||||
 | 
			
		||||
### Slot
 | 
			
		||||
 | 
			
		||||
| name | 描述 |
 | 
			
		||||
| 名称 | 说明 |
 | 
			
		||||
|-----------|-----------|
 | 
			
		||||
| - | 自定义 Tag 显示内容 |
 | 
			
		||||
 | 
			
		||||
@ -18,7 +18,10 @@ Toast('我是提示文案,建议不超过十五字~');
 | 
			
		||||
#### 加载提示
 | 
			
		||||
 | 
			
		||||
```javascript
 | 
			
		||||
Toast.loading({ mask: true });
 | 
			
		||||
Toast.loading({
 | 
			
		||||
  mask: true,
 | 
			
		||||
  message: '加载中...'
 | 
			
		||||
});
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -62,6 +65,18 @@ export default {
 | 
			
		||||
}
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
#### 单例模式
 | 
			
		||||
Toast 默认采用单例模式,即同一时间只会存在一个 Toast,如果需要在同一时间弹出多个 Toast,可以参考下面的示例
 | 
			
		||||
 | 
			
		||||
```js
 | 
			
		||||
Toast.allowMultiple();
 | 
			
		||||
 | 
			
		||||
const toast1 = Toast('第一个 Toast');
 | 
			
		||||
const toast2 = Toast.success('第二个 Toast');
 | 
			
		||||
 | 
			
		||||
toast1.clear();
 | 
			
		||||
toast2.clear();
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
### 方法
 | 
			
		||||
@ -72,9 +87,10 @@ export default {
 | 
			
		||||
| Toast.loading | `options | message` | toast 实例 | 展示加载提示 |
 | 
			
		||||
| Toast.success | `options | message` | toast 实例 | 展示成功提示 |
 | 
			
		||||
| Toast.fail | `options | message` | toast 实例 | 展示失败提示 |
 | 
			
		||||
| Toast.clear | `clearAll` | `void` | 关闭提示 |
 | 
			
		||||
| Toast.allowMultiple | - | `void` | 允许同时存在多个 Toast |
 | 
			
		||||
| Toast.setDefaultOptions | `options` | `void` | 修改默认配置,对所有 Toast 生效 |
 | 
			
		||||
| Toast.resetDefaultOptions | - | `void` | 重置默认配置,对所有 Toast 生效 |
 | 
			
		||||
| Toast.clear | - | `void` | 关闭提示 |
 | 
			
		||||
 | 
			
		||||
### Options
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -40,13 +40,26 @@ export default {
 | 
			
		||||
 | 
			
		||||
| 参数 | 说明 | 类型 | 默认值 | 可选值 |
 | 
			
		||||
|-----------|-----------|-----------|-------------|-------------|
 | 
			
		||||
| result-type | 读取文件的方式,以base64的方式读取;以文本的方式读取 | `String` | `dataUrl` | `text` |
 | 
			
		||||
| disable | 是否禁用上传,在图片上传期间设置为true,禁止用户点击此组件上传图片 | `Boolean` | `false` | - |
 | 
			
		||||
| before-read | 读文件之前的钩子,参数为选择的文件,若返回 false 则停止读取文件 | `Function` | - | - |
 | 
			
		||||
| after-read | 文件读完之后回调此函数,参数为 { file:'选择的文件',content:'读的内容' } | `Function` | - | - |
 | 
			
		||||
| result-type | 文件读取结果类型 | `String` | `dataUrl` | `text` |
 | 
			
		||||
| disable | 是否禁用图片上传 | `Boolean` | `false` | - |
 | 
			
		||||
| before-read | 读取前的回调函数,返回 false 可终止文件读取 | `Function` | - | - |
 | 
			
		||||
| after-read | 读取完成后的回调函数 | `Function` | - | - |
 | 
			
		||||
| max-size | 文件大小限制,单位为 byte | `Number` | - | - |
 | 
			
		||||
 | 
			
		||||
### Event
 | 
			
		||||
 | 
			
		||||
| 事件名 | 说明 | 参数 |
 | 
			
		||||
|-----------|-----------|-----------|
 | 
			
		||||
| oversize | 文件大小超过限制时触发 | 同 after-read |
 | 
			
		||||
 | 
			
		||||
### Slot
 | 
			
		||||
 | 
			
		||||
| name | 描述 |
 | 
			
		||||
| 名称 | 说明 |
 | 
			
		||||
|-----------|-----------|
 | 
			
		||||
| - | 自定义上传显示图标 |
 | 
			
		||||
| - | 自定义 uploader 内容 |
 | 
			
		||||
 | 
			
		||||
### afterRead 回调参数
 | 
			
		||||
| key | 说明 | 类型 |
 | 
			
		||||
|-----------|-----------|-----------|
 | 
			
		||||
| file | 文件解析后的 file 对象 | `Object` |
 | 
			
		||||
| content | 文件内容 | `String` |
 | 
			
		||||
@ -1,7 +1,37 @@
 | 
			
		||||
<template>
 | 
			
		||||
  <div>
 | 
			
		||||
    <van-nav-bar
 | 
			
		||||
      v-show="title"
 | 
			
		||||
      fixed
 | 
			
		||||
      class="van-doc-nav-bar"
 | 
			
		||||
      :title="title"
 | 
			
		||||
      left-arrow
 | 
			
		||||
      :left-text="$t('back')"
 | 
			
		||||
      @click-left="onBack"
 | 
			
		||||
    />
 | 
			
		||||
    <router-view />
 | 
			
		||||
  </div>
 | 
			
		||||
</template>
 | 
			
		||||
 | 
			
		||||
<script>
 | 
			
		||||
import { camelize } from 'packages/utils';
 | 
			
		||||
 | 
			
		||||
export default {
 | 
			
		||||
  computed: {
 | 
			
		||||
    title() {
 | 
			
		||||
      const name = this.$route.name;
 | 
			
		||||
      return name ? camelize(name.split('/').pop()) : '';
 | 
			
		||||
    }
 | 
			
		||||
  },
 | 
			
		||||
 | 
			
		||||
  methods: {
 | 
			
		||||
    onBack() {
 | 
			
		||||
      history.back();
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
</script>
 | 
			
		||||
 | 
			
		||||
<style lang="postcss">
 | 
			
		||||
body {
 | 
			
		||||
  color: #333;
 | 
			
		||||
@ -10,4 +40,14 @@ body {
 | 
			
		||||
  font-family: Arial, Helvetica, "STHeiti STXihei", "Microsoft YaHei", Tohoma, sans-serif;
 | 
			
		||||
  -webkit-font-smoothing: antialiased;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.van-doc-nav-bar {
 | 
			
		||||
  .van-nav-bar__title {
 | 
			
		||||
    text-transform: capitalize;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.van-doc-demo-section {
 | 
			
		||||
  padding-top: 46px;
 | 
			
		||||
}
 | 
			
		||||
</style>
 | 
			
		||||
 | 
			
		||||
@ -4,7 +4,7 @@ module.exports = {
 | 
			
		||||
    header: {
 | 
			
		||||
      logo: {
 | 
			
		||||
        image: 'https://img.yzcdn.cn/public_files/2017/12/18/fd78cf6bb5d12e2a119d0576bedfd230.png',
 | 
			
		||||
        title: 'Zan UI',
 | 
			
		||||
        title: 'Vant',
 | 
			
		||||
        href: 'http://www.youzanyun.com/zanui'
 | 
			
		||||
      },
 | 
			
		||||
      nav: {
 | 
			
		||||
@ -80,6 +80,10 @@ module.exports = {
 | 
			
		||||
                path: '/cell',
 | 
			
		||||
                title: 'Cell - 单元格'
 | 
			
		||||
              },
 | 
			
		||||
              {
 | 
			
		||||
                path: '/circle',
 | 
			
		||||
                title: 'Circle - 环形进度条'
 | 
			
		||||
              },
 | 
			
		||||
              {
 | 
			
		||||
                path: '/icon',
 | 
			
		||||
                title: 'Icon - 图标'
 | 
			
		||||
@ -282,7 +286,7 @@ module.exports = {
 | 
			
		||||
    header: {
 | 
			
		||||
      logo: {
 | 
			
		||||
        image: 'https://img.yzcdn.cn/public_files/2017/12/18/fd78cf6bb5d12e2a119d0576bedfd230.png',
 | 
			
		||||
        title: 'Zan UI',
 | 
			
		||||
        title: 'Vant',
 | 
			
		||||
        href: 'http://www.youzanyun.com/zanui'
 | 
			
		||||
      },
 | 
			
		||||
      nav: {
 | 
			
		||||
@ -358,6 +362,10 @@ module.exports = {
 | 
			
		||||
                path: '/cell',
 | 
			
		||||
                title: 'Cell'
 | 
			
		||||
              },
 | 
			
		||||
              {
 | 
			
		||||
                path: '/circle',
 | 
			
		||||
                title: 'Circle'
 | 
			
		||||
              },
 | 
			
		||||
              {
 | 
			
		||||
                path: '/icon',
 | 
			
		||||
                title: 'Icon'
 | 
			
		||||
 | 
			
		||||
@ -9,12 +9,13 @@ import 'packages/vant-css/src/icon-local.css';
 | 
			
		||||
import 'vant-doc/src/helper/touch-simulator';
 | 
			
		||||
import './components/nprogress.css';
 | 
			
		||||
 | 
			
		||||
Vue.use(Vant);
 | 
			
		||||
Vue.use(VantDoc);
 | 
			
		||||
Vue.use(Lazyload, {
 | 
			
		||||
Vue
 | 
			
		||||
  .use(Vant)
 | 
			
		||||
  .use(VantDoc)
 | 
			
		||||
  .use(VueRouter)
 | 
			
		||||
  .use(Lazyload, {
 | 
			
		||||
    lazyComponent: true
 | 
			
		||||
});
 | 
			
		||||
Vue.use(VueRouter);
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
const routesConfig = routes(true);
 | 
			
		||||
const router = new VueRouter({
 | 
			
		||||
@ -23,6 +24,13 @@ const router = new VueRouter({
 | 
			
		||||
  routes: routesConfig
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
router.afterEach(() => {
 | 
			
		||||
  if (router.currentRoute.name) {
 | 
			
		||||
    window.scrollTo(0, 0);
 | 
			
		||||
  }
 | 
			
		||||
  Vue.nextTick(() => window.syncPath());
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
window.vueRouter = router;
 | 
			
		||||
 | 
			
		||||
new Vue({ // eslint-disable-line
 | 
			
		||||
 | 
			
		||||
@ -6,8 +6,7 @@ import VantDoc from 'vant-doc';
 | 
			
		||||
import isMobile from './utils/is-mobile';
 | 
			
		||||
import './components/nprogress.css';
 | 
			
		||||
 | 
			
		||||
Vue.use(VueRouter);
 | 
			
		||||
Vue.use(VantDoc);
 | 
			
		||||
Vue.use(VueRouter).use(VantDoc);
 | 
			
		||||
 | 
			
		||||
const routesConfig = routes();
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -5,6 +5,7 @@
 | 
			
		||||
  <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
 | 
			
		||||
  <link rel="shortcut icon" href="https://img.yzcdn.cn/zanui/vant/vant-2017-12-18.ico">
 | 
			
		||||
  <title>Vant - 有赞移动端 Vue 组件库</title>
 | 
			
		||||
  <script>window.Promise || document.write('<script src="//b.yzcdn.cn/huiyi/build/h5/js/pinkie.min.js"><\/script>');</script>
 | 
			
		||||
</head>
 | 
			
		||||
<body ontouchstart>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -10,20 +10,22 @@ window.syncPath = function(dir) {
 | 
			
		||||
  const router = window.vueRouter;
 | 
			
		||||
  const isInIframe = window !== window.top;
 | 
			
		||||
  const currentDir = router.history.current.path;
 | 
			
		||||
  const iframe = document.querySelector('iframe');
 | 
			
		||||
 | 
			
		||||
  if (!isInIframe && !isMobile && iframe) {
 | 
			
		||||
  const pathParts = currentDir.split('/');
 | 
			
		||||
  let lang = pathParts[0];
 | 
			
		||||
  if (currentDir[0] === '/') {
 | 
			
		||||
    lang = pathParts[1];
 | 
			
		||||
  }
 | 
			
		||||
    setLang(lang);
 | 
			
		||||
 | 
			
		||||
  if (!isInIframe && !isMobile) {
 | 
			
		||||
    const iframe = document.querySelector('iframe');
 | 
			
		||||
    if (iframe) {
 | 
			
		||||
      iframeReady(iframe, () => {
 | 
			
		||||
        iframe.contentWindow.changePath(lang, currentDir);
 | 
			
		||||
      });
 | 
			
		||||
    }
 | 
			
		||||
  } else if (isInIframe) {
 | 
			
		||||
    window.top.changePath(lang, currentDir);
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
window.changePath = function(lang, path = '') {
 | 
			
		||||
 | 
			
		||||
@ -12,6 +12,7 @@ const langMap = {
 | 
			
		||||
    messages: zhCN
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
let currentLang = '';
 | 
			
		||||
 | 
			
		||||
setLang(getDefaultLang());
 | 
			
		||||
 | 
			
		||||
@ -30,6 +31,11 @@ function getDefaultLang() {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export function setLang(lang) {
 | 
			
		||||
  if (currentLang === lang) {
 | 
			
		||||
    return;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  currentLang = lang;
 | 
			
		||||
  if (window.localStorage) {
 | 
			
		||||
    localStorage.setItem('VANT_LANGUAGE', lang);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										2
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										2
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							@ -1,6 +1,6 @@
 | 
			
		||||
{
 | 
			
		||||
  "name": "vant",
 | 
			
		||||
  "version": "0.12.4",
 | 
			
		||||
  "version": "0.12.8",
 | 
			
		||||
  "lockfileVersion": 1,
 | 
			
		||||
  "requires": true,
 | 
			
		||||
  "dependencies": {
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										30
									
								
								package.json
									
									
									
									
									
								
							
							
						
						
									
										30
									
								
								package.json
									
									
									
									
									
								
							@ -1,6 +1,6 @@
 | 
			
		||||
{
 | 
			
		||||
  "name": "vant",
 | 
			
		||||
  "version": "0.12.4",
 | 
			
		||||
  "version": "0.12.8",
 | 
			
		||||
  "description": "A Vue.js 2.0 Mobile UI at YouZan",
 | 
			
		||||
  "main": "lib/vant.js",
 | 
			
		||||
  "style": "lib/vant-css/index.css",
 | 
			
		||||
@ -50,7 +50,7 @@
 | 
			
		||||
    "vue": ">= 2.5.0"
 | 
			
		||||
  },
 | 
			
		||||
  "devDependencies": {
 | 
			
		||||
    "autoprefixer": "^7.2.4",
 | 
			
		||||
    "autoprefixer": "^7.2.5",
 | 
			
		||||
    "avoriaz": "2.0.0",
 | 
			
		||||
    "babel-cli": "^6.26.0",
 | 
			
		||||
    "babel-core": "^6.26.0",
 | 
			
		||||
@ -63,10 +63,10 @@
 | 
			
		||||
    "chai": "^4.1.2",
 | 
			
		||||
    "codecov": "^3.0.0",
 | 
			
		||||
    "cross-env": "^5.1.3",
 | 
			
		||||
    "css-loader": "^0.28.8",
 | 
			
		||||
    "dependency-tree": "^5.12.0",
 | 
			
		||||
    "eslint": "^4.15.0",
 | 
			
		||||
    "eslint-plugin-vue": "^4.1.0",
 | 
			
		||||
    "css-loader": "^0.28.9",
 | 
			
		||||
    "dependency-tree": "^6.0.0",
 | 
			
		||||
    "eslint": "^4.17.0",
 | 
			
		||||
    "eslint-plugin-vue": "^4.2.2",
 | 
			
		||||
    "extract-text-webpack-plugin": "3.0.2",
 | 
			
		||||
    "fast-vue-md-loader": "^1.0.3",
 | 
			
		||||
    "friendly-errors-webpack-plugin": "^1.6.1",
 | 
			
		||||
@ -82,30 +82,30 @@
 | 
			
		||||
    "karma-spec-reporter": "^0.0.32",
 | 
			
		||||
    "karma-webpack": "^2.0.9",
 | 
			
		||||
    "mocha": "^4.0.1",
 | 
			
		||||
    "postcss": "^6.0.16",
 | 
			
		||||
    "postcss": "^6.0.17",
 | 
			
		||||
    "postcss-calc": "^6.0.0",
 | 
			
		||||
    "postcss-easy-import": "^3.0.0",
 | 
			
		||||
    "postcss-loader": "^2.0.10",
 | 
			
		||||
    "precss": "2.0.0",
 | 
			
		||||
    "progress-bar-webpack-plugin": "^1.10.0",
 | 
			
		||||
    "rimraf": "^2.5.4",
 | 
			
		||||
    "shelljs": "^0.7.8",
 | 
			
		||||
    "shelljs": "^0.8.1",
 | 
			
		||||
    "sinon": "^2.4.1",
 | 
			
		||||
    "sinon-chai": "^2.12.0",
 | 
			
		||||
    "style-loader": "^0.19.1",
 | 
			
		||||
    "style-loader": "^0.20.1",
 | 
			
		||||
    "uppercamelcase": "^3.0.0",
 | 
			
		||||
    "url-loader": "^0.6.2",
 | 
			
		||||
    "vant-doc": "1.0.1",
 | 
			
		||||
    "vant-doc": "1.0.3",
 | 
			
		||||
    "vue": "^2.5.13",
 | 
			
		||||
    "vue-loader": "^13.6.2",
 | 
			
		||||
    "vue-loader": "^14.1.1",
 | 
			
		||||
    "vue-router": "^3.0.1",
 | 
			
		||||
    "vue-sfc-compiler": "^0.0.7",
 | 
			
		||||
    "vue-style-loader": "^3.0.0",
 | 
			
		||||
    "vue-sfc-compiler": "^0.0.8",
 | 
			
		||||
    "vue-style-loader": "^3.1.2",
 | 
			
		||||
    "vue-template-compiler": "^2.5.13",
 | 
			
		||||
    "vue-template-es2015-compiler": "^1.6.0",
 | 
			
		||||
    "webpack": "^3.10.0",
 | 
			
		||||
    "webpack-bundle-analyzer": "^2.9.1",
 | 
			
		||||
    "webpack-dev-server": "2.9.7",
 | 
			
		||||
    "webpack-bundle-analyzer": "^2.10.0",
 | 
			
		||||
    "webpack-dev-server": "2.11.1",
 | 
			
		||||
    "webpack-merge": "^4.1.1"
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -17,7 +17,7 @@
 | 
			
		||||
            <span class="van-actionsheet__name">{{ item.name }}</span>
 | 
			
		||||
            <span class="van-actionsheet__subname" v-if="item.subname">{{ item.subname }}</span>
 | 
			
		||||
          </template>
 | 
			
		||||
          <loading v-else class="van-actionsheet__loading" type="circle" />
 | 
			
		||||
          <loading v-else class="van-actionsheet__loading" size="20px" />
 | 
			
		||||
        </li>
 | 
			
		||||
      </ul>
 | 
			
		||||
      <div
 | 
			
		||||
@ -60,10 +60,6 @@ export default create({
 | 
			
		||||
    }
 | 
			
		||||
  },
 | 
			
		||||
 | 
			
		||||
  mounted() {
 | 
			
		||||
    this.value && this.open();
 | 
			
		||||
  },
 | 
			
		||||
 | 
			
		||||
  methods: {
 | 
			
		||||
    onClickItem(item) {
 | 
			
		||||
      if (typeof item.callback === 'function') {
 | 
			
		||||
 | 
			
		||||
@ -44,6 +44,7 @@
 | 
			
		||||
        :error="errorInfo.postal_code"
 | 
			
		||||
        @focus="onFocus('postal_code')"
 | 
			
		||||
      />
 | 
			
		||||
      <slot />
 | 
			
		||||
      <switch-cell
 | 
			
		||||
        v-if="showSetDefault"
 | 
			
		||||
        v-show="!hideBottomFields"
 | 
			
		||||
@ -158,6 +159,7 @@ export default create({
 | 
			
		||||
    hideBottomFields() {
 | 
			
		||||
      return this.searchResult.length && this.detailFocused;
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    computedAddressText() {
 | 
			
		||||
      return this.addressText || this.$t('addressText');
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@ -5,7 +5,10 @@
 | 
			
		||||
    show-toolbar
 | 
			
		||||
    value-key="name"
 | 
			
		||||
    :title="title"
 | 
			
		||||
    :loading="loading"
 | 
			
		||||
    :columns="columns"
 | 
			
		||||
    :item-height="itemHeight"
 | 
			
		||||
    :visible-item-count="visibleItemCount"
 | 
			
		||||
    @change="onChange"
 | 
			
		||||
    @confirm="$emit('confirm', $event)"
 | 
			
		||||
    @cancel="$emit('cancel', $event)"
 | 
			
		||||
@ -26,7 +29,10 @@ export default create({
 | 
			
		||||
  props: {
 | 
			
		||||
    value: {},
 | 
			
		||||
    title: String,
 | 
			
		||||
    loading: Boolean,
 | 
			
		||||
    areaList: Object,
 | 
			
		||||
    itemHeight: Number,
 | 
			
		||||
    visibleItemCount: Number,
 | 
			
		||||
    // 省市县显示列数,3-省市县,2-省市,1-省
 | 
			
		||||
    columnsNum: {
 | 
			
		||||
      type: [String, Number],
 | 
			
		||||
@ -94,17 +100,16 @@ export default create({
 | 
			
		||||
 | 
			
		||||
    // 根据省市县类型和对应的`code`获取对应列表
 | 
			
		||||
    getList(type, code) {
 | 
			
		||||
      if (!this.listValid) {
 | 
			
		||||
        return [];
 | 
			
		||||
      }
 | 
			
		||||
      let result = [];
 | 
			
		||||
 | 
			
		||||
      if (this.listValid && (type === 'province' || code)) {
 | 
			
		||||
        const { areaList } = this;
 | 
			
		||||
        const list =
 | 
			
		||||
          type === 'province'
 | 
			
		||||
            ? areaList.province_list
 | 
			
		||||
            : type === 'city' ? areaList.city_list : areaList.county_list;
 | 
			
		||||
 | 
			
		||||
      let result = Object.keys(list).map(code => ({
 | 
			
		||||
        result = Object.keys(list).map(code => ({
 | 
			
		||||
          code,
 | 
			
		||||
          name: list[code]
 | 
			
		||||
        }));
 | 
			
		||||
@ -112,6 +117,7 @@ export default create({
 | 
			
		||||
        if (type !== 'province' && code) {
 | 
			
		||||
          result = result.filter(item => item.code.indexOf(code) === 0);
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      result.unshift({
 | 
			
		||||
        code: '-1',
 | 
			
		||||
 | 
			
		||||
@ -16,14 +16,9 @@
 | 
			
		||||
    ]"
 | 
			
		||||
    @click="onClick"
 | 
			
		||||
  >
 | 
			
		||||
    <loading
 | 
			
		||||
      v-if="loading"
 | 
			
		||||
      class="van-button__icon-loading"
 | 
			
		||||
      type="circle"
 | 
			
		||||
      :color="type === 'default' ? 'black' : 'white'"
 | 
			
		||||
    />
 | 
			
		||||
    <loading v-if="loading" size="20px" :color="type === 'default' ? 'black' : 'white'" />
 | 
			
		||||
    <span class="van-button__text">
 | 
			
		||||
      <slot />
 | 
			
		||||
      <slot>{{ text }}</slot>
 | 
			
		||||
    </span>
 | 
			
		||||
  </component>
 | 
			
		||||
</template>
 | 
			
		||||
@ -35,6 +30,7 @@ export default create({
 | 
			
		||||
  name: 'van-button',
 | 
			
		||||
 | 
			
		||||
  props: {
 | 
			
		||||
    text: String,
 | 
			
		||||
    block: Boolean,
 | 
			
		||||
    loading: Boolean,
 | 
			
		||||
    disabled: Boolean,
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										126
									
								
								packages/circle/index.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										126
									
								
								packages/circle/index.vue
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,126 @@
 | 
			
		||||
<template>
 | 
			
		||||
  <div class="van-circle" :style="style">
 | 
			
		||||
    <svg viewBox="0 0 1060 1060">
 | 
			
		||||
      <path class="van-circle__hover" :style="hoverStyle" :d="path" />
 | 
			
		||||
      <path class="van-circle__layer" :style="layerStyle" :d="path" />
 | 
			
		||||
    </svg>
 | 
			
		||||
    <slot>
 | 
			
		||||
      <div class="van-circle__text">{{ text }}</div>
 | 
			
		||||
    </slot>
 | 
			
		||||
  </div>
 | 
			
		||||
</template>
 | 
			
		||||
 | 
			
		||||
<script>
 | 
			
		||||
import { create } from '../utils';
 | 
			
		||||
import { raf, cancel } from '../utils/raf';
 | 
			
		||||
 | 
			
		||||
export default create({
 | 
			
		||||
  name: 'van-circle',
 | 
			
		||||
 | 
			
		||||
  props: {
 | 
			
		||||
    text: String,
 | 
			
		||||
    value: Number,
 | 
			
		||||
    speed: Number,
 | 
			
		||||
    size: {
 | 
			
		||||
      type: String,
 | 
			
		||||
      default: '100px'
 | 
			
		||||
    },
 | 
			
		||||
    fill: {
 | 
			
		||||
      type: String,
 | 
			
		||||
      default: 'none'
 | 
			
		||||
    },
 | 
			
		||||
    rate: {
 | 
			
		||||
      type: Number,
 | 
			
		||||
      default: 100
 | 
			
		||||
    },
 | 
			
		||||
    layerColor: {
 | 
			
		||||
      type: String,
 | 
			
		||||
      default: '#fff'
 | 
			
		||||
    },
 | 
			
		||||
    color: {
 | 
			
		||||
      type: String,
 | 
			
		||||
      default: '#38f'
 | 
			
		||||
    },
 | 
			
		||||
    strokeWidth: {
 | 
			
		||||
      type: Number,
 | 
			
		||||
      default: 40
 | 
			
		||||
    },
 | 
			
		||||
    clockwise: {
 | 
			
		||||
      type: Boolean,
 | 
			
		||||
      default: true
 | 
			
		||||
    }
 | 
			
		||||
  },
 | 
			
		||||
 | 
			
		||||
  beforeCreate() {
 | 
			
		||||
    this.perimeter = 3140;
 | 
			
		||||
    this.path = 'M 530 530 m -500, 0 a 500, 500 0 1, 1 1000, 0 a 500, 500 0 1, 1 -1000, 0';
 | 
			
		||||
  },
 | 
			
		||||
 | 
			
		||||
  computed: {
 | 
			
		||||
    style() {
 | 
			
		||||
      return {
 | 
			
		||||
        width: this.size,
 | 
			
		||||
        height: this.size
 | 
			
		||||
      };
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    layerStyle() {
 | 
			
		||||
      let offset = this.perimeter * (100 - this.value) / 100;
 | 
			
		||||
      offset = this.clockwise ? offset : this.perimeter * 2 - offset;
 | 
			
		||||
      return {
 | 
			
		||||
        stroke: `${this.color}`,
 | 
			
		||||
        strokeDashoffset: `${offset}px`,
 | 
			
		||||
        strokeWidth: `${this.strokeWidth + 1}px`
 | 
			
		||||
      };
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    hoverStyle() {
 | 
			
		||||
      return {
 | 
			
		||||
        fill: `${this.fill}`,
 | 
			
		||||
        stroke: `${this.layerColor}`,
 | 
			
		||||
        strokeWidth: `${this.strokeWidth}px`
 | 
			
		||||
      };
 | 
			
		||||
    }
 | 
			
		||||
  },
 | 
			
		||||
 | 
			
		||||
  mounted() {
 | 
			
		||||
    this.render();
 | 
			
		||||
  },
 | 
			
		||||
 | 
			
		||||
  watch: {
 | 
			
		||||
    rate() {
 | 
			
		||||
      this.render();
 | 
			
		||||
    }
 | 
			
		||||
  },
 | 
			
		||||
 | 
			
		||||
  methods: {
 | 
			
		||||
    render() {
 | 
			
		||||
      this.startTime = Date.now();
 | 
			
		||||
      this.startRate = this.value;
 | 
			
		||||
      this.endRate = this.format(this.rate);
 | 
			
		||||
      this.increase = this.endRate > this.startRate;
 | 
			
		||||
      this.duration = Math.abs((this.startRate - this.endRate) * 1000 / this.speed);
 | 
			
		||||
      if (this.speed) {
 | 
			
		||||
        cancel(this.rafId);
 | 
			
		||||
        this.rafId = raf(this.animate);
 | 
			
		||||
      } else {
 | 
			
		||||
        this.$emit('input', this.endRate);
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    animate() {
 | 
			
		||||
      const now = Date.now();
 | 
			
		||||
      const progress = Math.min((now - this.startTime) / this.duration, 1);
 | 
			
		||||
      const rate = progress * (this.endRate - this.startRate) + this.startRate;
 | 
			
		||||
      this.$emit('input', this.format(parseFloat(rate.toFixed(1))));
 | 
			
		||||
      if (this.increase ? rate < this.endRate : rate > this.endRate) {
 | 
			
		||||
        this.rafId = raf(this.animate);
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    format(rate) {
 | 
			
		||||
      return Math.min(Math.max(rate, 0), 100);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
});
 | 
			
		||||
</script>
 | 
			
		||||
@ -3,7 +3,7 @@
 | 
			
		||||
    <cell-group class="van-coupon-list__top" v-if="showExchangeBar">
 | 
			
		||||
      <field
 | 
			
		||||
        class="van-coupon-list__filed van-hairline--surround"
 | 
			
		||||
        v-model="exchangeCode"
 | 
			
		||||
        v-model="currentCode"
 | 
			
		||||
        :placeholder="inputPlaceholder || $t('placeholder')"
 | 
			
		||||
        :maxlength="20"
 | 
			
		||||
      />
 | 
			
		||||
@ -11,11 +11,11 @@
 | 
			
		||||
        size="small"
 | 
			
		||||
        type="danger"
 | 
			
		||||
        class="van-coupon-list__exchange"
 | 
			
		||||
        :disabled="exchangeButtonDisabled || !exchangeCode.length"
 | 
			
		||||
        :text="exchangeButtonText || $t('exchange')"
 | 
			
		||||
        :loading="exchangeButtonLoading"
 | 
			
		||||
        :disabled="buttonDisabled"
 | 
			
		||||
        @click="onClickExchangeButton"
 | 
			
		||||
      >
 | 
			
		||||
        {{ exchangeButtonText || $t('exchange') }}
 | 
			
		||||
      </van-button>
 | 
			
		||||
      />
 | 
			
		||||
    </cell-group>
 | 
			
		||||
    <div class="van-coupon-list__list" :class="{ 'van-coupon-list--with-exchange': showExchangeBar }" ref="list">
 | 
			
		||||
      <coupon-item
 | 
			
		||||
@ -24,7 +24,7 @@
 | 
			
		||||
        :key="item.id || item.name"
 | 
			
		||||
        :data="item"
 | 
			
		||||
        :chosen="index === chosenCoupon"
 | 
			
		||||
        @click.native="onClickCoupon(index)"
 | 
			
		||||
        @click.native="$emit('change', index)"
 | 
			
		||||
      />
 | 
			
		||||
      <h3 v-if="disabledCoupons.length">{{ disabledListTitle || $t('disabled') }}</h3>
 | 
			
		||||
      <coupon-item
 | 
			
		||||
@ -40,11 +40,10 @@
 | 
			
		||||
    </div>
 | 
			
		||||
    <div
 | 
			
		||||
      v-show="showCloseButton"
 | 
			
		||||
      v-text="closeButtonText || $t('close')"
 | 
			
		||||
      class="van-coupon-list__close van-hairline--top"
 | 
			
		||||
      @click="onClickNotUse"
 | 
			
		||||
    >
 | 
			
		||||
      {{ closeButtonText || $t('close') }}
 | 
			
		||||
    </div>
 | 
			
		||||
      @click="$emit('change', -1)"
 | 
			
		||||
    />
 | 
			
		||||
  </div>
 | 
			
		||||
</template>
 | 
			
		||||
 | 
			
		||||
@ -54,7 +53,6 @@ import Cell from '../cell';
 | 
			
		||||
import CellGroup from '../cell-group';
 | 
			
		||||
import CouponItem from './Item';
 | 
			
		||||
import Field from '../field';
 | 
			
		||||
import Popup from '../popup';
 | 
			
		||||
import VanButton from '../button';
 | 
			
		||||
 | 
			
		||||
export default create({
 | 
			
		||||
@ -65,15 +63,25 @@ export default create({
 | 
			
		||||
    Cell,
 | 
			
		||||
    CellGroup,
 | 
			
		||||
    Field,
 | 
			
		||||
    Popup,
 | 
			
		||||
    CouponItem
 | 
			
		||||
  },
 | 
			
		||||
 | 
			
		||||
  model: {
 | 
			
		||||
    prop: 'code'
 | 
			
		||||
  },
 | 
			
		||||
 | 
			
		||||
  props: {
 | 
			
		||||
    code: String,
 | 
			
		||||
    closeButtonText: String,
 | 
			
		||||
    inputPlaceholder: String,
 | 
			
		||||
    disabledListTitle: String,
 | 
			
		||||
    exchangeButtonText: String,
 | 
			
		||||
    exchangeButtonLoading: Boolean,
 | 
			
		||||
    exchangeButtonDisabled: Boolean,
 | 
			
		||||
    exchangeMinLength: {
 | 
			
		||||
      type: Number,
 | 
			
		||||
      default: 1
 | 
			
		||||
    },
 | 
			
		||||
    chosenCoupon: {
 | 
			
		||||
      type: Number,
 | 
			
		||||
      default: -1
 | 
			
		||||
@ -86,10 +94,6 @@ export default create({
 | 
			
		||||
      type: Array,
 | 
			
		||||
      default: () => []
 | 
			
		||||
    },
 | 
			
		||||
    exchangeButtonDisabled: {
 | 
			
		||||
      type: Boolean,
 | 
			
		||||
      default: false
 | 
			
		||||
    },
 | 
			
		||||
    displayedCouponIndex: {
 | 
			
		||||
      type: Number,
 | 
			
		||||
      default: -1
 | 
			
		||||
@ -104,16 +108,34 @@ export default create({
 | 
			
		||||
    }
 | 
			
		||||
  },
 | 
			
		||||
 | 
			
		||||
  watch: {
 | 
			
		||||
    displayedCouponIndex(val) {
 | 
			
		||||
      this.scrollToShowCoupon(val);
 | 
			
		||||
  data() {
 | 
			
		||||
    return {
 | 
			
		||||
      currentCode: this.code || ''
 | 
			
		||||
    };
 | 
			
		||||
  },
 | 
			
		||||
 | 
			
		||||
  computed: {
 | 
			
		||||
    buttonDisabled() {
 | 
			
		||||
      return (
 | 
			
		||||
        !this.exchangeButtonLoading &&
 | 
			
		||||
        (this.exchangeButtonDisabled ||
 | 
			
		||||
          this.currentCode.length < this.exchangeMinLength)
 | 
			
		||||
      );
 | 
			
		||||
    }
 | 
			
		||||
  },
 | 
			
		||||
 | 
			
		||||
  data() {
 | 
			
		||||
    return {
 | 
			
		||||
      exchangeCode: ''
 | 
			
		||||
    };
 | 
			
		||||
  watch: {
 | 
			
		||||
    code(code) {
 | 
			
		||||
      this.currentCode = code;
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    currentCode(code) {
 | 
			
		||||
      this.$emit('input', code);
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    displayedCouponIndex(val) {
 | 
			
		||||
      this.scrollToShowCoupon(val);
 | 
			
		||||
    }
 | 
			
		||||
  },
 | 
			
		||||
 | 
			
		||||
  mounted() {
 | 
			
		||||
@ -121,17 +143,16 @@ export default create({
 | 
			
		||||
  },
 | 
			
		||||
 | 
			
		||||
  methods: {
 | 
			
		||||
    onClickNotUse() {
 | 
			
		||||
      this.$emit('change', -1);
 | 
			
		||||
    },
 | 
			
		||||
    onClickCoupon(index) {
 | 
			
		||||
      this.$emit('change', index);
 | 
			
		||||
    },
 | 
			
		||||
    onClickExchangeButton() {
 | 
			
		||||
      this.$emit('exchange', this.exchangeCode);
 | 
			
		||||
      this.exchangeCode = '';
 | 
			
		||||
      this.$emit('exchange', this.currentCode);
 | 
			
		||||
 | 
			
		||||
      // auto clear currentCode when not use v-model
 | 
			
		||||
      if (!this.code) {
 | 
			
		||||
        this.currentCode = '';
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    // 滚动到特定优惠券的位置
 | 
			
		||||
 | 
			
		||||
    // scroll to show specific coupon
 | 
			
		||||
    scrollToShowCoupon(index) {
 | 
			
		||||
      if (index === -1) {
 | 
			
		||||
        return;
 | 
			
		||||
 | 
			
		||||
@ -50,14 +50,11 @@ export default create({
 | 
			
		||||
    callback: Function,
 | 
			
		||||
    confirmButtonText: String,
 | 
			
		||||
    cancelButtonText: String,
 | 
			
		||||
    showCancelButton: Boolean,
 | 
			
		||||
    showConfirmButton: {
 | 
			
		||||
      type: Boolean,
 | 
			
		||||
      default: true
 | 
			
		||||
    },
 | 
			
		||||
    showCancelButton: {
 | 
			
		||||
      type: Boolean,
 | 
			
		||||
      default: false
 | 
			
		||||
    },
 | 
			
		||||
    overlay: {
 | 
			
		||||
      type: Boolean,
 | 
			
		||||
      default: true
 | 
			
		||||
 | 
			
		||||
@ -1,31 +1,10 @@
 | 
			
		||||
import Vue from 'vue';
 | 
			
		||||
import DialogComponent from './dialog';
 | 
			
		||||
import VanDialog from './dialog';
 | 
			
		||||
 | 
			
		||||
let instance;
 | 
			
		||||
 | 
			
		||||
const defaultOptions = {
 | 
			
		||||
  value: true,
 | 
			
		||||
  title: '',
 | 
			
		||||
  message: '',
 | 
			
		||||
  overlay: true,
 | 
			
		||||
  lockOnScroll: true,
 | 
			
		||||
  confirmButtonText: '',
 | 
			
		||||
  cancelButtonText: '',
 | 
			
		||||
  showConfirmButton: true,
 | 
			
		||||
  showCancelButton: false,
 | 
			
		||||
  closeOnClickOverlay: false,
 | 
			
		||||
  callback: action => {
 | 
			
		||||
    instance[action === 'confirm' ? 'resolve' : 'reject'](action);
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
let currentDefaultOptions = {
 | 
			
		||||
  ...defaultOptions
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
const initInstance = () => {
 | 
			
		||||
  const DialogConstructor = Vue.extend(DialogComponent);
 | 
			
		||||
  instance = new DialogConstructor({
 | 
			
		||||
  instance = new (Vue.extend(VanDialog))({
 | 
			
		||||
    el: document.createElement('div')
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
@ -50,13 +29,29 @@ const Dialog = options => {
 | 
			
		||||
  });
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
Dialog.defaultOptions = {
 | 
			
		||||
  value: true,
 | 
			
		||||
  title: '',
 | 
			
		||||
  message: '',
 | 
			
		||||
  overlay: true,
 | 
			
		||||
  lockOnScroll: true,
 | 
			
		||||
  confirmButtonText: '',
 | 
			
		||||
  cancelButtonText: '',
 | 
			
		||||
  showConfirmButton: true,
 | 
			
		||||
  showCancelButton: false,
 | 
			
		||||
  closeOnClickOverlay: false,
 | 
			
		||||
  callback: action => {
 | 
			
		||||
    instance[action === 'confirm' ? 'resolve' : 'reject'](action);
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
Dialog.alert = options => Dialog({
 | 
			
		||||
  ...currentDefaultOptions,
 | 
			
		||||
  ...Dialog.currentOptions,
 | 
			
		||||
  ...options
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
Dialog.confirm = options => Dialog({
 | 
			
		||||
  ...currentDefaultOptions,
 | 
			
		||||
  ...Dialog.currentOptions,
 | 
			
		||||
  showCancelButton: true,
 | 
			
		||||
  ...options
 | 
			
		||||
});
 | 
			
		||||
@ -65,22 +60,19 @@ Dialog.close = () => {
 | 
			
		||||
  instance.value = false;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
Dialog.setDefaultOptions = (options = {}) => {
 | 
			
		||||
  currentDefaultOptions = {
 | 
			
		||||
    ...currentDefaultOptions,
 | 
			
		||||
    ...options
 | 
			
		||||
  };
 | 
			
		||||
Dialog.setDefaultOptions = options => {
 | 
			
		||||
  Object.assign(Dialog.currentOptions, options);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
Dialog.resetDefaultOptions = () => {
 | 
			
		||||
  currentDefaultOptions = {
 | 
			
		||||
    ...defaultOptions
 | 
			
		||||
  };
 | 
			
		||||
  Dialog.currentOptions = { ...Dialog.defaultOptions };
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
Dialog.install = () => {
 | 
			
		||||
  Vue.component(VanDialog.name, VanDialog);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
Vue.prototype.$dialog = Dialog;
 | 
			
		||||
Dialog.resetDefaultOptions();
 | 
			
		||||
 | 
			
		||||
export default Dialog;
 | 
			
		||||
export {
 | 
			
		||||
  DialogComponent as Dialog
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
@ -12,6 +12,7 @@ import CellGroup from './cell-group';
 | 
			
		||||
import CellSwipe from './cell-swipe';
 | 
			
		||||
import Checkbox from './checkbox';
 | 
			
		||||
import CheckboxGroup from './checkbox-group';
 | 
			
		||||
import Circle from './circle';
 | 
			
		||||
import Col from './col';
 | 
			
		||||
import ContactCard from './contact-card';
 | 
			
		||||
import ContactEdit from './contact-edit';
 | 
			
		||||
@ -62,7 +63,7 @@ import TreeSelect from './tree-select';
 | 
			
		||||
import Uploader from './uploader';
 | 
			
		||||
import Waterfall from './waterfall';
 | 
			
		||||
 | 
			
		||||
const version = '0.12.4';
 | 
			
		||||
const version = '0.12.8';
 | 
			
		||||
const components = [
 | 
			
		||||
  Actionsheet,
 | 
			
		||||
  AddressEdit,
 | 
			
		||||
@ -77,6 +78,7 @@ const components = [
 | 
			
		||||
  CellSwipe,
 | 
			
		||||
  Checkbox,
 | 
			
		||||
  CheckboxGroup,
 | 
			
		||||
  Circle,
 | 
			
		||||
  Col,
 | 
			
		||||
  ContactCard,
 | 
			
		||||
  ContactEdit,
 | 
			
		||||
@ -84,6 +86,7 @@ const components = [
 | 
			
		||||
  CouponCell,
 | 
			
		||||
  CouponList,
 | 
			
		||||
  DatetimePicker,
 | 
			
		||||
  Dialog,
 | 
			
		||||
  Field,
 | 
			
		||||
  GoodsAction,
 | 
			
		||||
  GoodsActionBigBtn,
 | 
			
		||||
@ -148,6 +151,7 @@ export {
 | 
			
		||||
  CellSwipe,
 | 
			
		||||
  Checkbox,
 | 
			
		||||
  CheckboxGroup,
 | 
			
		||||
  Circle,
 | 
			
		||||
  Col,
 | 
			
		||||
  ContactCard,
 | 
			
		||||
  ContactEdit,
 | 
			
		||||
 | 
			
		||||
@ -1,7 +1,10 @@
 | 
			
		||||
<template>
 | 
			
		||||
  <div class="van-loading" :class="['van-loading--' + type, 'van-loading--' + color]">
 | 
			
		||||
    <span class="van-loading__spinner" :class="['van-loading__spinner--' + type, 'van-loading__spinner--' + color]">
 | 
			
		||||
      <i v-if="type === 'spinner'" v-for="item in 12" />
 | 
			
		||||
  <div class="van-loading" :class="['van-loading--' + type, 'van-loading--' + color]" :style="style">
 | 
			
		||||
    <span class="van-loading__spinner" :class="'van-loading__spinner--' + type">
 | 
			
		||||
      <i v-for="item in (type === 'spinner' ? 12 : 0)" />
 | 
			
		||||
      <svg v-if="type === 'circular'" class="van-loading__circular" viewBox="25 25 50 50">
 | 
			
		||||
        <circle cx="50" cy="50" r="20" fill="none"/>
 | 
			
		||||
      </svg>
 | 
			
		||||
    </span>
 | 
			
		||||
  </div>
 | 
			
		||||
</template>
 | 
			
		||||
@ -11,16 +14,28 @@ import install from '../utils/install';
 | 
			
		||||
 | 
			
		||||
export default {
 | 
			
		||||
  install,
 | 
			
		||||
 | 
			
		||||
  name: 'van-loading',
 | 
			
		||||
 | 
			
		||||
  props: {
 | 
			
		||||
    size: String,
 | 
			
		||||
    type: {
 | 
			
		||||
      type: String,
 | 
			
		||||
      default: 'gradient-circle'
 | 
			
		||||
      default: 'circular'
 | 
			
		||||
    },
 | 
			
		||||
    color: {
 | 
			
		||||
      type: String,
 | 
			
		||||
      default: 'black'
 | 
			
		||||
    }
 | 
			
		||||
  },
 | 
			
		||||
 | 
			
		||||
  computed: {
 | 
			
		||||
    style() {
 | 
			
		||||
      return this.size ? {
 | 
			
		||||
        width: this.size,
 | 
			
		||||
        height: this.size
 | 
			
		||||
      } : {};
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
</script>
 | 
			
		||||
 | 
			
		||||
@ -113,10 +113,12 @@ export default {
 | 
			
		||||
  },
 | 
			
		||||
  vanSkuMessages: {
 | 
			
		||||
    fill: 'Please fill',
 | 
			
		||||
    upload: 'Please upload',
 | 
			
		||||
    number: 'Please fill in the correct number format message',
 | 
			
		||||
    email: 'Please fill in the correct email message',
 | 
			
		||||
    idcard: 'Please fill in the correct ID number message',
 | 
			
		||||
    overlimit: 'not more than 200 words',
 | 
			
		||||
    onePic: 'only one picture',
 | 
			
		||||
    placeholder: {
 | 
			
		||||
      'id_no': 'Idcard Number',
 | 
			
		||||
      text: 'Text',
 | 
			
		||||
@ -127,6 +129,15 @@ export default {
 | 
			
		||||
      textarea: 'Text'
 | 
			
		||||
    }
 | 
			
		||||
  },
 | 
			
		||||
  vanSkuImgUploader: {
 | 
			
		||||
    or: 'Or',
 | 
			
		||||
    uploading: 'Uploading...',
 | 
			
		||||
    rephoto: 'Take Again',
 | 
			
		||||
    photo: 'Take',
 | 
			
		||||
    reselect: 'Reselect',
 | 
			
		||||
    select: 'Select Photo',
 | 
			
		||||
    maxSize: maxSize => `The upload limit is up to ${maxSize}MB,please try to compress the photo`
 | 
			
		||||
  },
 | 
			
		||||
  vanSkuStepper: {
 | 
			
		||||
    title: 'Quantity',
 | 
			
		||||
    remain: count => `Remain ${count} items`,
 | 
			
		||||
 | 
			
		||||
@ -117,10 +117,12 @@ export default {
 | 
			
		||||
  },
 | 
			
		||||
  vanSkuMessages: {
 | 
			
		||||
    fill: '请填写',
 | 
			
		||||
    upload: '请上传',
 | 
			
		||||
    number: '请填写正确的数字格式留言',
 | 
			
		||||
    email: '请填写正确的邮箱',
 | 
			
		||||
    'id_no': '请填写正确的身份证号码',
 | 
			
		||||
    overlimit: '写的太多了,不要超过200字',
 | 
			
		||||
    onePic: '仅限一张',
 | 
			
		||||
    placeholder: {
 | 
			
		||||
      'id_no': '输入18位身份证号码',
 | 
			
		||||
      text: '输入文本',
 | 
			
		||||
@ -131,6 +133,15 @@ export default {
 | 
			
		||||
      textarea: '点击填写段落文本'
 | 
			
		||||
    }
 | 
			
		||||
  },
 | 
			
		||||
  vanSkuImgUploader: {
 | 
			
		||||
    or: '或',
 | 
			
		||||
    uploading: '正在上传...',
 | 
			
		||||
    rephoto: '重拍',
 | 
			
		||||
    photo: '拍照',
 | 
			
		||||
    reselect: '重新选择照片',
 | 
			
		||||
    select: '选择照片',
 | 
			
		||||
    maxSize: maxSize => `最大可上传图片为${maxSize}MB,请尝试压缩图片尺寸`
 | 
			
		||||
  },
 | 
			
		||||
  vanSkuStepper: {
 | 
			
		||||
    title: '购买数量',
 | 
			
		||||
    remain: count => `剩余${count}件`,
 | 
			
		||||
 | 
			
		||||
@ -19,6 +19,8 @@ export default {
 | 
			
		||||
    zIndex: [String, Number],
 | 
			
		||||
    // prevent touchmove scroll
 | 
			
		||||
    preventScroll: Boolean,
 | 
			
		||||
    // return the mount node for popup
 | 
			
		||||
    getContainer: Function,
 | 
			
		||||
    // prevent body scroll
 | 
			
		||||
    lockOnScroll: {
 | 
			
		||||
      type: Boolean,
 | 
			
		||||
@ -26,17 +28,8 @@ export default {
 | 
			
		||||
    }
 | 
			
		||||
  },
 | 
			
		||||
 | 
			
		||||
  watch: {
 | 
			
		||||
    value(val) {
 | 
			
		||||
      this[val ? 'open' : 'close']();
 | 
			
		||||
    }
 | 
			
		||||
  },
 | 
			
		||||
 | 
			
		||||
  beforeMount() {
 | 
			
		||||
    this._popupId = 'popup-' + context.plusKey('idSeed');
 | 
			
		||||
  },
 | 
			
		||||
 | 
			
		||||
  data() {
 | 
			
		||||
    this._popupId = 'popup-' + context.plusKey('idSeed');
 | 
			
		||||
    return {
 | 
			
		||||
      opened: false,
 | 
			
		||||
      pos: {
 | 
			
		||||
@ -46,6 +39,29 @@ export default {
 | 
			
		||||
    };
 | 
			
		||||
  },
 | 
			
		||||
 | 
			
		||||
  watch: {
 | 
			
		||||
    value(val) {
 | 
			
		||||
      this[val ? 'open' : 'close']();
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    getContainer() {
 | 
			
		||||
      this.move();
 | 
			
		||||
    }
 | 
			
		||||
  },
 | 
			
		||||
 | 
			
		||||
  mounted() {
 | 
			
		||||
    if (this.getContainer) {
 | 
			
		||||
      this.move();
 | 
			
		||||
    }
 | 
			
		||||
    if (this.value) {
 | 
			
		||||
      this.open();
 | 
			
		||||
    }
 | 
			
		||||
  },
 | 
			
		||||
 | 
			
		||||
  beforeDestroy() {
 | 
			
		||||
    this.doAfterClose();
 | 
			
		||||
  },
 | 
			
		||||
 | 
			
		||||
  methods: {
 | 
			
		||||
    recordPosition(e) {
 | 
			
		||||
      this.pos = {
 | 
			
		||||
@ -65,12 +81,14 @@ export default {
 | 
			
		||||
 | 
			
		||||
      let status = '11';
 | 
			
		||||
 | 
			
		||||
      /* istanbul ignore next */
 | 
			
		||||
      if (scrollTop === 0) {
 | 
			
		||||
        status = offsetHeight >= scrollHeight ? '00' : '01';
 | 
			
		||||
      } else if (scrollTop + offsetHeight >= scrollHeight) {
 | 
			
		||||
        status = '10';
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      /* istanbul ignore next */
 | 
			
		||||
      if (
 | 
			
		||||
        status !== '11' &&
 | 
			
		||||
        isVertical &&
 | 
			
		||||
@ -82,6 +100,7 @@ export default {
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    open() {
 | 
			
		||||
      /* istanbul ignore next */
 | 
			
		||||
      if (this.opened || this.$isServer) {
 | 
			
		||||
        return;
 | 
			
		||||
      }
 | 
			
		||||
@ -137,10 +156,14 @@ export default {
 | 
			
		||||
        off(document, 'touchstart', this.recordPosition);
 | 
			
		||||
        off(document, 'touchmove', this.watchTouchMove);
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
  beforeDestroy() {
 | 
			
		||||
    this.doAfterClose();
 | 
			
		||||
    move() {
 | 
			
		||||
      if (this.getContainer) {
 | 
			
		||||
        this.getContainer().appendChild(this.$el);
 | 
			
		||||
      } else if (this.$parent) {
 | 
			
		||||
        this.$parent.$el.appendChild(this.$el);
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
Some files were not shown because too many files have changed in this diff Show More
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user