diff --git a/docs/examples-docs/address-list.md b/docs/examples-docs/address-list.md index 419621805..740a17adb 100644 --- a/docs/examples-docs/address-list.md +++ b/docs/examples-docs/address-list.md @@ -110,7 +110,7 @@ export default { |-----------|-----------|-----------| | add | 点击新增按钮时触发 | - | | edit | 点击编辑按钮时触发 | item: 当前地址对象,index: 索引 | -| change | 切换选中的地址时触发 | item: 当前地址对象,index: 索引 | +| select | 切换选中的地址时触发 | item: 当前地址对象,index: 索引 | ### 数据格式 #### 地址列表字段说明 diff --git a/docs/examples-docs/contact.md b/docs/examples-docs/contact.md new file mode 100644 index 000000000..ee4e52710 --- /dev/null +++ b/docs/examples-docs/contact.md @@ -0,0 +1,245 @@ + + + + +## Contact 联系人 +通过 Contact 组件可以实现联系人的展示、选择、编辑等功能。 + +### 使用指南 +``` javascript +import { ContactCard, ContactList, ContactEdit } from 'vant'; + +Vue.component(ContactCard.name, ContactCard); +Vue.component(ContactList.name, ContactList); +Vue.component(ContactEdit.name, ContactEdit); +``` + +### 代码演示 + +#### 基础用法 + +:::demo 基础用法 +```html + + + + + + + + + + + + +``` + +``` javascript +export default { + data() { + return { + chosenContactId: null, + editingContact: {}, + showList: false, + showEdit: false, + isEdit: false, + list: [{ + name: '张三', + tel: '13000000000', + id: 0 + }] + }; + }, + + computed: { + cardType() { + return this.chosenContactId !== null ? 'edit' : 'add'; + }, + + currentContact() { + const id = this.chosenContactId; + return id !== null ? this.list.filter(item => item.id === id)[0] : {}; + } + }, + + methods: { + // 添加联系人 + onAdd() { + this.editingContact = { id: this.list.length }; + this.isEdit = false; + this.showEdit = true; + }, + + // 编辑联系人 + onEdit(item) { + this.isEdit = true; + this.showEdit = true; + this.editingContact = item; + }, + + // 选中联系人 + onSelect() { + this.showList = false; + }, + + // 保存联系人 + onSave(info) { + this.showEdit = false; + this.showList = false; + + if (this.isEdit) { + this.list = this.list.map(item => item.id === info.id ? info : item); + } else { + this.list.push(info); + } + this.chosenContactId = info.id; + }, + + // 删除联系人 + onDelete(info) { + this.showEdit = false; + this.list = this.list.filter(item => item.id !== info.id); + if (this.chosenContactId === info.id) { + this.chosenContactId = null; + } + } + } +}; +``` +::: + +### ContactCard API +| 参数 | 说明 | 类型 | 默认值 | 可选值 | +|-----------|-----------|-----------|-------------|-------------| +| type | 类型,分为添加和编辑两种样式 | `String` | `add` | `edit` | +| addText | 添加时的文案提示 | `String` | `添加订单联系人信息` | - | +| name | 联系人姓名 | `String` | - | - | +| tel | 联系人手机号 | `String` | - | - | + +### ContactList API +| 参数 | 说明 | 类型 | 默认值 | 可选值 | +|-----------|-----------|-----------|-------------|-------------| +| v-model | 当前选中联系人的 id | `String | Number` | - | - | +| addText | 新建按钮文案 | `String` | `新建联系人` | - | +| list | 联系人列表 | `Array` | `[]` | - | + +### ContactList Event + +| 事件名 | 说明 | 参数 | +|-----------|-----------|-----------| +| add | 点击新增按钮时触发 | - | +| edit | 点击编辑按钮时触发 | item: 当前联系人对象,index: 索引 | +| select | 切换选中的联系人时触发 | item: 当前联系人对象,index: 索引 | + + +### ContactEdit API +| 参数 | 说明 | 类型 | 默认值 | 可选值 | +|-----------|-----------|-----------|-------------|-------------| +| contactInfo | 联系人信息 | `Object` | `[]` | - | +| isEdit | 是否为编辑联系人 | `Boolean` | `false` | - | +| isSaving | 是否显示保存按钮加载动画 | `Boolean` | `false` | - | +| isDeleting | 是否显示删除按钮加载动画 | `Boolean` | `false` | - | + +### ContactEdit Event + +| 事件名 | 说明 | 参数 | +|-----------|-----------|-----------| +| save | 点击保存按钮时触发 | content:表单内容 | +| delete | 点击删除按钮时触发 | content:表单内容 | + +### 数据格式 + +#### 联系人数据格式 +| key | 说明 | 类型 | +|-----------|-----------|-----------| +| id | 每位联系人的唯一标识 | `String | Number` | +| name | 联系人姓名 | `String` | +| tel | 联系人手机号 | `String` | diff --git a/docs/src/doc.config.js b/docs/src/doc.config.js index 1302676f1..bce7e4213 100644 --- a/docs/src/doc.config.js +++ b/docs/src/doc.config.js @@ -226,6 +226,10 @@ module.exports = { "path": "/area", "title": "Area 省市区选择" }, + { + "path": "/contact", + "title": "Contact 联系人" + }, { "path": "/coupon", "title": "Coupon 优惠券选择器" diff --git a/package.json b/package.json index 75bb24762..126b07191 100644 --- a/package.json +++ b/package.json @@ -98,7 +98,7 @@ "mocha": "^3.4.2", "postcss": "^6.0.10", "postcss-calc": "^6.0.0", - "postcss-easy-import": "^2.1.0", + "postcss-easy-import": "^3.0.0", "postcss-loader": "^2.0.6", "precss": "2.0.0", "progress-bar-webpack-plugin": "^1.10.0", diff --git a/packages/address-list/index.vue b/packages/address-list/index.vue index 9088f2489..7ce04b9b1 100644 --- a/packages/address-list/index.vue +++ b/packages/address-list/index.vue @@ -3,7 +3,7 @@ - + {{ item.name }},{{ item.tel }} 收货地址:{{ item.address }} diff --git a/packages/contact-card/index.vue b/packages/contact-card/index.vue new file mode 100644 index 000000000..af42b6c79 --- /dev/null +++ b/packages/contact-card/index.vue @@ -0,0 +1,47 @@ + + + + + + {{ addText }} + + + + + 联系人:{{ name }} + 联系电话:{{ tel }} + + + + + + + + diff --git a/packages/contact-edit/index.vue b/packages/contact-edit/index.vue new file mode 100644 index 000000000..946a2a819 --- /dev/null +++ b/packages/contact-edit/index.vue @@ -0,0 +1,123 @@ + + + + + + + + + + 保存 + 删除联系人 + + + + + diff --git a/packages/contact-list/index.vue b/packages/contact-list/index.vue new file mode 100644 index 000000000..5f6bcbb78 --- /dev/null +++ b/packages/contact-list/index.vue @@ -0,0 +1,48 @@ + + + + + + + 联系人:{{ item.name }} + 联系电话:{{ item.tel }} + + + + + + + + + + diff --git a/packages/index.js b/packages/index.js index d0e94fa22..27587e7f4 100644 --- a/packages/index.js +++ b/packages/index.js @@ -12,6 +12,9 @@ import CellSwipe from './cell-swipe'; import Checkbox from './checkbox'; import CheckboxGroup from './checkbox-group'; import Col from './col'; +import ContactCard from './contact-card'; +import ContactEdit from './contact-edit'; +import ContactList from './contact-list'; import CouponCell from './coupon-cell'; import CouponList from './coupon-list'; import DatetimePicker from './datetime-picker'; @@ -70,6 +73,9 @@ const components = [ Checkbox, CheckboxGroup, Col, + ContactCard, + ContactEdit, + ContactList, CouponCell, CouponList, DatetimePicker, @@ -138,6 +144,9 @@ export { Checkbox, CheckboxGroup, Col, + ContactCard, + ContactEdit, + ContactList, CouponCell, CouponList, DatetimePicker, diff --git a/packages/vant-css/src/contact-card.css b/packages/vant-css/src/contact-card.css new file mode 100644 index 000000000..9daea32a5 --- /dev/null +++ b/packages/vant-css/src/contact-card.css @@ -0,0 +1,59 @@ +@import './common/var.css'; + +.van-contact-card { + position: relative; + background-color: #fff; + + &--add { + line-height: 40px; + + .van-contact-card__icon { + color: $blue; + font-size: 40px; + } + } + + &--edit { + .van-contact-card__icon { + font-size: 18px; + vertical-align: top; + } + } + + &__content { + padding: 15px 10px; + } + + &__icon, + &__text { + display: inline-block; + vertical-align: middle; + } + + &__icon { + margin-right: 10px; + } + + &__text { + line-height: 20px; + font-size: 14px; + } + + &__arrow { + top: 50%; + right: 10px; + font-size: 12px; + position: absolute; + color: $gray-dark; + transform: translate3d(0, -50%, 0); + } + + &::after { + content: ' '; + display: block; + width: 100%; + height: 2px; + background-image: url('data:image/false;base64,iVBORw0KGgoAAAANSUhEUgAAAEQAAAAECAYAAAA3S5neAAAAAXNSR0IArs4c6QAAAIpJREFUOBHF0iESg1AMBNDshx4H0+EUSCxnQKBAVDIMjhnOgO8NOADTI7V/CcjU58ckq/aJQHTYto2u7bpdB3hjXWvb+Ry/jTC6e6CeQBIK6i3KJWfZbHsuDxiTeCCcc+m6SlGFhTnkHcty2J5y+lVM4NHv2D+vxxEkxsGiXHIIf99x95JJPIDcnhMVeyVty5S/SAAAAABJRU5ErkJggg=='); + background-size: 34px 2px; + } +} diff --git a/packages/vant-css/src/contact-edit.css b/packages/vant-css/src/contact-edit.css new file mode 100644 index 000000000..f11dc27a2 --- /dev/null +++ b/packages/vant-css/src/contact-edit.css @@ -0,0 +1,21 @@ +@import './common/var.css'; + +.van-contact-edit { + &__buttons { + padding: 20px 10px; + } + + &__default { + .van-cell__title { + line-height: 31px; + } + + .van-cell__value { + height: 31px; + } + } + + .van-button { + margin-bottom: 10px; + } +} diff --git a/packages/vant-css/src/contact-list.css b/packages/vant-css/src/contact-list.css new file mode 100644 index 000000000..8f50fccbe --- /dev/null +++ b/packages/vant-css/src/contact-list.css @@ -0,0 +1,58 @@ +@import './common/var.css'; + +.van-contact-list { + height: 100%; + + .van-cell__value { + color: $text-color; + padding-right: 34px; + position: relative; + } + + .van-radio__label { + margin-left: 32px; + } + + .van-radio__input { + top: 50%; + left: 0; + position: absolute; + transform: translate(0, -50%); + } + + .van-icon-checked { + color: $blue; + } + + &__text { + font-size: 14px; + color: #333; + line-height: 1.5; + } + + &__edit { + position: absolute; + top: 50%; + right: 4px; + font-size: 24px; + color: $gray-dark; + transform: translate(0, -50%); + } + + &__add { + position: fixed; + left: 0; + bottom: 0; + z-index: 9999; + padding-left: 15px; + + .van-cell__text { + font-size: 16px; + } + + .van-icon-add { + color: $blue; + font-size: 20px; + } + } +} \ No newline at end of file diff --git a/packages/vant-css/src/index.css b/packages/vant-css/src/index.css index cee46fcaa..86db9d790 100644 --- a/packages/vant-css/src/index.css +++ b/packages/vant-css/src/index.css @@ -52,6 +52,9 @@ /* business components */ @import './address-edit.css'; @import './address-list.css'; +@import './contact-card.css'; +@import './contact-list.css'; +@import './contact-edit.css'; @import './coupon-list.css'; @import './goods-action.css'; @import './submit-bar.css'; diff --git a/test/unit/specs/address-edit.spec.js b/test/unit/specs/address-edit.spec.js index 7f12bb249..16bcd9089 100644 --- a/test/unit/specs/address-edit.spec.js +++ b/test/unit/specs/address-edit.spec.js @@ -231,7 +231,6 @@ describe('AddressEdit', () => { wrapper.vm.onDeleteAddress(); setTimeout(() => { - expect(document.querySelectorAll('.van-dialog').length).to.equal(0); wrapper.vm.isDeleting = false; wrapper.vm.$nextTick(() => { deleteButton.trigger('click'); diff --git a/test/unit/specs/address-list.spec.js b/test/unit/specs/address-list.spec.js index 8e2caa176..8d8edd976 100644 --- a/test/unit/specs/address-list.spec.js +++ b/test/unit/specs/address-list.spec.js @@ -63,7 +63,7 @@ describe('AddressList', () => { wrapper.find('.van-address-list__edit')[0].trigger('click'); }); - it('listen to change event', (done) => { + it('listen to select event', (done) => { wrapper = mount(AddressList, { propsData: { value: '1', @@ -71,7 +71,7 @@ describe('AddressList', () => { } }); - wrapper.vm.$on('change', (item, index) => { + wrapper.vm.$on('select', (item, index) => { expect(item.id).to.equal('3'); done(); }); diff --git a/test/unit/specs/contact.spec.js b/test/unit/specs/contact.spec.js new file mode 100644 index 000000000..ed7e8044c --- /dev/null +++ b/test/unit/specs/contact.spec.js @@ -0,0 +1,256 @@ +import ContactCard from 'packages/contact-card'; +import ContactList from 'packages/contact-list'; +import ContactEdit from 'packages/contact-edit'; +import { mount } from 'avoriaz'; + +describe('ContactCard', () => { + let wrapper; + afterEach(() => { + wrapper && wrapper.destroy(); + }); + + it('create a ContactCard', () => { + wrapper = mount(ContactCard); + expect(wrapper.hasClass('van-contact-card')).to.be.true; + }); + + it('create a add ContactCard', done => { + wrapper = mount(ContactCard, { + propsData: { + type: 'add' + } + }); + + expect(wrapper.hasClass('van-contact-card')).to.be.true; + expect(wrapper.find('.van-contact-card__text')[0].text()).to.equal('添加订单联系人信息'); + + wrapper.vm.addText = '测试文案'; + wrapper.vm.$nextTick(() => { + expect(wrapper.find('.van-contact-card__text')[0].text()).to.equal('测试文案'); + done(); + }); + }); + + it('create a edit ContactCard', () => { + wrapper = mount(ContactCard, { + propsData: { + type: 'edit', + tel: '13000000000', + name: '测试姓名' + } + }); + + expect(wrapper.hasClass('van-contact-card')).to.be.true; + expect(wrapper.find('.van-contact-card__text p')[0].text()).to.equal('联系人:测试姓名'); + expect(wrapper.find('.van-contact-card__text p')[1].text()).to.equal('联系电话:13000000000'); + }); +}); + +describe('ContactList', () => { + const list = [ + { + id: '1', + name: '张三', + tel: '13000000000' + }, + { + id: '2', + name: '李四', + tel: '1310000000' + }, + { + id: '3', + name: '王五', + tel: '1320000000' + } + ]; + + let wrapper; + afterEach(() => { + wrapper && wrapper.destroy(); + }); + + it('create a ContactList', () => { + wrapper = mount(ContactList); + expect(wrapper.hasClass('van-contact-list')).to.be.true; + }); + + it('create a ContactList with three items', () => { + wrapper = mount(ContactList, { + propsData: { + value: '1', + list + } + }); + expect(wrapper.find('.van-cell').length).to.equal(4); + expect(wrapper.find('.van-icon-checked').length).to.equal(1); + }); + + it('listen to add & edit event', (done) => { + wrapper = mount(ContactList, { + propsData: { + list + } + }); + + const add = sinon.spy(); + wrapper.vm.$on('add', add); + wrapper.find('.van-contact-list__add')[0].trigger('click'); + expect(add.calledOnce).to.be.true; + + wrapper.vm.$on('edit', (item, index) => { + expect(index).to.equal(0); + done(); + }); + wrapper.find('.van-contact-list__edit')[0].trigger('click'); + }); + + it('listen to select event', (done) => { + wrapper = mount(ContactList, { + propsData: { + value: '1', + list + } + }); + + wrapper.vm.$on('select', (item, index) => { + expect(item.id).to.equal('3'); + done(); + }); + wrapper.find('.van-radio')[2].trigger('click'); + }); +}); + +describe('ContactEdit', () => { + let wrapper; + afterEach(() => { + wrapper && wrapper.destroy(); + }); + + it('create a ContactEdit', () => { + wrapper = mount(ContactEdit); + expect(wrapper.hasClass('van-contact-edit')).to.be.true; + expect(wrapper.find('.van-field__control')[0].element.value).to.equal(''); + expect(wrapper.find('.van-field__control')[1].element.value).to.equal(''); + }); + + it('create a ContactEdit with props', () => { + const contactInfo = { + name: '测试', + tel: '123123213' + }; + + wrapper = mount(ContactEdit, { + propsData: { + contactInfo + } + }); + + expect(wrapper.find('.van-field__control')[0].element.value).to.equal(contactInfo.name); + expect(wrapper.find('.van-field__control')[1].element.value).to.equal(contactInfo.tel); + }); + + it('save contactInfo', () => { + const contactInfo = { + name: '', + tel: '123123213' + }; + + wrapper = mount(ContactEdit, { + propsData: { + contactInfo + } + }); + + const saveSpy = sinon.spy(); + wrapper.vm.$on('save', saveSpy); + + const saveButton = wrapper.find('.van-button')[0]; + + // name empty + wrapper.vm.contactInfo.name = ''; + saveButton.trigger('click'); + expect(wrapper.vm.errorInfo['name']).to.be.true; + wrapper.find('.van-field__control')[0].trigger('focus'); + expect(wrapper.vm.errorInfo['name']).to.be.false; + + // name too long + wrapper.vm.contactInfo.name = '111111111111111111111111111'; + saveButton.trigger('click'); + expect(wrapper.vm.errorInfo['name']).to.be.true; + wrapper.find('.van-field__control')[0].trigger('focus'); + expect(wrapper.vm.errorInfo['name']).to.be.false; + + // tel empty + wrapper.vm.contactInfo.name = '123'; + wrapper.vm.contactInfo.tel = ''; + saveButton.trigger('click'); + expect(wrapper.vm.errorInfo['tel']).to.be.true; + wrapper.find('.van-field__control')[1].trigger('focus'); + expect(wrapper.vm.errorInfo['tel']).to.be.false; + + // tel invalid + wrapper.vm.contactInfo.tel = 'abc'; + saveButton.trigger('click'); + expect(wrapper.vm.errorInfo['tel']).to.be.true; + wrapper.find('.van-field__control')[1].trigger('focus'); + expect(wrapper.vm.errorInfo['tel']).to.be.false; + + // saving + wrapper.vm.contactInfo.tel = '13000000000'; + saveButton.trigger('click'); + wrapper.vm.isSaving = true; + saveButton.trigger('click'); + expect(saveSpy.calledOnce).to.be.true; + }); + + it('delete', done => { + wrapper = mount(ContactEdit, { + attachToDocument: true, + propsData: { + isDeleting: true, + isEdit: true, + contactInfo: { + id: '123' + } + } + }); + + const deleteButton = wrapper.find('.van-button')[1]; + deleteButton.trigger('click'); + wrapper.vm.onDeleteContact(); + + setTimeout(() => { + wrapper.vm.isDeleting = false; + wrapper.vm.$nextTick(() => { + deleteButton.trigger('click'); + setTimeout(() => { + expect(document.querySelectorAll('.van-dialog').length).to.equal(1); + + wrapper.vm.$on('delete', () => { + done(); + }); + document.querySelector('.van-dialog__confirm').click(); + }, 300); + }); + }, 300); + }); + + it('watch contactInfo', done => { + const contactInfo = { + name: '123' + }; + + wrapper = mount(ContactEdit, { + propsData: { + contactInfo: {} + } + }); + + wrapper.setProps({ contactInfo }); + wrapper.vm.$nextTick(() => { + expect(wrapper.vm.currentInfo.name).to.equal('123'); + done(); + }); + }); +}); diff --git a/yarn.lock b/yarn.lock index 0d35cb5c1..9a129ba69 100644 --- a/yarn.lock +++ b/yarn.lock @@ -133,10 +133,6 @@ ansi-styles@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-1.0.0.tgz#cb102df1c56f5123eab8b67cd7b98027a0279178" -any-promise@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-0.1.0.tgz#830b680aa7e56f33451d4b049f3bd8044498ee27" - anymatch@^1.3.0: version "1.3.2" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.2.tgz#553dcb8f91e3c889845dfdba34c77721b90b9d7a" @@ -3669,7 +3665,7 @@ is-extglob@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" -is-extglob@^2.1.0: +is-extglob@^2.1.0, is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" @@ -3701,6 +3697,12 @@ is-glob@^3.1.0: dependencies: is-extglob "^2.1.0" +is-glob@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.0.tgz#9521c76845cc2610a85203ddf080a958c2ffabc0" + dependencies: + is-extglob "^2.1.1" + is-my-json-valid@^2.10.0: version "2.16.0" resolved "https://registry.yarnpkg.com/is-my-json-valid/-/is-my-json-valid-2.16.0.tgz#f079dd9bfdae65ee2038aae8acbc86ab109e3693" @@ -5479,17 +5481,17 @@ postcss-discard-unused@^2.2.1: postcss "^5.0.14" uniqs "^2.0.0" -postcss-easy-import@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/postcss-easy-import/-/postcss-easy-import-2.1.0.tgz#1d49f8a7c404415cfee4e5cb7a15fdf866c13022" +postcss-easy-import@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-easy-import/-/postcss-easy-import-3.0.0.tgz#8eaaf5ae59566083d0cae98735dfd803e3ab194d" dependencies: globby "^6.1.0" - is-glob "^3.1.0" + is-glob "^4.0.0" lodash "^4.17.4" object-assign "^4.0.1" - pify "^2.3.0" - postcss "^5.0.15" - postcss-import "^9.1.0" + pify "^3.0.0" + postcss "^6.0.11" + postcss-import "^10.0.0" resolve "^1.1.7" postcss-extend@^1.0.5: @@ -5515,17 +5517,6 @@ postcss-import@^10.0.0: read-cache "^1.0.0" resolve "^1.1.7" -postcss-import@^9.1.0: - version "9.1.0" - resolved "https://registry.yarnpkg.com/postcss-import/-/postcss-import-9.1.0.tgz#95fe9876a1e79af49fbdc3589f01fe5aa7cc1e80" - dependencies: - object-assign "^4.0.1" - postcss "^5.0.14" - postcss-value-parser "^3.2.3" - promise-each "^2.2.0" - read-cache "^1.0.0" - resolve "^1.1.7" - postcss-js@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/postcss-js/-/postcss-js-1.0.1.tgz#ffaf29226e399ea74b5dce02cab1729d7addbc7b" @@ -5797,7 +5788,7 @@ postcss-zindex@^2.0.1: postcss "^5.0.4" uniqs "^2.0.0" -postcss@^5.0.10, postcss@^5.0.11, postcss@^5.0.12, postcss@^5.0.13, postcss@^5.0.14, postcss@^5.0.15, postcss@^5.0.16, postcss@^5.0.2, postcss@^5.0.4, postcss@^5.0.5, postcss@^5.0.6, postcss@^5.0.8, postcss@^5.2.16: +postcss@^5.0.10, postcss@^5.0.11, postcss@^5.0.12, postcss@^5.0.13, postcss@^5.0.14, postcss@^5.0.16, postcss@^5.0.2, postcss@^5.0.4, postcss@^5.0.5, postcss@^5.0.6, postcss@^5.0.8, postcss@^5.2.16: version "5.2.17" resolved "https://registry.yarnpkg.com/postcss/-/postcss-5.2.17.tgz#cf4f597b864d65c8a492b2eabe9d706c879c388b" dependencies: @@ -5814,7 +5805,15 @@ postcss@^6.0.0, postcss@^6.0.1, postcss@^6.0.2, postcss@^6.0.6: source-map "^0.5.7" supports-color "^4.2.1" -postcss@^6.0.10, postcss@^6.0.11, postcss@^6.0.3, postcss@^6.0.9: +postcss@^6.0.10: + version "6.0.12" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-6.0.12.tgz#6b0155089d2d212f7bd6a0cecd4c58c007403535" + dependencies: + chalk "^2.1.0" + source-map "^0.5.7" + supports-color "^4.4.0" + +postcss@^6.0.11, postcss@^6.0.3, postcss@^6.0.9: version "6.0.11" resolved "https://registry.yarnpkg.com/postcss/-/postcss-6.0.11.tgz#f48db210b1d37a7f7ab6499b7a54982997ab6f72" dependencies: @@ -5894,12 +5893,6 @@ progress@^1.1.8, progress@~1.1.8: version "1.1.8" resolved "https://registry.yarnpkg.com/progress/-/progress-1.1.8.tgz#e260c78f6161cdd9b0e56cc3e0a85de17c7a57be" -promise-each@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/promise-each/-/promise-each-2.2.0.tgz#3353174eff2694481037e04e01f77aa0fb6d1b60" - dependencies: - any-promise "^0.1.0" - proxy-addr@~1.1.5: version "1.1.5" resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-1.1.5.tgz#71c0ee3b102de3f202f3b64f608d173fcba1a918"
联系人:{{ name }}
联系电话:{{ tel }}
联系人:{{ item.name }}
联系电话:{{ item.tel }}