Taro: Taro3.x - 1、APP实例化前,无法使用Taro对象;2、Taro.getApp()获取不到App里constructor中新增的属性吗?

Created on 20 Jul 2020  ·  11Comments  ·  Source: NervJS/taro


相关平台

支付宝小程序

小程序基础库: -
使用框架: React

复现步骤

import Taro from "@tarojs/taro";

const env = Taro.getEnv(); // ReferenceError: Taro is not defined

if (env === "WEAPP") {
//
}else{
//
}

const store = configStore();

class App extends Component {
  constructor() {
    super(...arguments);

    this.sensors = {
      track: () => {},
    };
  }

  componentDidMount() {}

  componentDidShow() {}

  componentDidHide() {}

  componentDidCatchError() {}

  // 在 App 类中的 render() 函数没有实际作用
  // 请勿修改此函数
  render() {
    return <Provider store={store}>{this.props.children}</Provider>;
  }
}

export default App;

// 在页面中执行

Taro.getApp().sensors.track() // 报错

期望结果

希望可以和2.x版本一致 可以正常获取constructor中新增属性

实际结果

error

环境信息

 Taro v3.0.0


  Taro CLI 3.0.0 environment info:
    System:
      OS: macOS 10.14.6
      Shell: 5.3 - /bin/zsh
    Binaries:
      Node: 10.15.0 - /usr/local/bin/node
      Yarn: 1.22.4 - /usr/local/bin/yarn
      npm: 6.14.6 - /usr/local/bin/npm
    npmPackages:
      @tarojs/components: 3.0.0 => 3.0.0
      @tarojs/mini-runner: 3.0.0 => 3.0.0
      @tarojs/react: 3.0.0 => 3.0.0
      @tarojs/runtime: 3.0.0 => 3.0.0
      @tarojs/taro: 3.0.0 => 3.0.0
      @tarojs/webpack-runner: 3.0.0 => 3.0.0
      babel-preset-taro: 3.0.0 => 3.0.0
      eslint-config-taro: 3.0.0 => 3.0.0
      react: ^16.10.0 => 16.13.1
    npmGlobalPackages:
      typescript: 3.5.3

F-react T-weapp V-3

All 11 comments

@persist-xyz

  1. 使用 process.env.TARO_ENV 做判断,代替 Taro.getEnv()
  2. Taro.getApp() 等于小程序原生的 getApp(),获取到的是小程序的 app 实例,Taro 3 中开发者写的 App 入口组件不等于小程序 app 实例,只是一个 React 组件。因此你可以通过 Current.app 获取 App 入口组件。
import { Current } from '@tarojs/taro'

Current.app.sensors.track()

@persist-xyz

  1. 使用 process.env.TARO_ENV 做判断,代替 Taro.getEnv()
  2. Taro.getApp() 等于小程序原生的 getApp(),获取到的是小程序的 app 实例,Taro 3 中开发者写的 App 入口组件不等于小程序 app 实例,只是一个 React 组件。因此你可以通过 Current.app 获取 App 入口组件。
import { Current } from '@tarojs/taro'

Current.app.sensors.track()

Current.app 返回的值只是app.config中定义的内容,也还是拿不到新增的属性, 和Taro.getApp()中返回的config是一样的

@persist-xyz

  1. 使用 process.env.TARO_ENV 做判断,代替 Taro.getEnv()
  2. Taro.getApp() 等于小程序原生的 getApp(),获取到的是小程序的 app 实例,Taro 3 中开发者写的 App 入口组件不等于小程序 app 实例,只是一个 React 组件。因此你可以通过 Current.app 获取 App 入口组件。
import { Current } from '@tarojs/taro'

Current.app.sensors.track()

Current.app 返回的值只是app.config中定义的内容,也还是拿不到新增的属性, 和Taro.getApp()中返回的config是一样的

是的,有什么方法可以解决吗?暂时不升级3.x了,等再稳定一段时间的 😂

同样遇到了问题,想再app.js里面定义一些全局属性挂在app上,但是发现做不到

直接在Current.app上添加属性就好了~

ps:

// 注册
import { Current } from '@tarojs/taro'

Current.app.sensors = ()=> {}

// 使用
import { Current } from '@tarojs/taro'

Current.app.sensors.track()

同样遇到了问题,在App上注入了变量,后面使用Taro.getApp()得不到了。

小程序转换为taro代码后,页面中的Taro.getApp()都获取不到App定义的属性了,这难道不是个bug吗。如果改造的话成本有点高吧

这个问题阻碍我们从2.x升级到 3.x,请问有workaround吗?

@Chen-jj 这个问题不应该关闭把。

@xsq007 可以使用 taroGlobalObject 去实现

// app.js
class App extends Component {
  taroGlobalData = {
    x () {
      console.log('i m x')
    }
  }
}
// index.js
class Index extends Component {
  componentDidMount () {
    const app = Taro.getApp()
    app.x()
  }
}

@Chen-jj 可以使用 taroGlobalObject 去实现

// app.js
class App extends Component {
  taroGlobalData = {
    x () {
      console.log('i m x')
    }
  }
}
// index.js
class Index extends Component {
  componentDidMount () {
    const app = Taro.getApp()
    app.x()
  }
}

使用上述代码提示:react-reconciler.production.min.js:106 TypeError: app.x is not a function

Was this page helpful?
0 / 5 - 0 ratings