uni-app 小程序全局挂载分享功能,并动态配置页面是否可以分享

  1. 基于uni-app 小程序全局挂载 onShareTimeline 和 onShareAppMessage 方法
  2. 动态设置 onShareTimeline 和 onShareAppMessage 方法

1. 创建一个share.js 全局混入模块

js 复制代码
// utils/share.js
export default {
  data() {
    return {
      // 计数器 奇数不能分享
      count: 0
    }
  },
  onShareTimeline(res) {
    this.count++
    return {
      title: '转发朋友圈',
      query: 'id=123',
      imageUrl: '你的图片',
      promise: new Promise((resolve, reject) => {
        // 判断是否进行分享 偶数可以分享
        if (this.count % 2 === 0) {
          resolve({
            title: `转发朋友圈${this.count}`,
            query: 'id=123',
            imageUrl: '你的图片',
          })
        } else {
          reject()
          uni.showToast({
            title: `奇数不允许分享${this.count}`,
            icon: 'none'
          })
        }
      })
    }
  },
  onShareAppMessage(e) {
    this.count++
    return {
      title: '转发给好友',
      path: '/pages/main/main',
      imageUrl: '你的图片',
      promise: new Promise((resolve, reject) => {
        // 判断是否进行分享
        if (this.count % 2 === 0) {
          resolve({
            title: `转发给好友${this.count}`,
            path: '/pages/main/main',
            imageUrl: '你的图片',
          })
        } else {
          reject()
          uni.showToast({
            title: `奇数不允许分享${this.count}`,
            icon: 'none'
          })
        }
      })
    }
  }
}

2. 在全局入口文件main.js全局混入

js 复制代码
import App from './App'
import { useSentry } from './utils/sentry'
import share from './utils/share'
// #ifndef VUE3
import Vue from 'vue'
Vue.config.productionTip = false
App.mpType = 'app'
const app = new Vue({
    ...App
})
app.mixin(share)// 非 vue3 项目
app.$mount()
// #endif

// #ifdef VUE3
import { createSSRApp } from 'vue'
export function createApp() {
  const app = createSSRApp(App)
  useSentry(app)
  app.mixin(share)// vue3 项目
  return {
    app
  }
}
// #endif
  • 扩展
  1. 案例中的 count 判断,可以换成当前页面的 path,再维护一个可分享页面池子,判断 path 是否在池中,决定是否能分享
  2. button 类型的分享,可以在页面中向 share.js 传递参数,实现特殊的分享内容。也可以使用 uni.$emit 等方法实现
html 复制代码
<template>
	<button open-type="share" @click="setShareInfoTomixin"></button>
</template>
<script setup lang="ts">
	import { getCurrentInstance } from 'vue'
	const { ctx } = getCurrentInstance() as any
	// setShareInfoTomixin方法必须先触发,不能写在 <button open-type="share"></button> 里面
	const setShareInfoTomixin = (index: number)=>{
    //  setShareInfo 可以是share.js文件 methods 中的任意方法
 	ctx.setShareInfo({
		title: `转发朋友圈${this.count}`,
		query: 'id=123',
		imageUrl: '你的图片',
     })
}
</script>
相关推荐
单线程_0121 分钟前
从案例分析 Vue3 Tokenizer+Parser 源码五
前端·javascript·vue.js
vx-Biye_Design6 小时前
SSM伴侣动物伴护星小程序06330-计算机课程设计、毕业设计
spring boot·后端·elasticsearch·小程序·架构·课程设计·idea
mldong8 小时前
你的 Vue3 项目也能有钉钉同款审批流设计器:npm 装包,10 分钟画出第一条审批流
前端·vue.js
小疯仔11 小时前
轨迹在地图上“漂“了 500 米?一文吃透 WGS-84→GCJ-02 坐标转换引擎(GPX→JSON 实战源码剖析)
小程序·json·notepad++
mayaairi12 小时前
Vue2 组件通讯(三):全局事件总线、PubSub、插槽与组件实例属性
前端·javascript·vue.js
mayaairi15 小时前
Vue2 组件通讯(四):v-model、scoped样式、mixins与plugins
前端·javascript·vue.js
梦曦i15 小时前
@meng-xi/uni-router 未来展望:夯实基础、深化体验、探索前沿
前端·uni-app
武哥聊编程16 小时前
【AI实战项目】基于SpringAI+Springboot+Vue的AI面试刷题训练平台
vue.js·人工智能·spring boot·springai
lhldsg16 小时前
全民健身解决方案软件开发实战:从架构设计到部署指南
java·前端·数据库·小程序
mayaairi19 小时前
Vue2 组件通讯(二):ref、自定义事件与provide/inject实战
前端·javascript·vue.js