| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191 | <template>	<view>		<view class="banner">			<image class="banner-img" :src="banner.cover"></image>			<view class="banner-title">{{banner.title}}</view>		</view>		<view class="article-meta">			<text class="article-author">{{banner.author_name}}</text>			<text class="article-text">发表于</text>			<text class="article-time">{{banner.published_at}}</text>		</view>		<view class="article-content">			<rich-text :nodes="htmlNodes"></rich-text>		</view>		<!-- #ifdef MP-WEIXIN || MP-QQ -->		<ad v-if="htmlNodes.length > 0" unit-id="adunit-01b7a010bf53d74e"></ad>		<!-- #endif -->	</view></template><script>	const DETAIL_PAGE_PATH = '/pages/template/list2detail-detail/list2detail-detail';	import htmlParser from '@/common/html-parser.js'	function _handleShareChannels(provider) {		let channels = [];		for (let i = 0, len = provider.length; i < len; i++) {			switch (provider[i]) {				case 'weixin':					channels.push({						text: '分享到微信好友',						id: 'weixin',						sort: 0					});					channels.push({						text: '分享到微信朋友圈',						id: 'weixin',						sort: 1					});					break;				default:					break;			}		}		channels.sort(function(x, y) {			return x.sort - y.sort;		});		return channels;	}	export default {		data() {			return {				title: '',				banner: {},				htmlNodes: []			}		},		onLoad(event) {			// TODO 后面把参数名替换成 payload			const payload = event.detailDate || event.payload;			// 目前在某些平台参数会被主动 decode,暂时这样处理。			try {				this.banner = JSON.parse(decodeURIComponent(payload));			} catch (error) {				this.banner = JSON.parse(payload);			}			uni.setNavigationBarTitle({				title: this.banner.title			});			this.getDetail();		},		onShareAppMessage() {			return {				title: this.banner.title,				path: DETAIL_PAGE_PATH + '?detailDate=' + JSON.stringify(this.banner)			}		},		onNavigationBarButtonTap(event) {			const buttonIndex = event.index;			if (buttonIndex === 0) {				// 分享 H5 的页面				const shareProviders = [];				uni.getProvider({					service: 'share',					success: (result) => {						// 目前仅考虑分享到微信						if (result.provider && result.provider.length && ~result.provider.indexOf('weixin')) {							const channels = _handleShareChannels(result.provider);							uni.showActionSheet({								itemList: channels.map(channel => {									return channel.text;								}),								success: (result) => {									const tapIndex = result.tapIndex;									uni.share({										provider: 'weixin',										type: 0,										title: this.banner.title,										scene: tapIndex === 0 ? 'WXSceneSession' : 'WXSenceTimeline',										href: 'https://uniapp.dcloud.io/h5' + DETAIL_PAGE_PATH + '?detailDate=' + JSON.stringify(this.banner),										imageUrl: 'https://vkceyugu.cdn.bspapp.com/VKCEYUGU-dc-site/b6304f00-5168-11eb-bd01-97bc1429a9ff.png'									});								}							});						} else {							uni.showToast({								title: '未检测到可用的微信分享服务'							});						}					},					fail: (error) => {						uni.showToast({							title: '获取分享服务失败'						});					}				});			}		},		methods: {			getDetail() {				uni.request({					url: 'https://unidemo.dcloud.net.cn/api/news/36kr/' + this.banner.post_id,					success: (data) => {						if (data.statusCode == 200) {							var htmlString = data.data.content.replace(/\\/g, "").replace(/<img/g, "<img style=\"display:none;\"");							this.htmlNodes = htmlParser(htmlString);						}					},					fail: () => {						console.log('fail');					}				});			}		}	}</script><style>	.banner {		height: 360rpx;		overflow: hidden;		position: relative;		background-color: #ccc;	}	.banner-img {		width: 100%;	}	.banner-title {		max-height: 84rpx;		overflow: hidden;		position: absolute;		left: 30rpx;		bottom: 30rpx;		width: 90%;		font-size: 32rpx;		font-weight: 400;		line-height: 42rpx;		color: white;		z-index: 11;	}	.article-meta {		padding: 20rpx 40rpx;		display: flex;		flex-direction: row;		justify-content: flex-start;		color: gray;	}	.article-text {		font-size: 26rpx;		line-height: 50rpx;		margin: 0 20rpx;	}	.article-author,	.article-time {		font-size: 30rpx;	}	.article-content {		padding: 0 30rpx;		overflow: hidden;		font-size: 30rpx;		margin-bottom: 30rpx;	}</style>
 |