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>
相关推荐
十年磨一剑~2 小时前
springboot+vue+mysql手搓一个管理系统
vue.js·spring boot·mysql
DEMO派2 小时前
CSS优先级规则以及如何提升优先级方案详解
前端·javascript·css·vue.js·reactjs·html5·angular.js
hhcccchh2 小时前
学习vue第十一天 Vue3组件化开发指南:搭积木的艺术
前端·vue.js·学习
小夏卷编程2 小时前
ant-design-vue 2.0 a-table 中实现特殊行样式,选中样式,鼠标悬浮样式不一样
前端·javascript·vue.js
一颗烂土豆2 小时前
ECharts 水球图不够炫?试试 RayChart 的创意可视化玩法
前端·vue.js·数据可视化
如果你好2 小时前
TypeScript 接口(interface)完全指南:语法、特性与实战技巧
vue.js·typescript
AI_56782 小时前
Webpack从“配置到提速”,4步解决“打包慢、体积大”问题
前端·javascript·vue.js
Aotman_2 小时前
Vue el-table 字段自定义排序
前端·javascript·vue.js·es6
我有一棵树3 小时前
Vite 7 中 dev 没样式、build 却正常:一次由 CSS import 位置引发的工程化问题
前端·javascript·vue.js