From 5497eef5efa80cfaf3e4ec94d383085258252815 Mon Sep 17 00:00:00 2001 From: neverland Date: Mon, 26 Mar 2018 21:20:00 +0800 Subject: [PATCH] [Improvement] optimize find parent mixin (#781) --- packages/actionsheet/index.vue | 8 +++--- packages/checkbox/index.vue | 39 +++++++++++++-------------- packages/collapse-item/index.vue | 18 ++++++------- packages/collapse/index.vue | 11 +++----- packages/contact-edit/index.vue | 29 ++++++++------------ packages/field/index.vue | 4 ++- packages/mixins/find-parent.js | 28 ++++++++++--------- packages/radio/index.vue | 27 +++++++------------ packages/tab/index.vue | 10 +++---- packages/vant-css/src/actionsheet.css | 8 +----- test/specs/actionsheet.spec.js | 1 - test/specs/contact.spec.js | 2 +- test/specs/field.spec.js | 2 +- 13 files changed, 82 insertions(+), 105 deletions(-) diff --git a/packages/actionsheet/index.vue b/packages/actionsheet/index.vue index 79fb9ec4f..57510a86e 100644 --- a/packages/actionsheet/index.vue +++ b/packages/actionsheet/index.vue @@ -1,11 +1,11 @@ @@ -90,13 +90,8 @@ export default create({ } }, - onSaveContact() { - const items = [ - 'name', - 'tel' - ]; - - const isValid = items.every(item => { + onSave() { + const isValid = ['name', 'tel'].every(item => { const msg = this.getErrorMessageByKey(item); if (msg) { this.errorInfo[item] = true; @@ -110,16 +105,14 @@ export default create({ } }, - onDeleteContact() { - if (this.isDeleting) { - return; + onDelete() { + if (!this.isDeleting) { + Dialog.confirm({ + message: this.$t('confirmDelete') + }).then(() => { + this.$emit('delete', this.data); + }); } - - Dialog.confirm({ - message: this.$t('confirmDelete') - }).then(() => { - this.$emit('delete', this.data); - }); } } }); diff --git a/packages/field/index.vue b/packages/field/index.vue index 81ab0b345..342d46bbc 100644 --- a/packages/field/index.vue +++ b/packages/field/index.vue @@ -146,7 +146,9 @@ export default create({ } } - el.style.height = height + 'px'; + if (height) { + el.style.height = height + 'px'; + } } } }); diff --git a/packages/mixins/find-parent.js b/packages/mixins/find-parent.js index a48dfe0e9..da858e413 100644 --- a/packages/mixins/find-parent.js +++ b/packages/mixins/find-parent.js @@ -3,20 +3,22 @@ */ export default { - methods: { - findParentByName(name) { - if (!this.parentGroup) { - let parent = this.$parent; - while (parent) { - if (parent.$options.name === name) { - this.parentGroup = parent; - break; - } - parent = parent.$parent; - } - } + data() { + return { + parent: null + }; + }, - return this.parentGroup; + methods: { + findParent(name) { + let parent = this.$parent; + while (parent) { + if (parent.$options.name === name) { + this.parent = parent; + break; + } + parent = parent.$parent; + } } } }; diff --git a/packages/radio/index.vue b/packages/radio/index.vue index 4c911ae80..bd7846344 100644 --- a/packages/radio/index.vue +++ b/packages/radio/index.vue @@ -36,39 +36,32 @@ export default create({ }, computed: { - isGroup() { - return !!this.findParentByName('van-radio-group'); - }, - currentValue: { get() { - return this.isGroup && this.parentGroup - ? this.parentGroup.value - : this.value; + return this.parent ? this.parent.value : this.value; }, set(val) { - if (this.isGroup && this.parentGroup) { - this.parentGroup.$emit('input', val); - } else { - this.$emit('input', val); - } + (this.parent || this).$emit('input', val); } }, isDisabled() { - return this.isGroup && this.parentGroup - ? this.parentGroup.disabled || this.disabled + return this.parent + ? this.parent.disabled || this.disabled : this.disabled; } }, + created() { + this.findParent('van-radio-group'); + }, + methods: { onClickLabel() { - if (this.isDisabled) { - return; + if (!this.isDisabled) { + this.currentValue = this.name; } - this.currentValue = this.name; } } }); diff --git a/packages/tab/index.vue b/packages/tab/index.vue index 59e78d2c3..45eed1fbd 100644 --- a/packages/tab/index.vue +++ b/packages/tab/index.vue @@ -1,5 +1,5 @@ @@ -20,17 +20,17 @@ export default create({ computed: { index() { - return this.parentGroup.tabs.indexOf(this); + return this.parent.tabs.indexOf(this); } }, created() { - this.findParentByName('van-tabs'); - this.parentGroup.tabs.push(this); + this.findParent('van-tabs'); + this.parent.tabs.push(this); }, destroyed() { - this.parentGroup.tabs.splice(this.index, 1); + this.parent.tabs.splice(this.index, 1); } }); diff --git a/packages/vant-css/src/actionsheet.css b/packages/vant-css/src/actionsheet.css index acb3fd704..e87607ac5 100644 --- a/packages/vant-css/src/actionsheet.css +++ b/packages/vant-css/src/actionsheet.css @@ -6,11 +6,10 @@ right: 0; bottom: 0; color: $text-color; - transition: .2s ease-out; - background-color: $background-color; max-height: 90%; overflow-y: auto; -webkit-overflow-scrolling: touch; + background-color: $background-color; &--withtitle { background-color: $white; @@ -56,9 +55,4 @@ line-height: inherit; } } - - &-float-enter, - &-float-leave-active { - transform: translate3d(0, 100%, 0); - } } diff --git a/test/specs/actionsheet.spec.js b/test/specs/actionsheet.spec.js index cd6a1d942..bd6aaf59b 100644 --- a/test/specs/actionsheet.spec.js +++ b/test/specs/actionsheet.spec.js @@ -14,7 +14,6 @@ describe('ActionSheet', () => { }); expect(wrapper.hasClass('van-actionsheet')).to.be.true; - expect(wrapper.contains('.van-actionsheet__list')).to.be.true; expect(wrapper.instance().actions.length).to.equal(0); expect(wrapper.instance().overlay).to.be.true; expect(wrapper.instance().closeOnClickOverlay).to.be.true; diff --git a/test/specs/contact.spec.js b/test/specs/contact.spec.js index 7e8cc20d0..1cd74d096 100644 --- a/test/specs/contact.spec.js +++ b/test/specs/contact.spec.js @@ -229,7 +229,7 @@ describe('ContactEdit', () => { const deleteButton = wrapper.find('.van-button')[1]; deleteButton.trigger('click'); - wrapper.vm.onDeleteContact(); + wrapper.vm.onDelete(); setTimeout(() => { wrapper.vm.isDeleting = false; diff --git a/test/specs/field.spec.js b/test/specs/field.spec.js index 5a0495401..6bd97e56c 100644 --- a/test/specs/field.spec.js +++ b/test/specs/field.spec.js @@ -69,6 +69,7 @@ describe('Field', () => { it('create a autosize textarea field', (done) => { wrapper = mount(Field, { + attachToDocument: true, propsData: { type: 'textarea', autosize: {} @@ -88,7 +89,6 @@ describe('Field', () => { textareaElement.value = longText; textarea.trigger('input'); - wrapper.update(); setTimeout(() => { expect(wrapper.find('.van-field__control')[0].element.value).to.equal(longText); expect(textareaElement.style.height).to.equal((textareaElement.scrollHeight - textAreaDiff) + 'px');