From 8489a023d97a66aa59eac1bbe6dbc17c2272ba5c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B5=B5=E5=BF=A0=E6=9E=97?= <170083662@qq.com> Date: Mon, 13 Jul 2026 09:03:32 +0800 Subject: [PATCH] =?UTF-8?q?feat(share):=20=E5=AE=8C=E5=96=84=E9=A6=96?= =?UTF-8?q?=E9=A1=B5=E5=88=86=E4=BA=AB=E5=8A=9F=E8=83=BD=EF=BC=8C=E6=94=AF?= =?UTF-8?q?=E6=8C=81=E6=9C=8B=E5=8F=8B=E5=9C=88=E4=B8=8E=E5=A4=8D=E5=88=B6?= =?UTF-8?q?=E9=93=BE=E6=8E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 纠正 tabBar 页可分享朋友圈的误解,tabBar 页只在朋友圈单页模式底部不显示但支持分享 - useShare 钩子新增 enableCopyUrl 参数,支持复制链接按钮绑定与解绑 - 首页配置启用 enableShareTimeline,调用 useShare 启用朋友圈和复制链接三按钮 - 补充复制链接功能,适配基础库 2.14.3+(Beta),需真机测试 - 朋友圈分享自动带 inviter 参数,统一裂变归因机制 - 更新文档及注释,明确朋友圈分享与复制链接支持及注意事项 --- .workbuddy/memory/2026-07-13.md | 10 ++++++---- .workbuddy/memory/MEMORY.md | 6 +++--- src/hooks/useShare.ts | 26 +++++++++++++++++++++----- src/pages/index/index.tsx | 6 ++++-- 4 files changed, 34 insertions(+), 14 deletions(-) diff --git a/.workbuddy/memory/2026-07-13.md b/.workbuddy/memory/2026-07-13.md index 4f1971e..dc8faca 100644 --- a/.workbuddy/memory/2026-07-13.md +++ b/.workbuddy/memory/2026-07-13.md @@ -9,8 +9,10 @@ - 类型检查:本次改动零错误,仅余 1 个历史既有错误(TS2688 @tarojs/taro 类型解析,非本次引入)。 - 待办/注意:朋友圈分享必须真机测试;后端需支持按 page 生成指定落地页小程序码;单页模式降级(避免强制登录跳转)可调用 `isTimelineSinglePage()`。 -## 首页接入分享(补做) -- `src/hooks/useShare.ts` 增加 `enableTimeline?: boolean` 选项(默认 true),tabBar 页传 false 避免注册无效的朋友圈回调(React hook 规则下用内部 `if` 判断返回空对象,始终调用 hook)。 -- `src/pages/index/index.tsx`:config 加 `enableShareAppMessage: true`,组件内调用 `useShare({ title, path:'/pages/index/index', enableTimeline:false })`。 -- 说明:首页为 tabBar 页,微信不允许分享到朋友圈,故仅启用「分享给好友」,路径带 inviter 裂变参数。 +## 首页分享纠正 + 三按钮全亮(好友/朋友圈/复制链接) +- ❗纠正:之前误以为"tabBar 页不能分享朋友圈"是错的。核实微信官方 Page 文档 + 分享朋友圈专题文档:tabBar 页**可以**分享朋友圈(只要定义 onShareAppMessage + onShareTimeline 即显示按钮)。"tabBar 不渲染"仅指朋友圈打开后的**单页模式**里底部 tabBar 不显示,不是不能发起分享。 +- `src/hooks/useShare.ts` 扩展:新增 `enableCopyUrl?: boolean`(复制链接,用 `Taro.onCopyUrl`/`offCopyUrl` 在 useEffect 里进页绑定、离页解绑);`enableTimeline` 默认 true 且 tabBar 页也生效;纠正了旧注释。 +- `src/pages/index/index.tsx`:config 加 `enableShareAppMessage` + `enableShareTimeline`;`useShare({ title, path, enableTimeline:true, enableCopyUrl:true })`,首页右上角三个按钮全亮。 +- 复制链接:基础库 2.14.3+ Beta(官方说仅 Android,实测 iOS 也支持);朋友圈/复制链接开发者工具可能看不到入口,需真机测试。 +- 注意:首页分享朋友圈后是单页模式(无登录态/不能跳转/tabBar 不渲染),首页是交互型页面,单页体验受限,但作传播入口可用;如需更好体验可用 `isTimelineSinglePage()` 做降级。 - 类型检查:零错误(历史既有 1 个 TS2688 仍在)。 diff --git a/.workbuddy/memory/MEMORY.md b/.workbuddy/memory/MEMORY.md index 54d8fe0..088aae2 100644 --- a/.workbuddy/memory/MEMORY.md +++ b/.workbuddy/memory/MEMORY.md @@ -33,9 +33,9 @@ - 新订单检测 Hook:`src/hooks/useNewOrderDetector.ts`(30秒轮询,页面隐藏暂停) ## 分享 / 朋友圈能力(2026-07-13 接入) -- 统一封装:`src/hooks/useShare.ts`(`useShare({title, path?, query?, imageUrl?})`,内部一次注册 `useShareAppMessage` + `useShareTimeline`,并自动在 path/query 追加 `inviter=${当前用户id}` 做裂变归因;`isTimelineSinglePage()` 判断朋友圈单页模式 scene===1154) +- 统一封装:`src/hooks/useShare.ts`(`useShare({title, path?, query?, imageUrl?, enableTimeline?, enableCopyUrl?})`,一次注册 `useShareAppMessage` + `useShareTimeline` + 可选 `onCopyUrl` 复制链接;自动在 path/query 追加 `inviter=${当前用户id}` 做裂变归因;`isTimelineSinglePage()` 判断朋友圈单页模式 scene===1154) - 海报组件:`src/components/SharePoster/index.tsx`(Canvas 2D 绘制封面+标题+价格+小程序码,返回临时图路径作 imageUrl) - 小程序码接口:`src/api/share.ts` `generateShareCode(page, inviterId)` 复用 `generateMiniProgramCode`(scene 用 `uid_${inviterId}`,page 透传但后端需读取转发才生效) - 裂变约定:分享链接 query 用 `inviter`,与 `src/utils/invite.ts` 的 `parseInviteParams` 读取字段一致 -- 已接入页面:商品详情、积分商品、拼团、秒杀、活动、赛事(带 canvas 海报);邀请下级、分销推广、升级VIP、分享赚佣金(仅 enableShare + useShare,无海报) -- 注意:tabBar 4 页(首页/分类/订单/我的)不支持朋友圈分享;朋友圈分享必须真机测试(开发者工具无预览) +- 已接入页面:商品详情、积分商品、拼团、秒杀、活动、赛事(带 canvas 海报);邀请下级、分销推广、升级VIP、分享赚佣金(仅 enableShare + useShare,无海报);首页(好友+朋友圈+复制链接三按钮全亮) +- 注意:tabBar 页**也支持朋友圈分享**(之前误判已纠正)——只要 config 开 enableShareTimeline + 定义 onShareTimeline 即显示按钮;"tabBar 不渲染"仅指朋友圈打开后的单页模式里底部 tabBar 不显示。朋友圈/复制链接开发者工具可能看不到入口,必须真机测试。复制链接是 Beta(基础库 2.14.3+)。 diff --git a/src/hooks/useShare.ts b/src/hooks/useShare.ts index c87eb25..b8ed60d 100644 --- a/src/hooks/useShare.ts +++ b/src/hooks/useShare.ts @@ -1,4 +1,4 @@ -import { useRef } from 'react' +import { useRef, useEffect } from 'react' import Taro, { useShareAppMessage, useShareTimeline } from '@tarojs/taro' import { useUser } from './useUser' @@ -11,8 +11,10 @@ export interface UseShareOptions { query?: string /** 封面图(海报临时路径或网络图地址),不传则微信截取页面 */ imageUrl?: string - /** 是否注册朋友圈分享(仅非 tabBar 页生效)。tabBar 页请传 false,避免注册无效的圈友回调 */ + /** 是否注册朋友圈分享。tabBar 页亦可分享朋友圈(仅在朋友圈打开后的单页模式里 tabBar 不渲染,发起分享不受影响),默认 true */ enableTimeline?: boolean + /** 是否启用「复制链接」(右上角菜单复制链接按钮,基础库 2.14.3+ Beta)。开启后进入页面绑定、离开解绑 */ + enableCopyUrl?: boolean } /** 当前是否处于朋友圈单页模式(scene=1154) */ @@ -40,9 +42,10 @@ function buildQuery(query: string | undefined, inviterId?: number | string): str } /** - * 统一注册「分享给好友」与「分享到朋友圈」回调。 + * 统一注册「分享给好友」「分享到朋友圈」「复制链接」回调。 * 自动在 path/query 中追加 inviter(当前登录用户 id),用于分销裂变。 - * 注意:朋友圈分享仅对非 tabBar 页生效,需在页面 config 中设置 enableShareTimeline: true。 + * 朋友圈分享对 tabBar 页同样生效(朋友圈打开后为单页模式,tabBar 不渲染,但发起分享不受影响)。 + * 需在页面 config 中设置 enableShareAppMessage / enableShareTimeline: true 才会显示对应菜单。 */ export function useShare(options: UseShareOptions) { const { user } = useUser() @@ -61,7 +64,6 @@ export function useShare(options: UseShareOptions) { }) useShareTimeline(() => { - // tabBar 页不支持朋友圈,config 也不会开启对应入口,这里返回空对象避免无效注册 if (optionsRef.current.enableTimeline === false) return {} const o = optionsRef.current return { @@ -70,4 +72,18 @@ export function useShare(options: UseShareOptions) { imageUrl: o.imageUrl, } }) + + // 复制链接:进入页面绑定、离开解绑(全局监听,需手动管理避免影响其它页面) + useEffect(() => { + if (!options.enableCopyUrl) return + if (typeof Taro.onCopyUrl !== 'function') return + const handler = () => { + const o = optionsRef.current + return { query: buildQuery(o.query, inviterId), title: o.title } + } + Taro.onCopyUrl(handler) + return () => { + if (typeof Taro.offCopyUrl === 'function') Taro.offCopyUrl(handler) + } + }, [options.enableCopyUrl, inviterId]) } diff --git a/src/pages/index/index.tsx b/src/pages/index/index.tsx index 7c03945..eeb5b18 100644 --- a/src/pages/index/index.tsx +++ b/src/pages/index/index.tsx @@ -16,6 +16,7 @@ import { getCompressedImageUrl } from '@/utils/image' definePageConfig({ navigationBarTitleText: '首页', enableShareAppMessage: true, + enableShareTimeline: true, }) const IndexPage: React.FC = () => { @@ -26,11 +27,12 @@ const IndexPage: React.FC = () => { const [loading, setLoading] = useState(true) const scrollHeight = useScrollHeight(44) - // 首页分享给好友(tabBar 页不支持朋友圈,仅启用好友分享) + // 首页分享:好友 + 朋友圈 + 复制链接(右上角三个按钮全亮) useShare({ title: '鑫龙家电 - 精选好物,实惠到家,等你来逛~', path: '/pages/index/index', - enableTimeline: false, + enableTimeline: true, + enableCopyUrl: true, })