Taro-RN支持useShareAppMessage

enyaitl3  于 2023-02-04  发布在  其他
关注(0)|答案(3)|浏览(210)

这个特性解决了什么问题?

目前调用分享相关hooks会报错,如:

TypeError: _taro.default.useShareAppMessage is not a function. (In '_taro.default.useShareAppMessage(function ()

希望能对齐小程序那边提供对应 hooks。
如果可以的话,taro-shell能同时接入微信、新浪这些sdk是最好的了。

这个 API 长什么样?

useShareAppMessage(() => {
    return {
      title: '商城模板',
    }
  });
ifsvaxew

ifsvaxew1#

跟业务关联比较紧密的api/组件,最好以插件的模式进行添加。如何插件进行注入,后续我们可以考虑一下制定方案。
如 分享、支付、地图、登录等。

2ekbmq32

2ekbmq322#

理论上可以使用 alias 来解决?

新增 src/custom/taro.js 内容参考:

let taro = {};

if (process.env.TARO_ENV === 'rn') {
  taro = require('@tarojs/taro-rn');
  console.log('init taro', taro);
} else {
  taro = require('../../node_modules/@tarojs/taro/index.js');
}

export const extendTaro = {
  ...taro,
};

if (process.env.TARO_ENV === 'weapp') {
  extendTaro.useShareAppMessage = (callback) => {
    console.log('拦截微信下的useShareAppMessage');
    return taro.useShareAppMessage(callback);
  };
}

if (process.env.TARO_ENV === 'rn') {
  extendTaro.useShareAppMessage = (callback) => {
    console.warn('RN下目前不支持useShareAppMessage');
    return callback();
  };
  extendTaro.useShareAppMessage = 1;
}

console.log('开始扩展Taro', extendTaro);

export default extendTaro;

然后配置 alias:

alias['@tarojs/taro'] = path.resolve(__dirname, '..', 'src/custom/taro.js');

这样修改后,在小程序端我们能拦截并修改useShareAppMessage。

但是在RN下就没办法拦截和修改导出的Taro对象,看源码像是node_modules/@tarojs/rn-supporter/dist/utils.js中的 getAlias 函数问题,这里面return的结果,@tarojs/components、@tarojs/taro是最后的,所以导致我们配置没办法覆盖默认的alias。我试了下改成:

if (alias['@tarojs/components'] === undefined) {
      alias['@tarojs/components'] = '@tarojs/components-rn';
    }
    if (alias['@tarojs/taro'] === undefined) {
      alias['@tarojs/taro'] = '@tarojs/taro-rn';
    }

然后能编译,但是报一个很奇怪的错误:Can't find variable: Taro,到这里就不知道要怎么继续下去了

ia2d9nvy

ia2d9nvy3#

抱歉,近期时间比较少,应该跟这里的按需加载方案有关。

https://github.com/NervJS/taro/blob/next/packages/babel-preset-taro/rn/index.js#L136-L160

相关问题