微信小程序分享到朋友圈开发指南。当开发朋友圈分享功能、配置 onShareTimeline、适配单页模式、处理场景值 1154、navigationBarFit 布局调整时使用。
Provides guidance for implementing WeChat Moments sharing in mini-programs. Use when configuring onShareTimeline, handling single-page mode (scene 1154), or adjusting navigationBarFit layouts.
/plugin marketplace add dafang/taro-weapp-plugin/plugin install taro-weapp-plugin@taro-weapp-pluginThis skill inherits all available tools. When active, it can use any tool Claude has access to.
reference.md基础库 2.11.3+ 支持,Android/iOS 微信 8.0.24+
页面必须同时满足两个条件才能分享到朋友圈:
onShareAppMessageonShareTimelinePage({
// 1. 必须先启用"发送给朋友"
onShareAppMessage() {
return {
title: '分享标题',
path: '/pages/article/index?id=123',
imageUrl: '/images/share.png'
}
},
// 2. 再启用"分享到朋友圈"
onShareTimeline() {
return {
title: '朋友圈分享标题',
query: 'id=123', // 注意:不是 path,是 query
imageUrl: '/images/timeline-share.png'
}
}
})
import Taro, { useShareAppMessage, useShareTimeline } from '@tarojs/taro'
function ArticlePage() {
// 1. 必须先启用"发送给朋友"
useShareAppMessage(() => ({
title: '分享标题',
path: '/pages/article/index?id=123',
imageUrl: '/images/share.png'
}))
// 2. 再启用"分享到朋友圈"
useShareTimeline(() => ({
title: '朋友圈分享标题',
query: 'id=123',
imageUrl: '/images/timeline-share.png'
}))
return <View>文章内容</View>
}
export default ArticlePage
| 属性 | 类型 | 说明 |
|---|---|---|
| title | string | 分享标题,默认为小程序名称 |
| query | string | 自定义页面路径中携带的参数,如 id=123&type=news |
| imageUrl | string | 分享图片 URL,支持本地或网络图片 |
注意:onShareTimeline 使用 query 而非 path,不支持自定义页面路径。
用户从朋友圈打开分享的小程序页面时,进入"单页模式",这是一个特殊的受限运行环境。
scene === 1154// 原生小程序
const scene = wx.getLaunchOptionsSync().scene
const isSinglePage = scene === 1154
// Taro
import Taro from '@tarojs/taro'
const launchOptions = Taro.getLaunchOptionsSync()
const isSinglePage = launchOptions.scene === 1154
// 或使用 wx.getApiCategory (基础库 2.22.1+)
const apiCategory = wx.getApiCategory()
const isBrowseOnly = apiCategory === 'browseOnly' // 朋友圈快照页
import Taro, { useLoad } from '@tarojs/taro'
import { View, Text, Button } from '@tarojs/components'
import { useState } from 'react'
function ArticlePage() {
const [isSinglePage, setIsSinglePage] = useState(false)
const [article, setArticle] = useState(null)
useLoad(() => {
const scene = Taro.getLaunchOptionsSync().scene
setIsSinglePage(scene === 1154)
// 单页模式下使用未登录访问方式获取数据
fetchArticle()
})
const fetchArticle = async () => {
// 单页模式下无登录态,需使用公开接口
const res = await Taro.request({
url: 'https://api.example.com/public/article',
data: { id: articleId }
})
setArticle(res.data)
}
return (
<View className="article-page">
<View className="content">
<Text>{article?.title}</Text>
<RichText nodes={article?.content} />
</View>
{/* 单页模式下隐藏需要登录的交互 */}
{!isSinglePage && (
<View className="actions">
<Button onClick={handleLike}>点赞</Button>
<Button onClick={handleComment}>评论</Button>
</View>
)}
</View>
)
}
在页面 JSON 中配置 navigationBarFit 来调整顶部导航栏与页面的相交状态:
{
"navigationBarTitleText": "文章详情",
"navigationBarFit": "squeezed"
}
| 值 | 说明 |
|---|---|
float | 导航栏浮动在页面上方(默认) |
squeezed | 页面被导航栏挤压,从导航栏下方开始布局 |
| 组件 | 说明 |
|---|---|
button open-type | 开放能力按钮 |
camera | 相机组件 |
form | 表单组件 |
navigator | 导航组件 |
web-view | 网页容器 |
live-pusher | 直播推流 |
| 分类 | API |
|---|---|
| 登录 | wx.login、wx.checkSession、wx.getUserInfo、wx.getUserProfile |
| 路由 | wx.navigateTo、wx.redirectTo、wx.reLaunch、wx.switchTab、wx.navigateBack |
| 媒体 | wx.chooseImage、wx.chooseMedia、wx.chooseVideo、wx.saveImageToPhotosAlbum |
| 位置 | wx.openLocation、wx.chooseLocation、wx.startLocationUpdate |
| 支付 | wx.requestPayment |
| 分享 | wx.showShareMenu、wx.hideShareMenu、wx.updateShareMenu、wx.getShareInfo |
| 设备 | 蓝牙、Wi-Fi、NFC、剪贴板、扫码、电话 |
| 广告 | ad 组件、wx.createRewardedVideoAd、wx.createInterstitialAd |
分享到朋友圈适用于纯内容展示场景:
// 推荐:文章、新闻、产品详情等内容页
function ArticlePage() {
useShareTimeline(() => ({
title: article.title,
query: `id=${article.id}`,
imageUrl: article.cover
}))
// ...
}
// 不推荐:需要大量交互的页面
function ShoppingCartPage() {
// 购物车需要登录,不适合分享到朋友圈
}
function ContentPage() {
const [isSinglePage, setIsSinglePage] = useState(false)
useLoad(() => {
setIsSinglePage(Taro.getLaunchOptionsSync().scene === 1154)
})
const handleAction = () => {
if (isSinglePage) {
// 单页模式下引导用户打开完整小程序
Taro.showToast({
title: '请点击下方"前往小程序"使用完整功能',
icon: 'none',
duration: 2000
})
return
}
// 正常模式下执行操作
doSomething()
}
return (
<View>
<Button onClick={handleAction}>
{isSinglePage ? '前往小程序操作' : '立即操作'}
</Button>
</View>
)
}
// 单页模式下无登录态,设计公开接口
const fetchData = async (articleId: string) => {
// 使用不需要登录的公开接口
const res = await Taro.request({
url: `${API_BASE}/public/articles/${articleId}`,
method: 'GET'
// 不传 token
})
return res.data
}
function ContentPage() {
const [isSinglePage, setIsSinglePage] = useState(false)
useLoad(() => {
setIsSinglePage(Taro.getLaunchOptionsSync().scene === 1154)
})
return (
<View
className="page"
style={{
// 单页模式下底部有操作栏,需要额外 padding
paddingBottom: isSinglePage ? '80px' : 'env(safe-area-inset-bottom)'
}}
>
{/* 页面内容 */}
</View>
)
}
如果使用云开发,需在云函数中开启未登录访问:
// 云函数 config.json
{
"permissions": {
"openapi": []
},
"overrideUserSecurityRules": {
"allow": true // 允许未登录访问
}
}
A: 检查以下几点:
onShareAppMessage 和 onShareTimelineA: 单页模式无登录态,需要:
query 参数传递A:
详见 reference.md