UniApp,在微信小程序下,使用Hook来完成分享

在微信小程序中,如果多个页面都有分享的配置,大部分会考虑将分享的代码封装一下然后各个页面按需调用,一般人写法会是这样

typescript 复制代码
// share.ts
import { onShareAppMessage, onShareTimeline } from '@dcloudio/uni-app'

const home = '/pages/home'

export interface ShareOptions {
    title?: string
    path?: string
    imageUrl?: string
    query?: AnyObject
}

export function useMpShare() {
    function share(
        optionsFn: (() => ShareOptions) | ShareOptions = () => ({
            title: '小程序名称',
            path: '',
            imageUrl: '',
            query: {},
        })
    ) {
        onShareAppMessage(() => {
            const options = typeof optionsFn === 'function' ? optionsFn() : optionsFn
            return buildOptions(options)
        })
    }

    return { share }
}

// home.vue
import { useMpShare } from '@/hooks/use-share'
const { share }  = useMpShare()
share()

正常看这样确实没问题,但是上真机测试后,发现,传入的自定义title不起作用。查阅文档和测试后发现,需要做以下改动

typescript 复制代码
// share.ts
import { onShareAppMessage, onShareTimeline } from '@dcloudio/uni-app'

const home = '/pages/home'

export interface ShareOptions {
    title?: string
    path?: string
    imageUrl?: string
    query?: AnyObject
}

export function useMpShare() {
    function share(
        optionsFn: (() => ShareOptions) | ShareOptions = () => ({
            title: '小程序名称',
            path: '',
            imageUrl: '',
            query: {},
        })
    ) {
        onShareAppMessage(() => {
            const options = typeof optionsFn === 'function' ? optionsFn() : optionsFn
            return buildOptions(options)
        })
    }

    return { onShareAppMessage: share } // 将暴露出去的函数名改为 onShareAppMessage
}

// home.vue
import { useMpShare } from '@/hooks/use-share'
const { onShareAppMessage }  = useMpShare()
onShareAppMessage({ title: '此页面的title' })

另外,参数的传入如果是个动态值也有要求

javascript 复制代码
// home.vue
import { useMpShare } from '@/hooks/use-share'
const { onShareAppMessage }  = useMpShare()
const options = { title: '如果title需要动态赋值' }
onShareAppMessage(() => options) // onShareAppMessage 必须在根上进行调用,不能在请求完成后调用

api.fetchData().then((r) => options.title = r.title)
相关推荐
拾年27516 分钟前
React Hooks 进阶篇:useMemo / useCallback / useReducer / useImperativeHandle,用「算账 +
前端·javascript·react.js
Jackson__22 分钟前
面试官:如何在老项目中使用新框架,并实现通信?
前端·javascript·面试
拾年27525 分钟前
React Hooks 保姆级教程:把组件想象成失忆的打工人,4 个 Hook 带你原地起飞
前端·javascript·react.js
mmsx31 分钟前
一个 Bug 修了 12 轮,根因只有一句话:AI 编程时代,日志才是唯一的真相
前端
默_笙33 分钟前
😝 5 亿次循环卡死页面?我用 Web Worker 把它扔进后台线程,页面丝滑如初
前端·javascript
CAD老兵35 分钟前
一行代码集成 DWG/DXF 图纸查看:测量批注,数据不出站
前端·javascript·github
小林ixn36 分钟前
单例模式:从弹窗管理到全局状态,一个模式搞定
前端·javascript·设计模式
AI编程实验室37 分钟前
Node.js Agent Handoff 仓库扫描 MVP:忽略规则、include 通配与稳定输出实现
前端·ai编程
猫不易37 分钟前
从 Virtual DOM 到 Vapor:Vue 3.6 的另一条路
前端·vue.js
光影少年44 分钟前
react navite性能优化 & 常见坑
前端·react native·掘金·金石计划