0.57.5版本的RN报错:undefined is not a function(evaluating '_this.registerEvents()')

本文详细记录了在React Native 0.57.x版本中遇到的项目启动问题及其解决过程。通过调整.babelrc文件中的preset设置,成功解决了因版本升级引发的启动难题。

优快云上有人给出了解决方案,我项目跟他类似,也是0.57.5版本的RN项目
https://blog.youkuaiyun.com/u012852597/article/details/82696226
官方解决问题记录是在:https://github.com/facebook/react-native/issues/20791
有人说这是0.57.0-rc2的问题,在rc3里已经解决了。
但我的版本是0.57.5还是出现了,所以这个解释应该不适合我。
以下是别人的解决成功的方案:
一、可以试试

react-native start --reset-cache

报如下错误

warning: the transform cache was reset.
Loading dependency graph...events.js:183
      throw er; // Unhandled 'error' event
      ^

Error: listen EADDRINUSE :::8081
    at Object._errnoException (util.js:992:11)
    at _exceptionWithHostPort (util.js:1014:20)
    at Server.setupListenHandle [as _listen2] (net.js:1355:14)
    at listenInCluster (net.js:1396:12)
    at Server.listen (net.js:1480:7)
    at F:\Git\xxx\xxx\node_modules\metro\src\index.js:193:18
    at new Promise (<anonymous>)
    at Object.<anonymous> (F:\Git\xxx\xxx\node_modules\metro\src\index.js:192:12)
    at Generator.next (<anonymous>)
    at step (F:\Git\xxx\xxx\node_modules\metro\src\index.js:50:30)

看错误信息,是端口被占用,想到node还开着,就先关掉。
再次运行

react-native start --reset-cache

再重新运行项目
问题依旧,这个方案没能解决我的问题。
错误信息

思路:
感觉像是版本升级导致的问题。
二、可以试试
https://github.com/facebook/react-native/issues/20791#issuecomment-415986358
解决办法的步骤

1* Make sure the you put rc.3 in your package.json
2* Delete `package-lock.json`
3* Delete `node_modules`
4* `npm i`
5* `react-native start --reset-cache`

或许作者自己的问题解决了,但别人用他的方式去解决,问题依旧。

乖乖,我最终的解决方案
修改.babelrc文件,我的文件内容是

{
  "presets": ["react-native"]
}

在0.57版本之后,应该改成

{
  "presets": ["module:metro-react-native-babel-preset"]
}

https://github.com/facebook/react-native/issues/20791#issuecomment-416419366
最后运行成功。
方法千万种,别放弃,耐心点,一样一样的尝试,总有一种适合自己的解决办法,多做些记录,给后来者参考。

### 问题分析 在JavaScript中,当执行环境尝试访问一个未定义(`undefined`)值的属性时,会抛出 `TypeError: undefined is not an object` 错误。具体到错误信息 `'undefined is not an object (evaluating 'this.Reader.enterAsset')'`,表示运行时尝试访问 `this.Reader` 对象的 `enterAsset` 属性,但 `this.Reader` 是 `undefined`,即它不是一个有效的对象[^1]。 该错误通常出现在以下几种情况: - `this.Reader` 没有被正确初始化或赋值。 - 当前上下文中的 `this` 指向了一个未定义 `Reader` 属性的对象。 - 在异步操作中,`this` 的绑定丢失,导致无法正确访问对象属性。 ### 解决方案 #### 1. 确保 `this.Reader` 被正确赋值 在访问 `this.Reader.enterAsset` 前,应确认 `this.Reader` 是一个有效的对象。例如: ```javascript if (this.Reader && this.Reader.enterAsset) { // 安全访问 this.Reader.enterAsset this.Reader.enterAsset(); } ``` 通过添加空值检查,可以避免在 `this.Reader` 未定义时访问其属性,从而防止运行时错误。 #### 2. 保持 `this` 的上下文一致性 在事件处理或异步操作中,`this` 的上下文可能会发生变化。可以通过使用箭头函数或显式绑定 `this` 来确保上下文正确: ```javascript someAsyncOperation().then(() => { if (this.Reader && this.Reader.enterAsset) { this.Reader.enterAsset(); } }); ``` 箭头函数不会创建自己的 `this` 上下文,因此它会继承外层作用域的 `this` 值,避免上下文丢失问题。 #### 3. 初始化 `Reader` 对象 确保在构造函数或初始化阶段为 `this.Reader` 赋予一个默认值,防止其为 `undefined`: ```javascript class MyClass { constructor() { this.Reader = { enterAsset: () => { console.log("Asset entered"); } }; } } ``` 通过这种方式,即使 `Reader` 对象未被外部赋值,也具有默认行为,从而避免访问未定义对象的属性。 ### 代码示例 以下是一个完整的类定义,展示了如何安全地访问 `this.Reader.enterAsset`: ```javascript class AssetHandler { constructor() { this.Reader = { enterAsset: () => { console.log("Entering asset..."); } }; } handleAsset() { if (this.Reader && this.Reader.enterAsset) { this.Reader.enterAsset(); } else { console.error("Reader or enterAsset is not defined"); } } } const handler = new AssetHandler(); handler.handleAsset(); // 输出: Entering asset... ``` ### 总结 `TypeError: undefined is not an object` 是由于尝试访问未定义对象的属性导致的。解决方法包括: - 在访问对象属性前进行空值检查; - 保持 `this` 上下文的一致性; - 在初始化阶段为对象提供默认值。 通过这些措施,可以有效避免该错误的发生,提高代码的健壮性。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值