惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

量子位
Stack Overflow Blog
Stack Overflow Blog
人人都是产品经理
人人都是产品经理
The GitHub Blog
The GitHub Blog
Engineering at Meta
Engineering at Meta
Vercel News
Vercel News
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Y
Y Combinator Blog
The Cloudflare Blog
Last Week in AI
Last Week in AI
B
Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
T
Tailwind CSS Blog
V
Visual Studio Blog
博客园 - 三生石上(FineUI控件)
小众软件
小众软件
Google DeepMind News
Google DeepMind News
D
DataBreaches.Net
博客园 - 司徒正美
B
Blog RSS Feed
Microsoft Azure Blog
Microsoft Azure Blog
罗磊的独立博客
Hugging Face - Blog
Hugging Face - Blog
L
LangChain Blog

博客园 - 码间留白

uniapp打包的APP内嵌H5游戏切后台背景音乐停不下来的解决方案 微信小程序审核总被拒?掌握这套“极简闭环”方案,轻松通关,亲测有效! uni-app 项目鸿蒙原生适配实录:微信授权登录从"点击无反应"到真机跑通,条件编译、SDK 配置与那些官方文档没说清的坑 uniapp项目鸿蒙适配,rebuild 后同步原生工程的三种方案与分层决策 uniapp项目适配鸿蒙端没有自定义基座,调试和打包怎么办? 鸿蒙纯血系统适配实战记录:uView + Vue3 的 uni-app 项目适配鸿蒙 NEXT,一天搞定主功能运行到鸿蒙纯血系统 AI辅助前端开发实战指南:高效落地、避坑沉淀全流程 uni-app 集成网易云信通话插件:首页通话监听一直只有第一次有日志?从监听丢失到重复上报的完整治理之路 即时通信 IM 踩坑实录:群主拉人入群后无法收消息?一文讲透 10007 错误码 AI时代插件开发新玩法,分分钟抽离封装插件,你需要做的只是发布到插件市场 PhotoShop CS6在win11系统中界面字体很小,通过兼容性设置强制高 DPI 缩放即可解决 不会后端不用愁,Strapi解你忧——使用Qoder生成前端开发框架,技术栈React18 + Vite + ReactRouter6 + Axios + vw 适配 + Ant Design Mobile + Zustand + Strapi5 不会后端不用愁,Strapi解你忧——Strapi后台数据表创建及API联调测试,实现查询文章及关联的分类、标签、评论等表连接查询 不会后端不用愁,Strapi解你忧——搭建博客系统常用数据表设计 windows11系统如何安装多个版本的node,新旧项目切换再也不需要卸载重装了 不会后端不用愁,Strapi解你忧——前端使用Strapi就能实现常见的数据增删查改,分页、排序、模糊查询、时间范围等,不要后端也能自己建站 不会后端不用愁,Strapi解你忧——Windows 11 本地完整部署 Strapi + MySQL 8 实操攻略,从下载到配置启动全指南 不会后端不用愁,Strapi解你忧——Strapi v5.4设置中文语言展示 win11电脑浏览器无法上网但微信正常使用,通常是因为‌DNS解析失败‌,手动设置可靠的公共DNS服务器地址来解决问题 高效能CI/CD流水线设计:Jenkins与Docker的7个关键优化点 从零搭建 Docker + Jenkins CI/CD 流水线:实现项目自动化构建与部署 AI辅助开发——阿里Qoder重构vue2项目到vue3后继续对项目页面加载速度进行优化 vue3项目本地环境网路请求初始连接过久导致接口请求时间过长的问题处理 JavaScript 数组高阶用法汇总(含浏览器+微信小程序WebView支持) 京东小程序报错APP-SERVICE-SDK:setStorageSync:fail vue3+ts项目自定义全局函数调用正常但IDE报异常类型ComponentPublicInstance上不存在属性“$showLoading" vue项目实现Tab页面触底上拉切换下个Tab vue3+ts实现页面滚动位置的保存及恢复 到底是用vue2还是vue3好? css3过渡效果如何处理高度不确定的动态内容
微信小程序内嵌vue项目实现页面自定义分享完整示例代码
码间留白 · 2025-12-01 · via 博客园 - 码间留白

如题,微信小程序内嵌vue2的h5项目,要实现H5页面自定义分享,具体操作如下:

一. H5部分

1. public/index.html引用微信jssdk:

<script src="https://res.wx.qq.com/open/js/jweixin-1.6.0.js"></script>

2. 封装wechat.js处理向向小程序传递分享参数的相关业务逻辑:

// src/assets/js/utils/wechat.js
/**
 * 判断是否在微信小程序 web-view 环境中
 */
