From 40c433c6dfb98204ef74c86585940af80b42cc21 Mon Sep 17 00:00:00 2001 From: hushicai Date: Wed, 31 Oct 2018 09:21:33 +0800 Subject: [PATCH] [fix] only call 'getBoundingClientRect' if nativeEvent.location{X,Y} is accessed Calculating the `location{X,Y}` values for events requires a call to `getBoundingClientRect`. To prevent unnecessary performance costs, these values are implemented as getters and will only make the DOM API call when accessed in application code. Close #1157 --- .../src/exports/Touchable/index.js | 13 ++++++-- .../src/modules/normalizeNativeEvent/index.js | 31 ++++++++++--------- 2 files changed, 26 insertions(+), 18 deletions(-) diff --git a/packages/react-native-web/src/exports/Touchable/index.js b/packages/react-native-web/src/exports/Touchable/index.js index b1b12395..2b2a480a 100644 --- a/packages/react-native-web/src/exports/Touchable/index.js +++ b/packages/react-native-web/src/exports/Touchable/index.js @@ -696,9 +696,16 @@ const TouchableMixin = { const touch = TouchEventUtils.extractSingleTouch(e.nativeEvent); const pageX = touch && touch.pageX; const pageY = touch && touch.pageY; - const locationX = touch && touch.locationX; - const locationY = touch && touch.locationY; - this.pressInLocation = { pageX, pageY, locationX, locationY }; + this.pressInLocation = { + pageX, + pageY, + get locationX() { + return touch && touch.locationX; + }, + get locationY() { + return touch && touch.locationY; + } + }; }, _getDistanceBetweenPoints: function(aX: number, aY: number, bX: number, bY: number) { diff --git a/packages/react-native-web/src/modules/normalizeNativeEvent/index.js b/packages/react-native-web/src/modules/normalizeNativeEvent/index.js index 0ec7f4da..126dd099 100644 --- a/packages/react-native-web/src/modules/normalizeNativeEvent/index.js +++ b/packages/react-native-web/src/modules/normalizeNativeEvent/index.js @@ -78,6 +78,7 @@ function normalizeTouchEvent(nativeEvent) { typeof nativeEvent.stopPropagation === 'function' ? nativeEvent.stopPropagation.bind(nativeEvent) : emptyFunction; + const singleChangedTouch = changedTouches[0]; const event = { _normalized: true, @@ -85,11 +86,15 @@ function normalizeTouchEvent(nativeEvent) { cancelable: nativeEvent.cancelable, changedTouches, defaultPrevented: nativeEvent.defaultPrevented, - identifier: undefined, - locationX: undefined, - locationY: undefined, - pageX: nativeEvent.pageX, - pageY: nativeEvent.pageY, + identifier: singleChangedTouch ? singleChangedTouch.identifier : undefined, + get locationX() { + return singleChangedTouch ? singleChangedTouch.locationX : undefined; + }, + get locationY() { + return singleChangedTouch ? singleChangedTouch.locationY : undefined; + }, + pageX: singleChangedTouch ? singleChangedTouch.pageX : nativeEvent.pageX, + pageY: singleChangedTouch ? singleChangedTouch.pageY : nativeEvent.pageY, preventDefault, stopImmediatePropagation, stopPropagation, @@ -102,14 +107,6 @@ function normalizeTouchEvent(nativeEvent) { which: nativeEvent.which }; - if (changedTouches[0]) { - event.identifier = changedTouches[0].identifier; - event.pageX = changedTouches[0].pageX; - event.pageY = changedTouches[0].pageY; - event.locationX = changedTouches[0].locationX; - event.locationY = changedTouches[0].locationY; - } - return event; } @@ -164,8 +161,12 @@ function normalizeMouseEvent(nativeEvent) { changedTouches: touches, defaultPrevented: nativeEvent.defaultPrevented, identifier: touches[0].identifier, - locationX: touches[0].locationX, - locationY: touches[0].locationY, + get locationX() { + return touches[0].locationX; + }, + get locationY() { + return touches[0].locationY; + }, pageX: nativeEvent.pageX, pageY: nativeEvent.pageY, preventDefault,