小程序寄生在大流量的App中,因此转发共享功能非常重要,能实现病毒性传播。
在原生的微信小程序有一个onShareAppMessage方法,它会返回一个对象。 只要定义这个方法,那页面顶部就会自动出一个转发按钮,让用户进行转发。
而快应用是没有这样的API,也没有这样的按钮,一切都需要手动实现。我们可以通过 React.api.showActionSheet创建一个右上角菜单,然后让某一栏为一个转发按钮,当用户点击它时实现这个功能。
与onShow 一样,我们娜娜奇除了提供页面级别的分享钩子,也提供全局级别的分享钩子,分别称为onShare与onGlobalShare。
// pages/pagexx/index.js
import React from '@react';
class P extends React.Component {
constructor(props) {
super(props);
this.state = {
text: 'this is first line\nthis is second line'
};
}
onShare() {
var navigateToUrl = this.props.path;
return {
title: '预订火车票 - 携程',
imageUrl: 'https://s.aaa.com/bbb/ccc.jpg',
path: navigateToUrl
};
}
remove() {
var textAry = this.state.text.split('\n');
if (!textAry.length) return;
textAry.pop();
this.setState({
text: textAry.join('\n')
});
}
render() {
return (
<div class="container">
<div class="item">
<h2 class="item-list-hd">progress</h2>
<div class="btn-area">
<progress percent="20" show-info />
<progress percent="40" show-info stroke-width="12" />
<progress percent="60" show-info color="pink" />
<progress percent="80" show-info active />
</div>
</div>
</div>
);
}
}
export default P;
app.js中需要添加一个onShowMenu方法,专门给快应用生成右上角菜单。
class Demo extends React.Component {
static config = {
window: {
backgroundTextStyle: 'light',
// navigationBarBackgroundColor: '#0088a4',
navigationBarTitleText: 'mpreact',
navigationBarTextStyle: '#fff'
},
tabBar: {
'color': '#929292',
'selectedColor': '#00bcd4',
'borderStyle': 'black',
'backgroundColor': '#ffffff',
'list': [/**/ ]
}
};
globalData = {
ufo: 'ufo'
};
onGlobalShare() {
if (process.env.ANU_ENV === 'wx') {
return null; //微信直接使用默认的分享,没有写onShare也有
}
// 快应用的分享比较特殊
if (process.env.ANU_ENV === 'quick') {
return {
shareType: 0,
title: '携程',
summary: '携程,总有你要的低价',
imagePath: '/assets/image/qlog.png',
targetUrl: 'https://miniapp.tujia.com/quickShare?%2Fpages%2Fplatform%2Findex%3Fbd_origin%3Dfrom-quick-share',
platforms: ['WEIXIN'],
success: function(data) {
console.log('handling success')
},
fail: function(data, code) {
console.log(`handling fail, code = ${code}`)
}
};
}
const reactInstance = React.getCurrentPage();
let path = reactInstance && reactInstance.props && reactInstance.props.path;
let query = reactInstance && reactInstance.props && reactInstance.props.query;
return {
title: '携程',
content: '携程,总有你要的低价',
path: 'pages/platform/indexWx/index',
success: res => {
Log({
name: 'share',
channel: res.channelName,
page: path,
query: JSON.stringify(query || {}),
to: 'pages/platform/indexWx/index',
});
},
};
}
onLaunch() {
// eslint-disable-next-line
console.log('App launched');
},
//快应用想实现 分享转发, 关于, 保存桌面
onShowMenu(pageInstance, app){
if(process.env.ANU_ENV === 'quick'){
var api = React.api;
api.showActionSheet({
itemList: ['转发', '保存到桌面', '关于', '取消'],
success: function (ret) {
switch (ret.index) {
case 0: //分享转发
var fn = pageInstance.onShare || app.onGlobalShare;
var obj = fn && fn();
if (obj){
api.share(obj);
}
break;
case 1:
// 保存桌面
api.createShortcut();
break;
case 2:
// 关于
api.getSystemInfo({
success: function(appInfo){
api.redirectTo({
url: `pages/about/index?brand=${appInfo.brand}&version=${appInfo.version}`
});
}
});
break;
case 3:
// 取消
break;
}
}
});
}
}
}
}
// eslint-disable-next-line
export default App(new Demo());
1、界面交互 → 分享 import share from '@system.share' 这个分享主要用于不同APP之间的数据传递,因此归到“界面交互”中,可以传递文本数据或文件数据
2、第三方服务 → 第三方分享 import share from '@service.share' 这个分享主要用于将快应用中的信息通过社交工具(微信、QQ、新浪微博等)分享出去,可以以图文、纯文字、纯图文、音乐、视频等形式进行分享,分享前需要在manifest.json 的 features 中对service.share进行appSign、wxkey、qqkey、sinakey等参数参数的设置,否则分享出去的内容都将以纯文字方式进行展示。
(微信分享时的appSign和wxkey设置可以参照关于微信分享的实现,亲测可用)