From f66948e835b35ccd96fbb803e102514a4b0c977e Mon Sep 17 00:00:00 2001 From: qiang Date: Mon, 14 Oct 2019 12:11:22 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=20picker-view=20?= =?UTF-8?q?=E7=BB=84=E4=BB=B6=E7=82=B9=E5=87=BB=E6=97=A0=E6=B3=95=E6=BB=9A?= =?UTF-8?q?=E5=8A=A8=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build/build.js | 4 +- .../components/picker-view-column/index.vue | 46 ++++++++++++------- src/core/view/mixins/scroller/index.js | 1 + 3 files changed, 32 insertions(+), 19 deletions(-) diff --git a/build/build.js b/build/build.js index 441c8ccaf..07a7e53fe 100644 --- a/build/build.js +++ b/build/build.js @@ -32,7 +32,7 @@ service.run('build', { formats: process.env.UNI_WATCH === 'true' ? 'umd' : 'umd-min', entry }).then(function () { - if (process.env.UNI_UI !== 'true') { + if (process.env.UNI_WATCH !== 'true' && process.env.UNI_UI !== 'true') { generateApiManifest( JSON.parse(JSON.stringify(process.UNI_SERVICE_API_MANIFEST)), JSON.parse(JSON.stringify(process.UNI_SERVICE_API_PROTOCOL)) @@ -70,4 +70,4 @@ if (process.env.UNI_WATCH === 'false') { .catch(err => { throw err }) -} +} diff --git a/src/core/view/components/picker-view-column/index.vue b/src/core/view/components/picker-view-column/index.vue index f6791bbb0..a845998c4 100644 --- a/src/core/view/components/picker-view-column/index.vue +++ b/src/core/view/components/picker-view-column/index.vue @@ -4,6 +4,24 @@ import scroller from 'uni-mixins/scroller/index' import { Friction } from 'uni-mixins/scroller/Friction' import { Spring } from 'uni-mixins/scroller/Spring' +function onClick (dom, callback) { + const MAX_MOVE = 20 + const hasTouchSupport = navigator.maxTouchPoints + let x = 0 + let y = 0 + dom.addEventListener(hasTouchSupport ? 'touchstart' : 'mousedown', (event) => { + const info = hasTouchSupport ? event.changedTouches[0] : event + x = info.clientX + y = info.clientY + }) + dom.addEventListener(hasTouchSupport ? 'touchend' : 'mouseup', (event) => { + const info = hasTouchSupport ? event.changedTouches[0] : event + if (Math.abs(info.clientX - x) < MAX_MOVE && Math.abs(info.clientY - y) < MAX_MOVE) { + callback(info) + } + }) +} + export default { name: 'PickerViewColumn', mixins: [touchtrack, scroller], @@ -50,7 +68,6 @@ export default { this.indicatorClass = $parent.indicatorClass this.maskStyle = $parent.maskStyle this.maskClass = $parent.maskClass - // this.__pageRerender = this._pageRerender.bind(this) }, mounted: function () { this.touchtrack(this.$refs.main, '_handleTrack', true) @@ -59,6 +76,7 @@ export default { this.init() this.update() }) + onClick(this.$el, this._handleTap.bind(this)) }, methods: { _setItemHeight (height) { @@ -81,18 +99,17 @@ export default { } } }, - _handleTap: function (e) { - if (e.target !== e.currentTarget && !this._scroller.isScrolling()) { - var t = e.touches && e.touches[0] && e.touches[0].clientY - var n = typeof t === 'number' ? t : e.detail.y - document.body.scrollTop - var i = this.$el.getBoundingClientRect() - var r = n - i.top - this._height / 2 + _handleTap: function ({ clientY }) { + if (!this._scroller.isScrolling()) { + var rect = this.$el.getBoundingClientRect() + var r = clientY - rect.top - this.height / 2 var o = this.indicatorHeight / 2 if (!(Math.abs(r) <= o)) { var a = Math.ceil((Math.abs(r) - o) / this.indicatorHeight) var s = r < 0 ? -a : a - this.current += s - this._scroller.scrollTo(this.current * this.indicatorHeight) + var current = Math.min(this.current + s, this.length - 1) + this.current = current = Math.max(current, 0) + this._scroller.scrollTo(current * this.indicatorHeight) } } }, @@ -122,8 +139,8 @@ export default { }, update: function () { this.$nextTick(() => { - var index = Math.max(this.length - 1, 0) - var current = Math.min(this.current, index) + var current = Math.min(this.current, this.length - 1) + current = Math.max(current, 0) this._scroller.update(current * this.indicatorHeight, undefined, this.indicatorHeight) }) }, @@ -135,12 +152,7 @@ export default { }, render (createElement) { this.length = (this.$slots.default && this.$slots.default.length) || 0 - return createElement('uni-picker-view-column', { - on: { - tap: this._handleTap - } - }, - [ + return createElement('uni-picker-view-column', {}, [ createElement('div', { ref: 'main', staticClass: 'uni-picker-view-group' diff --git a/src/core/view/mixins/scroller/index.js b/src/core/view/mixins/scroller/index.js index 780b7469d..41862dea6 100644 --- a/src/core/view/mixins/scroller/index.js +++ b/src/core/view/mixins/scroller/index.js @@ -46,6 +46,7 @@ export default { if (n.onTouchStart) { n.onTouchStart() } + event.preventDefault() } }, _handleTouchMove: function (event) { -- GitLab