vue hash模式下微信分享后打开首页,三种完美解决方案
微信分享功能给我们带来了很大的便利,使得基于微信开发出来的 H5 页面可以很好的通过微信平台进行传播。所以呢,基本上每个基于微信开发的 H5 都会集成微信分享功能。但是,前几天在对接微信分享 API 的时候发现了一个大坑。使用 vue 框架开发的应用,分享出去的链接会被截断:
正常链接:https://hxkj.vip/#/article?article_id=8
分享出去的链接被打开之后变成了:https://hxkj.vip/?from=singlemessage&isappinstalled=0
对,就是这么坑。不仅路由被切掉了,参数也没了。。。。。。
针对以上问题,首先想到的就是网上找方法求救。其中找到一个方法:(本文待分享链接都使用 shareLink 作为变量名)
let shareLink = window.location.href.split("#")[0]+"#"+window.location.href.split("#")[1]; // 使用这种方法重新拼接一下当前连接
然而,并没有什么用,该被切还是被切。于是,就诞生了以下三种有效的方法。
1、全局路由里拦截链接
2、前端页面中转,重定向
3、借助后端重定向
一、全局路由里拦截链接
1、在 # 号前面加上 ? 号
经过试验发现,只要在路由的 # 号前面加上 ?号,微信分隔链接的时候只会在域名与参数之间加上 ?from=singlemessage&isappinstalled=0,后面还是会携带原本的参数的,不会被完全切掉。所以,加上之后:
let shareLink = 'https://hxkj.vip/?#/article?article_id=8';
shareLink = shareLink.replace('/#/', '/?#/');
待分享的链接变成了:https://hxkj.vip/?#/article?article_id=8
分享出去之后,链接变成了这个:https://hxkj.vip/?from=singlemessage&isappinstalled=0#/article?article_id=8
发现区别了吧,这次虽然被插入了 ?from=singlemessage&isappinstalled=0 这一串东西,但是最起码路由和参数还保留着,接下来我们就要对这一段链接进行处理了。
2、正则替换 ?from=singlemessage&isappinstalled=0
这一步需要在 vue 全局路由里完成,操作如下:
// router.js
router.beforeEach((to, from, next) => {
    let url = window.location.href;
    if (url.includes('?from=')) { // 判断是否携带了 from 参数,这一步灵活变通,只要能判断出是从微信分享链接进来的就 OK
        url = url.replace(/vip.+.#/, 'vip/#'); // 利用正则表达式去掉微信携带的 ?from=singlemessage&isappinstalled=0 这串参数,如果这串参数对于你当前的页面有用处的话,可以重新拼接到你正常的链接后面去
        window.location.href = url; // 重定向到正常链接
    }
})
上面这段代码的核心在于正则替换 url = url.replace(/vip.+.#/, 'vip/#'),这并不是吃饱了没事干,非要写正则。而是微信分享到每个渠道(微信单人聊天、微信群聊、朋友圈、QQ...)所携带的 from 参数是不一样的,所以需要从域名后缀那里开始往后匹配,直到 # 号为止。替换之后,就相当于把微信添加上去的那一串参数给删除了!
以上步骤操作正确的话:
待分享的链接为:https://hxkj.vip/?#/article?article_id=8
分享出去之后,再次打开分享链接。由于路由那里做了处理,链接变为为正常状态:https://hxkj.vip/#/article?article_id=8
二、前端页面中转,重定向
1、新建中转页
在 public 文件夹里新建一个 html 页面(与项目中 index.html 同级),命名为 redirect.html,文件内容如下:
<script>
    let url = location.href.split('?')
    let params = url[1].split('&')
    let data = {}
    params.forEach((n, i) => {
        let p = n.split('=')
        data[p[0]] = p[1]
    })
    if (!!data.shareRedirect) {
        window.location.href = decodeURIComponent(data.shareRedirect)
    }
</script>
因为只作为跳转使用,所以不需要其他的东西,只需要写 js 就可以了
2、组装分享链接
把要分享的链接,设置为中间页面的路径
let shareLink = 'https://hxkj.vip/#/article?article_id=8';
shareLink = window.location.href.split('#')[0] + 'redirect.html?shareRedirect=' + encodeURIComponent(shareLink);
这个方法,比第一个方法多了个中间页,总体来说,还是比较方便的。
以上步骤操作正确的话:
待分享的链接为:https://hxkj.vip/redirect.html?shareRedirect=https%3A%2F%2Fhxkj.vip%2F%3F%23%2Farticle%3Farticle_id%3D8
分享出去之后,再次打开分享链接。由于中间页面做了重定向处理,链接变为为正常状态:https://hxkj.vip/#/article?article_id=8
三、借助后端重定向
let shareLink = 后端地址;
这种方法相对于第二种方法,没有本质的区别。只是相当于把重定向那一步放到后端去处理了。页面分享的链接为后端同事给出来的地址。
四、总结
At last,看完之后有什么不懂的,可以留言反馈。
转载请注明出处:https://www.jianshu.com/p/97729dd2c94d
作者:TSY
个人空间:https://hxkj.vip
vue hash模式下微信分享后打开首页,三种完美解决方案的更多相关文章
- vue history模式 ios微信分享坑
		
vue history模式 ios微信分享坑 问题分析:因为苹果分享会是调取签名失败是因为:苹果在微信中浏览器机制和安卓不同,有IOS缓存问题,和IOS对单页面的优化问题,通俗点说安卓进行页面跳转分享 ...
 - Vue项目history模式下微信分享总结
		
原文 : http://justyeh.top/post/39/ 2019-07-02 Vue微信分享 每回遇到微信分享都是一个坑,目前的商城项目使用Vue开发,采用history的路由模式,配置微信 ...
 - vue项目history模式下微信分享相关问题
		
import wx from '@/utils/wx' import { shareApi } from '@/api' // 微信验证 export function requireConfig() ...
 - vue history模式 ios微信分享 踩过的坑
		
背景:教育项目,整体依赖于微信环境,涉及到微信分享.微信二次分享 问题:vue使用history模式在iso微信下分享设置出错(签名认证错误.分享设置失败) 问题发现路径 1.按照微信公众号官方文档设 ...
 - 痞子衡嵌入式:串行NOR Flash的Continuous read模式下软复位后i.MXRT无法启动问题解决方案之RESET#
		
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MXRT上使能NOR Flash的Continuous read模式在软复位后无法正常启动问题的解决经验. 前一篇文章 <在i ...
 - vue2.0 如何在hash模式下实现微信分享
		
最近又把vue的demo拿出来整理下,正好要做"微信分享"功能,于是遇到新的问题: 由于hash模式下,带有"#",导致微信分享的签证无效:当改成history ...
 - vue2.0 Hash模式下实现微信分享
		
1,通过后台,获取accessToken 和 签名jsApiTicket,并写入浏览器缓存(可以写在app.vue中) <script type="text/ecmascript-6& ...
 - VUE Node模式下,如何改变菜单的颜色,如何将超长文字缩略显示,在鼠标进入后展开全部显示,鼠标移出则恢复缩略显示
		
VUE Node模式下,如何改变菜单的颜色,如何将超长文字缩略显示,在鼠标进入后展开全部显示,鼠标移出则恢复缩略显示: “事件”引起变量值的变化,系统引擎自动根据变量值的变化刷新页面 在VUE Nod ...
 - 关于Vue单页面实现微信分享的Bug
		
// 问题描述在微信中分享到朋友圈或好友时,分享出去的路由被破坏,打开分享的链接,路由中的“#”会被去掉并追加?from= & Timeline= 之类的后缀参数,这就造成了分享出去的链接只能 ...
 
随机推荐
- MAVEN配置及Spring Tool Suite的Maven配置
			
1.下载Maven http://maven.apache.org/download.cgi 如图点击下载即可 2.Maven配置 2.1配置本地仓库 创建目录maven-repository如图所示 ...
 - 关于SDWebImage的一点小坑
			
做项目遇到一个问题,是用sd加载图片,明明本地有图片,使用sd的内部方法也可以拿到那些个图片,但是就是加载缓慢,如果网络还行,网络加载图片都比加载本地图片快.而使用[[SDImageCache ...
 - 双重 hash
			
#include<stdio.h> #include<map> #include<queue> #include<algorithm> using na ...
 - 三个实用的javascript小技巧
			
从后向前获取数组元素 如果你想从后向前获取一个数组的元素,可以这样写: var newArray = [1, 2, 3, 4] console.log(newArray.slice(-1)) // [ ...
 - 关于爬虫的日常复习(7)—— DOM操作及selenium库
 - Flask蓝图(Blueprint)
			
一.作用 1.目录结构划分 2.url添加前缀 url_prefix 3.应用特殊装饰器,在该蓝图定义的特殊装饰器,只在改蓝图的起效 二.简单示例 1.创建一个项目文件 2.创建一个同名的python ...
 - java中常用的锁机制
			
基础知识 基础知识之一:锁的类型 锁就那么几个,只是根据特性,分为不同的类型 锁的概念 在计算机科学中,锁(lock)或互斥(mutex)是一种同步机制,用于在有许多执行线程的环境中强制对资源的访问限 ...
 - Add Scaffold
 - OpenCV各种绘制调用:线,矩形,圆,椭圆,文字
			
OpenCV提供了各种绘制接口,可以往图片里画各种东西,这种功能可以为以后在图像上标记一些信息方便调试 // drawcall.cpp: 定义控制台应用程序的入口点. // #include &quo ...
 - SpringBoot高级篇Ⅸ --- 热部署与监控管理
			
一.热部署 在开发中我们修改一个Java文件后想看到效果不得不重启应用,这导致大量时间花费,我们不希望重启应用的情况下,程序可以自动部署(热部署). 1.1 模板引擎 在SpringBoot中开发情况 ...