diff --git a/docs/examples-docs/pay-order.md b/docs/examples-docs/pay-order.md new file mode 100644 index 000000000..1df37b4a2 --- /dev/null +++ b/docs/examples-docs/pay-order.md @@ -0,0 +1,87 @@ +## PayOrder 支付订单 + + + + + +### 使用指南 +``` javascript +import { PayOrder } from 'vant'; + +Vue.component(PayOrder.name, PayOrder); +``` + +### 代码演示 + +#### 基础用法 + +:::demo 基础用法 +```html + +``` +::: + +#### 禁用状态 +禁用状态下不会触发`submit`事件 + +:::demo 禁用状态 +```html + +``` +::: + +#### 加载状态 +加载状态下不会触发`submit`事件 +:::demo 加载状态 +```html + +``` +::: + +### API + +| 参数 | 说明 | 类型 | 默认值 | 必须 | +|-----------|-----------|-----------|-------------|-------------| +| price | 价格(单位分) | `Number` | | 是 | +| button-text | 按钮文字 | `String` | | 是 | +| button-type | 按钮类型 | `String` | `danger` | 否 | +| tip | 提示文案 | `String` | | 否 | +| disabled | 是否禁用按钮 | `Boolean` | `false` | 否 | +| loading | 是否显示加载中的按钮 | `Boolean` | `false` | 否 | + +### Event + +| 事件名 | 说明 | 参数 | +|-----------|-----------|-----------| +| submit | 按钮点击事件回调 | - | diff --git a/docs/src/doc.config.js b/docs/src/doc.config.js index 364ce26be..64da013eb 100644 --- a/docs/src/doc.config.js +++ b/docs/src/doc.config.js @@ -189,6 +189,10 @@ module.exports = { "path": "/express-way", "title": "ExpressWay 配送方式" }, + { + "path": "/pay-order", + "title": "PayOrder 提交订单栏" + }, { "path": "/switch-cell", "title": "SwitchCell 开关单元格" diff --git a/packages/index.js b/packages/index.js index a3d2fba30..c262f1834 100644 --- a/packages/index.js +++ b/packages/index.js @@ -19,6 +19,7 @@ import Lazyload from './lazyload'; import Loading from './loading'; import NoticeBar from './notice-bar'; import Panel from './panel'; +import PayOrder from './pay-order'; import Picker from './picker'; import Popup from './popup'; import Progress from './progress'; @@ -60,6 +61,7 @@ const components = [ Loading, NoticeBar, Panel, + PayOrder, Picker, Popup, Progress, @@ -117,6 +119,7 @@ export { Loading, NoticeBar, Panel, + PayOrder, Picker, Popup, Progress, diff --git a/packages/pay-order/index.vue b/packages/pay-order/index.vue new file mode 100644 index 000000000..9f452672e --- /dev/null +++ b/packages/pay-order/index.vue @@ -0,0 +1,63 @@ + + + diff --git a/packages/vant-css/src/index.css b/packages/vant-css/src/index.css index 04bb59827..89a4b636a 100644 --- a/packages/vant-css/src/index.css +++ b/packages/vant-css/src/index.css @@ -33,3 +33,4 @@ @import './notice-bar.css'; @import './switch-cell.css'; @import './express-way.css'; +@import './pay-order.css'; diff --git a/packages/vant-css/src/pay-order.css b/packages/vant-css/src/pay-order.css new file mode 100644 index 000000000..f674c6f04 --- /dev/null +++ b/packages/vant-css/src/pay-order.css @@ -0,0 +1,59 @@ +.van-pay-order { + left: 0; + bottom: 0; + width: 100%; + z-index: 100; + position: fixed; + user-select: none; + + &__tip { + color: #f60; + font-size: 12px; + line-height: 18px; + padding: 10px 10px; + background-color: #fff6e1; + } + + &__bar { + height: 50px; + display: flex; + line-height: 50px; + background-color: #fff; + } + + &__price { + flex: 1; + text-align: right; + padding-right: 10px; + } + + &__price-text { + color: #666; + font-size: 16px; + } + + &__price-interger { + color: #f44; + font-size: 16px; + } + + &__price-decimal { + color: #f44; + font-size: 12px; + } + + .van-button { + width: 110px; + height: 100%; + border-radius: 0; + + &--disabled { + border: none; + } + + .van-loading__spinner--white { + border-color: rgba(255,255,255, .8); + border-top-color: transparent; + } + } +} diff --git a/test/unit/specs/pay-order.spec.js b/test/unit/specs/pay-order.spec.js new file mode 100644 index 000000000..3a4836535 --- /dev/null +++ b/test/unit/specs/pay-order.spec.js @@ -0,0 +1,99 @@ +import PayOrder from 'packages/pay-order'; +import { mount } from 'avoriaz'; +import { DOMChecker } from '../utils'; + +describe('PayOrder', () => { + let wrapper; + afterEach(() => { + wrapper && wrapper.destroy(); + }); + + it('default', () => { + const props = { + price: 3050, + buttonText: '提交订单', + tip: '您的收货地址不支持同城送, 我们已为您推荐快递' + }; + + wrapper = mount(PayOrder, { + propsData: props + }); + + DOMChecker(wrapper, { + text: { + '.van-button__text': props.buttonText, + '.van-pay-order__price-interger': '¥30.', + '.van-pay-order__price-decimal': '50', + '.van-pay-order__tip': props.tip + } + }); + }); + + it('no tip', () => { + wrapper = mount(PayOrder, { + propsData: { + price: 3005, + buttonText: '提交订单' + } + }); + + DOMChecker(wrapper, { + text: { + '.van-button__text': '提交订单', + '.van-pay-order__price-interger': '¥30.', + '.van-pay-order__price-decimal': '05', + '.van-pay-order__tip': '' + } + }); + }); + + it('handle submit', () => { + wrapper = mount(PayOrder, { + propsData: { + price: 3005, + buttonText: '提交订单' + } + }); + + const submitSpyFunc = sinon.spy(); + wrapper.vm.$on('submit', submitSpyFunc); + wrapper.find('.van-button')[0].trigger('click'); + setTimeout(() => { + expect(submitSpyFunc.calledOnce).to.be.true; + }, 300); + }); + + it('can not submit when disabled', () => { + wrapper = mount(PayOrder, { + propsData: { + price: 3005, + disabled: true, + buttonText: '提交订单' + } + }); + + const submitSpyFunc = sinon.spy(); + wrapper.vm.$on('submit', submitSpyFunc); + wrapper.find('.van-button')[0].trigger('click'); + setTimeout(() => { + expect(submitSpyFunc.calledOnce).to.be.false; + }, 300); + }); + + it('can not submit when loading', () => { + wrapper = mount(PayOrder, { + propsData: { + price: 3005, + loading: true, + buttonText: '提交订单' + } + }); + + const submitSpyFunc = sinon.spy(); + wrapper.vm.$on('submit', submitSpyFunc); + wrapper.find('.van-button')[0].trigger('click'); + setTimeout(() => { + expect(submitSpyFunc.calledOnce).to.be.false; + }, 300); + }); +});