You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React Native中Mobx装饰器报错求助:decorator is not a function

解决Mobx装饰器在Expo React Native项目中的"decorator is not a function"错误

看起来你遇到的问题是Babel对装饰器语法的支持配置不到位,虽然你已经安装了transform-decorators-legacy,但还有几个关键点需要调整:

1. 调整Babel插件的顺序和环境覆盖

你的.babelrc目前只在development环境启用了装饰器相关插件,但Expo在打包或运行时可能默认使用生产环境配置,或者插件的加载顺序不对。装饰器插件必须放在transform-class-properties之前才能正常工作。修改你的.babelrc如下:

{
  "presets": ["babel-preset-expo"],
  "plugins": [
    "transform-decorators-legacy",
    "transform-class-properties"
  ],
  "env": {
    "development": {
      "plugins": [
        "transform-react-jsx-source"
      ]
    }
  }
}

把装饰器和类属性插件移到全局plugins数组中,确保所有环境都能加载它们,同时保持transform-decorators-legacy在transform-class-properties前面——这是因为装饰器需要先处理类的属性。

2. 确认依赖安装完整

虽然你已经装了transform-decorators-legacy,但transform-class-properties也需要作为开发依赖安装,执行以下命令确保:

yarn add --dev babel-plugin-transform-class-properties

3. 替代方案:不使用装饰器语法

如果调整Babel配置后还是有问题,可以暂时改用Mobx的非装饰器写法来定义可观察属性,这样能绕开Babel装饰器的兼容问题:

修改src/TodoStore.js:

import React from "react"
import { observable } from "mobx"
class TodoStore {
  list = observable(["one", "two"])
  filter = observable("")
  addListItem(item) {
    this.list.push("drei")
  }
}
export default TodoStore

这种写法不需要依赖装饰器插件,同样能实现Mobx的可观察属性功能。

4. 重启Expo开发服务器

修改Babel配置后,一定要重启你的Expo开发服务器,确保新的配置生效,否则旧的编译缓存会导致问题依然存在。


内容的提问来源于stack exchange,提问作者Linus

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:38:12