1. 程式人生 > >vue hash模式下微信分享後開啟首頁,三種完美解決方案

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