在维护基于 React Native Web 的 h5 项目时,遇到这样的一个 bug,在部分安卓 h5 页面一些点击事件会稳定触发两边,这样的问题在 iOS 和 pc 调试 h5 都是好的,甚至同一机型只要另外换一个浏览器可能也会有不同的效果。
在调试阶段,发现只要把 TouchableHighlight
等组件都干掉,换成 div,点击事件也从 onPress
改到 onClick
,就全部是好的,不过由于是三端项目,需要 TouchableHighlight
这些 React Native 组件,当然不能这么改了了事,不过也给我定位到可能是 React Native Web Touchable
类组件的 bug
定位到是这个问题,很快可以找到对应问题 issue 以及 RNW 作者的回复和解决 链接
管中窥豹
根据 issue 里大家的讨论结合后面作者 necolas 的修复改动,我们可以加一些 console 来看下引起问题的原因
首先在有问题的 onPress 函数里添加 console.log('触发 onPress 函数')
然后在 node_modules/react-native-web/dist/modules/ResponderEventPlugin/index.js
找到以下的代码(在备注的地方加入console)
ResponderEventPlugin.extractEvents = function (topLevelType, targetInst, nativeEvent, nativeEventTarget) {
var hasActiveTouches = ResponderTouchHistoryStore.touchHistory.numberActiveTouches > 0;
var eventType = nativeEvent.type;
// 在这加 console
c