vue項目hash模式下,須要實現微信分享。支持傳遞多參、無參、以及指定跳轉頁面、可配置vue
因爲hash模式 #符號的存在,在不一樣平臺會存在兼容性問題。會致使 分享出去的頁面不能跳轉到指定頁面。因此思路就是 將 頁面路徑 做爲一個參數分享出去(本例 稱它爲 path參數),打開分享連接後 咱們根據path參數 來還原URL,進行重定向。後端
在進入項目前,進行url判斷:api
一、needRedirect 是否須要重定向:主要看path參數是否存在微信
二、返回homeUrl:頁面的正常路徑。將形如 http://wxh5.gek6.com/bystu/?path=/works&dudu=2&haha=123 轉換成 http://wxh5.gek6.com/bystu/#/works?dudu=2&haha=123app
/** * 頁面重定向-確保頁面連接正常 * 支持多參、無參、指定頁面 * @returns {{needRedirect: *, homeUrl: string}} */ urlResetForWcShare: function () { let needRedirect = false, homeUrl = '', searchObReal = {}, searchstr = '' let oriUrls = window.location.href.split('?') // let baseShareURl = 'http://wxh5.gek6.com/bystu/' let baseShareURl = window.location.origin + window.location.pathname homeUrl = baseShareURl + `#${config.platform[WECHAT.SHARE_PAGE_PATH]}` if (oriUrls.length > 1) { let searchUrls = oriUrls[1].split('#') let searchUrlReal = searchUrls[0] let searchOb = qs.parse(searchUrlReal) let {path} = searchOb config.platform[WECHAT.SHARE_EXTRA_PM_KEYS].forEach(item => searchObReal[item] = searchOb[item]) if (config.platform[WECHAT.SHARE_EXTRA_PM_KEYS].length) searchstr = `?${qs.stringify(searchObReal)}` needRedirect = path || config.platform[WECHAT.SHARE_EXTRA_PM_KEYS].length !== Object.keys(searchOb).length homeUrl += searchstr } // alert(`頁面重定向 baseShareURl: ${window.location.origin + window.location.pathname + `#${config.platform[WECHAT.SHARE_PAGE_PATH]}` + searchstr}`) return { needRedirect, homeUrl, search: searchObReal } }
主要是要攜帶一些參數:包括path參數,其餘參數。async
/** * 組裝微信分享出去的連接url * @param pm // 附帶參數 * @returns {string} */ wrapWcShareLink: function (pm = {}) { config.platform[WECHAT.SHARE_EXTRA_PM_KEYS].forEach(item => { if (!pm[item]) throw new Error(`微信分享連接缺乏額外參數: ${item}`) }) pm.path = config.platform[WECHAT.SHARE_PAGE_PATH] // 根據path來設置初始頁面 當前爲根路由 return window.location.origin + window.location.pathname + '?' + qs.stringify(pm) },
將 分享連接裏的攜帶參數 從配置文件讀取優化
platform: { [WECHAT.SHARE_EXTRA_PM_KEYS]: ['dudu'], // 微信分享-附帶參數 鍵名 集合 [WECHAT.SHARE_PAGE_PATH]: '/', // 微信分享-指定頁面 },
一、根文件 app.vue:url
async created(){ let urlResetRes = browserUtil.urlResetForWcShare() let {needRedirect, homeUrl, search} = urlResetRes if (needRedirect) { window.location.href = homeUrl // location.reload() } else { let oldDudu = storage.getLocalStorage(LOCALDATA.WORKS_ID) if (!oldDudu || search.dudu != oldDudu) storage.setLocalStorage(LOCALDATA.WORKS_ID, search.dudu) wx_jssdk.sdk_init(homeUrl); } }
二、初始化jssdk。spa
async sdk_init(homeUrl){ // 獲取簽名數據 let sign; try { sign = await getSign(homeUrl); // 訪問接口,獲取簽名數據 } catch (err) { console.log(err) // alert(JSON.stringify(err)) } // console.log('獲取簽名成功') // console.log(sign); wx.config({ debug: false, // 開啓調試模式,調用的全部api的返回值會在客戶端alert出來,若要查看傳入的參數,能夠在pc端打開,參數信息會經過log打出,僅在pc端時纔會打印。 appId: sign.appid, // 必填,公衆號的惟一標識 timestamp: sign.timestamp, // 必填,生成簽名的時間戳 nonceStr: sign.noncestr, // 必填,生成簽名的隨機串 signature: sign.signature, // 必填,簽名 jsApiList: ["onMenuShareTimeline", "onMenuShareAppMessage", "onMenuShareQQ", "onMenuShareQZone", "onMenuShareWeibo", 'updateAppMessageShareData', 'updateTimelineShareData'] // 必填,須要使用的JS接口列表 }); }
想兼容這樣一種情形:頁面連接參數有垃圾參數(不屬於配置文件裏的額外參數)。debug
此時 使用 分享連接(無#符號)如 http://wxh5.gek6.com/bystu/?path=/works&dudu=2&haha=123 仍可支持分享。但使用 原始連接(有#)如 http://wxh5.gek6.com/bystu/#/works?dudu=2&haha=123,分享不可用。實質是 window.location.href 在只改變參數的情形下,調用不起做用。
解決思路是: 在這種情形下 調用 reload()。須要注意兼容原來的功能(同時 location.href,reload 在其餘情形會無限循環。因此關鍵是 判斷是否爲 此情形。暫未解決!!!遺憾
使用僞靜態傳參,但須要後端的配合(攔截跳轉到對應的頁面)。連接形如:http://wxh5.gek6.com/bystu/we_2
嘗試代碼
/** * 組裝微信分享出去的連接url * @param pm // 附帶參數 * @returns {string} */ wrapWcShareLink: function (pm = {}) { let wePmStr = '', keysSize = config.platform[WECHAT.SHARE_EXTRA_PM_KEYS].length config.platform[WECHAT.SHARE_EXTRA_PM_KEYS].forEach((item, index) => { if (!pm[item]) throw new Error(`微信分享連接缺乏額外參數: ${item}`) wePmStr += `we_${item}` if (index+1 < keysSize) wePmStr += '/' }) return window.location.origin + window.location.pathname + wePmStr }, /** * 頁面重定向-確保頁面連接正常 * 支持多參、無參、指定頁面 * @returns {{needRedirect: boolean, homeUrl: string, search: {}}} */ urlResetForWcShare: function () { let needRedirect = false, homeUrl = '', searchObReal = {}, searchstr = '' if (location.search) needRedirect = true // 二次分享 會自動加search let baseShareURl = window.location.origin + window.location.pathname let shareFlagIndex = window.location.pathname.indexOf('we_') if (shareFlagIndex > 0) { needRedirect = true baseShareURl = window.location.origin + window.location.pathname.substring(0, shareFlagIndex) let weStr = location.pathname.substring( shareFlagIndex) weStr = weStr.replace(/we_/g, '') let wePms = weStr.split('/') if (wePms.length !== config.platform[WECHAT.SHARE_EXTRA_PM_KEYS].length) throw new Error(`非法連接,參數不匹配`) config.platform[WECHAT.SHARE_EXTRA_PM_KEYS].forEach((item, index) => searchObReal[item] = wePms[index]) if (config.platform[WECHAT.SHARE_EXTRA_PM_KEYS].length) searchstr = `?${qs.stringify(searchObReal)}` } //baseShareURl = 'http://wxh5.gek6.com/bystu/' homeUrl = baseShareURl + `#${config.platform[WECHAT.SHARE_PAGE_PATH]}` + searchstr alert(`頁面重定向 homeUrl: ${homeUrl}`) return { needRedirect, homeUrl, search: searchObReal } }