export const isMiniProgramWebView = () => {
  const userAgent = window.navigator.userAgent.toLowerCase();
  // 微信小程序 web-view 的 UA 包含 "miniprogram"
  return userAgent.includes('miniprogram');
};

/**
 * 向小程序发送消息(封装 postMessage)
 * @param {Object} data - 要传递给小程序的数据(必须是可序列化的对象)
 */
export const postMessageToMiniProgram = (imgUrl, title) => {
  if (isMiniProgramWebView() && window.wx?.miniProgram?.postMessage) {
    try {
      let shareData = {
        share_title: title || document.title,
        share_img_url: imgUrl,
        share_page_url: location.href,
      }
      window.wx.miniProgram.postMessage({
        data: shareData, // 核心:传递的数据(会被小程序接收)
      });
      console.log('H5 向小程序发送消息成功:', shareData);
    } catch (error) {
      console.error('H5 向小程序发送消息失败:', error);
    }
  } else {
    console.warn('当前非小程序 web-view 环境,无法发送消息');
  }
};

注:postMessageToMiniProgram方法接收两个参数imgUrl和title,imgUrl必传,title可选,如果有就使用,没有就取页面标题。

同样,我们这里直接取页面当前真实的url,这样页面调用中就不需要单独传了。如果不能直接以当前页面真实链接作为分享链接,那可以对这个方法增加页面url的参数。

3. 页面调用:

import { postMessageToMiniProgram } from '@/assets/js/utils/wechat';

分享指定图片:

mounted() {
  //分享参数上传,分享图片为指定图片
  postMessageToMiniProgram("https://www.xxx.com/ihg/shareImg.jpg")
}

如果要分享的内容是通过接口获取的,那就需要对数据进行监听:

watch: {
  banner(n, o) {
    //分享参数上传
    postMessageToMiniProgram(this.banner)
  }
}

4.非自定义分享页面统一添加上传特定的信息,小程序端接收到这个特定的信息就不在对当前页面进行自定义分享(通常都是走小程序的默认分享)

//router.js
router.beforeEach((to, from, next) => {
  //非特定页面分享传空值给小程序
  if (!['Home', 'Cate', 'GoodsDetail'].includes(to.name)) {
    window.wx.miniProgram.postMessage({
      data: { share: 'default' }
    });
  }
  next()
});

注:

之所以要加这段代码,是因为如果用户访问了没有自定义分享的页面,在分享的时候依然会触发webview的bindmessage事件,但拿到的是上一次h5自定义分享页面postmessage的数据,直接导致调起分享的时候分享出去的是上一次访问过的自定义分享页面了。

所以,即使是不需要自定义分享的页面,也要postmessage给小程序,让小程序知道这个页面不需要自定义分享(通常都是走小程序的默认分享了)。

如上,h5端的相关改造已经完成了。

二. 小程序端

1. 页面模板

<!--package/view_h5/index.wxml-->
<view>
    <web-view src="{{ url }}" bindmessage="onWebViewInvoke" />
</view>

脚本文件:

// package/view_h5/index.js
Page({

    /**
     * 页面的初始数据
     */
    data: {
        url: "",
        shareConfig: ""
    },

    /**
     * 生命周期函数--监听页面加载
     */
    onLoad(options) {
        let {
            url
        } = options
        url = decodeURIComponent(url)
        this.setData({
            url: url
        })
    },
    onShareAppMessage() {
        const {
            shareConfig
        } = this.data;
        // 默认配置(防止无参数时报错)
        const defaultConfig = {
            share_title: "XX商城",
            share_img_url: "/images/default-share.jpg", // 小程序本地默认图片
            share_page_url: "/pages/index/index" // 小程序默认页面
        };
        // 合并配置(H5 传递的参数优先)
        const finalConfig = {
            ...defaultConfig,
            ...shareConfig
        };

        return {
            title: finalConfig.share_title, // 分享标题(用 H5 传递的)
            imageUrl: finalConfig.share_img_url, // 分享图片(用 H5 传递的)
            // 分享路径:仅使用 share_page_url(注意:需转义特殊字符,如 #)
            path: `/package/view_h5/index?url=${encodeURIComponent(finalConfig.share_page_url)}`,
            success: () => wx.showToast({
                title: '分享成功'
            }),
            fail: (err) => console.error('分享失败:', err)
        };
    },
    onWebViewInvoke(e) {
        const messages = e.detail.data;
        messages.forEach(msg => {
            // 存储参数到页面数据(供分享时使用)
            this.setData({
                shareConfig: msg
            });
        });
    },
})

如上,就是微信小程序内嵌H5的完整示例了。当然这只是一种可行的实现方式,不同人写法不同,可以按照自己熟悉的方式去写。