2、react使用原生js模拟长按操作

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2、react使用原生js模拟长按操作相关的知识,希望对你有一定的参考价值。

参考技术A  

touchstart :手指触摸到一个 DOM 元素时触发。

touchend :手指从一个 DOM 元素上移开时触发。

touchmove :手指在一个 DOM 元素上滑动时触发。

思路是,在触发 touchstart 时设置一个定时器 setInterval(longPress(),500) ,指定时间后执行长按的操作(如500ms),在执行完长按的操作和触发 touchend 之后清除定时器。

这样一来,如果没有超过500ms,手指离开屏幕,触发 touchend ,则 longPress 不会执行。如果时间时间超过500ms,则 longPress 执行一次。

如何在 RN 中模拟原生模块

【中文标题】如何在 RN 中模拟原生模块【英文标题】:How mock the native module in RN 【发布时间】:2020-12-26 16:03:50 【问题描述】:

我尝试在 react-native 中模拟模块 NativeModules

为避免在每次测试中复制和粘贴,我尝试创建一个“mocks/react-native.js”文件,在其中模拟相关模块。我发现这个教程有帮助,但它不起作用https://altany.github.io/react-native/0.61/jest/mocking/upgrade/2020/01/25/mocking-react-native-0.61-modules-with-jest.html

这是我的模拟文件

import * as ReactNative from 'react-native';

export const NativeModules = 
  ...ReactNative.NativeModules,
  SettingsManager: 
    settings: 
      AppleLocale: 'en_US',
    ,
  ,
;

export const Platform = 
  ...ReactNative.Platform,
  OS: 'ios',
  Version: 123,
  isTesting: true,
  select: (objs) => objs.ios,
;

export const keyboardDismiss = jest.fn();
export const Keyboard = 
  dismiss: keyboardDismiss,
;

export default Object.setPrototypeOf(
  
    NativeModules,
    Platform,
    Keyboard,
  ,
  ReactNative,
);

这是产生的错误:

TypeError: Cannot read property 'create' of undefined

      1 | import StyleSheet from 'react-native';
      2 | 
    > 3 | export default StyleSheet.create(

TypeError: Cannot read property 'get' of undefined

您知道使用模拟文件模拟NativeModules 模块的另一种方法吗? 要么 你知道如何解决这些错误吗?

【问题讨论】:

【参考方案1】:

模拟应该定义* 导入,而不是default。和ES模块*导出cannot be defined programmatically。

这应该通过使用 CommonJS 模块来完成,而原型继承则不需要这样做:

const ReactNative = require('react-native');
...
module.exports = 
  ...ReactNative,
  __esModule: true,
  NativeModules,
  Platform,
  Keyboard,
;

【讨论】:

我已经根据您的示例调整了我的模拟,但出现了这个错误。 Invariant Violation: TurboModuleRegistry.getEnforcing(...): 'DevSettings' could not be found. Verify that a module by this name is registered in the native binary.我不明白怎么解决 没有 mock 是否可行?答案解决了 Jest 模拟的问题,我不能保证 RN 可以使用这些模拟,因为它可能需要对 RN 内部有很好的理解才能以正确的方式模拟它。至于报错,好像很常见,***.com/questions/59713472/…

以上是关于2、react使用原生js模拟长按操作的主要内容,如果未能解决你的问题,请参考以下文章

为啥 react-native 包使用原生 SDK 而不是 JS/web 版本?

react基础入门:原生JS操作DOM元素

React.js实现原生js拖拽效果及思考

react基础入门:原生JS基础测试

js 原生手写AJAX

RN - 封装Android原生WebView组件,实现JS获取原生消息回调及JS控制native组件