uniapp?web-view組件數(shù)據(jù)傳遞及使用注意點(diǎn)示例詳解
1.vue頁(yè)面
本篇文章除特別指出,H5均指原生html文檔,非uniapp編譯的h5
vue頁(yè)面向html頁(yè)面?zhèn)鲄?shù):①直接在src后面拼接參數(shù)(除App端之外,其他端除該方法外無(wú)其它辦法)②使用evalJs執(zhí)行h5里某個(gè)函數(shù)(僅App支持)
<web-view :src="src"></web-view>
let src = ref('')
src.value = `/hybrid/html/xx.html?a1=${a1}&a2=${a2}`H5接收:
//通用(建議原生Html使用):
function getQueryVariable(variable) {
var query = decodeURIComponent(window.location.search.substring(1));
var vars = query.split("&");
for (var i = 0; i < vars.length; i++) {
var pair = vars[i].split("=");
if (pair[0] == variable) { return pair[1]; }
}
return '';
}
const a1 = getQueryVariable('a1');
//如果是uniapp編譯的h5可以推薦onLoad:
onLoad(e=>{
console.log(e)
})/*********************************************************************************************************/
H5向vue傳遞數(shù)據(jù),實(shí)測(cè)注意H5中調(diào)用uni.navigateTo跳轉(zhuǎn)uniapp頁(yè)面時(shí),不支持events參數(shù)!
// h5向打開(kāi)該h5的頁(yè)面?zhèn)鬟f參數(shù):
let obj = {};
let envObj = {};
uni.getEnv(function (res) {
envObj = res
});
if (envObj.h5) {
window.parent.postMessage(obj, "*");
} else {
uni.postMessage({
data: obj
});
}
uni.navigateBack()
// h5跳轉(zhuǎn)其他頁(yè)面?zhèn)鬟f參數(shù):還是通過(guò)url傳遞
uni.navigateTo({
url: `/pages/p1/p1?param=${param}`
})
uni.redirectTo({
url: `/pages/p1/p1?param=${param}`
})
//其他uni跳轉(zhuǎn)等等.....vue接收h5傳的參數(shù)
//在打開(kāi)h5的頁(yè)面接收參數(shù)
let data = {};
// #ifdef H5
function receiveMessage(event) {
console.log(event) //按打印的實(shí)際數(shù)據(jù),有些data是在event.data.data.arg里...
if (event.data.type !== 'WEB_INVOKE_APPSERVICE') {
data = event.data
}
}
window.addEventListener("message", receiveMessage, false);
// #endif
// #ifndef H5
const getMessage = (event) => {
console.log(event)
if (Array.isArray(event.detail.data)) {
data = event.detail.data[0];
} else {
data = event.detail.data;
}
}
// #endif
//h5跳轉(zhuǎn)的其他頁(yè)面接收參數(shù)
import {onLoad} from '@dcloudio/uni-app'
onLoad(e=>{
console.log(e)
}
vue向上一級(jí)vue頁(yè)面?zhèn)鬟f數(shù)據(jù):
//上一級(jí)vue頁(yè)面:
let url = 'xxxxxxx';
uni.navigateTo({
url: url,
events: {
// 為指定事件添加一個(gè)監(jiān)聽(tīng)器,獲取被打開(kāi)頁(yè)面?zhèn)魉偷疆?dāng)前頁(yè)面的數(shù)據(jù)
xxData: function(data) {
console.log(data);
console.log(data.xxDataObj)
//.........
}
}
});
//打開(kāi)h5的vue頁(yè)面:
import {
getCurrentInstance,
} from 'vue';
import {
onUnload
} from '@dcloudio/uni-app'
let data = '測(cè)試';
const instance = getCurrentInstance().proxy
const eventChannel = instance.getOpenerEventChannel()
onUnload(() => {
eventChannel.emit('xxData', {
xxDataObj: data
})
})2.nvue頁(yè)面
//nvue頁(yè)面需要設(shè)置style="flex: 1;"才能鋪滿全屏 <web-view ref="myWebview" @onPostMessage="handlePostMessage" :src="src" style="flex: 1;"></web-view>
nvue向h5頁(yè)面?zhèn)鲾?shù)據(jù)仍可通過(guò)參數(shù)傳遞,也可以通過(guò)evalJs執(zhí)行js語(yǔ)句:
const myWebview = ref(''); //注意不要初始聲明為null,會(huì)報(bào)錯(cuò)
//并且可以操作h5里的全局變量
//evalJs應(yīng)延遲執(zhí)行或在handlePostMessage里執(zhí)行
myWebview.value.evalJs("console.log('執(zhí)行了')");
//或者
myWebview.value.evalJs("uniMsg(JSON.stringfiy(obj))");h5向nvue傳遞數(shù)據(jù)非常簡(jiǎn)單,與vue一致,但不用返回或跳轉(zhuǎn),可實(shí)時(shí)傳遞:
uni.postMessage({
data: {
"xxx":"xxx"
}
})
//nvue頁(yè)面接收:
const handlePostMessage = e => {
console.log(e)
console.log(e.detail.data[0])
}特別注意:
1.App-安卓,如果項(xiàng)目配置了“自定義404等錯(cuò)誤頁(yè)面”,斷網(wǎng)訪問(wèn)web-view組件vue頁(yè)面,無(wú)法使用系統(tǒng)返回鍵返回,原生導(dǎo)航欄上返回也不行,只能殺死app重新進(jìn),控制臺(tái)僅報(bào)紅色“error”字母;官方也沒(méi)有回復(fù)解決辦法~,如果蘋果也有類似問(wèn)題歡迎討論~(最新版HbuiderX4.57似乎已基本解決該問(wèn)題,即多次按返回可以返回)
2.“UniAppJSBridgeReady”事件有時(shí)候會(huì)監(jiān)聽(tīng)失敗,原因未知,這個(gè)事件監(jiān)聽(tīng)放在引入uni_webview.js的后面實(shí)測(cè)OK:
<script type="text/javascript" src="js/uni_webview.js"></script>
<script>
document.addEventListener('UniAppJSBridgeReady', xxFn)
</script>3.nvue頁(yè)面中的h5頁(yè)面實(shí)測(cè)無(wú)法支持暗黑模式即
@media (prefers-color-scheme: dark) {
}即使nvue頁(yè)面配置了plus.nativeUI.setUIStyle('auto');
4.nvue無(wú)法通過(guò)ref獲取webview實(shí)例,不能動(dòng)態(tài)設(shè)置webview或獲取webview的一些參數(shù);
通過(guò)plus創(chuàng)建的webview雖然可以獲得實(shí)例,但需要自己設(shè)置寬高,無(wú)法做到向flex:1一樣鋪滿屏幕;通過(guò)計(jì)算得到的高度可能會(huì)有適配問(wèn)題。
通過(guò)AI了解到nvue比vue頁(yè)面加載webview并不會(huì)有性能優(yōu)化。
所以個(gè)人推薦除非有無(wú)法解決的實(shí)時(shí)通信需求可以用nvue(比如App加載的webview里有下載按鈕,希望下載時(shí)停留在h5頁(yè)面而不是回退或跳轉(zhuǎn)),其他情況都用vue頁(yè)面
5.$getAppWebview() 不是官方公開(kāi) API,它是 HBuilderX 內(nèi)部方法,僅在 App 平臺(tái)有效。
其他平臺(tái)(如 H5、小程序)不支持該方法,調(diào)用會(huì)報(bào)錯(cuò)。
總結(jié)
到此這篇關(guān)于uniapp web-view組件數(shù)據(jù)傳遞及使用注意點(diǎn)的文章就介紹到這了,更多相關(guān)uniapp web-view組件數(shù)據(jù)傳遞內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
javascript跨域總結(jié)之window.name實(shí)現(xiàn)的跨域數(shù)據(jù)傳輸
本文給大家介紹window.name實(shí)現(xiàn)的跨域數(shù)據(jù)傳輸,自己親自實(shí)踐了一下,真的非常好用,特此分享到腳本之家網(wǎng)站供大家參考2015-11-11
js每隔兩秒輸出數(shù)組中的一項(xiàng)(實(shí)例)
下面小編就為大家?guī)?lái)一篇js每隔兩秒輸出數(shù)組中的一項(xiàng)(實(shí)例)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-05-05
利用JS+Canvas給南方的冬季來(lái)一場(chǎng)紛紛揚(yáng)揚(yáng)的大雪
現(xiàn)在冬天下雪已經(jīng)是很常見(jiàn)的事情了,為了應(yīng)景,我們可以為我們的網(wǎng)站增加雪花飄落的效果,這個(gè)應(yīng)該還是很不錯(cuò)的,下面這篇文章主要給大家介紹了關(guān)于利用JS+Canvas給南方的冬季來(lái)一場(chǎng)紛紛揚(yáng)揚(yáng)的大雪,需要的朋友可以參考下2022-12-12
動(dòng)態(tài)載入/刪除/更新外部 JavaScript/Css 文件的代碼
動(dòng)態(tài)載入/刪除/更新外部 JavaScript/Css 文件的代碼2010-07-07
Javascript頁(yè)面添加到收藏夾的簡(jiǎn)單方法
這篇文章介紹了Javascript頁(yè)面添加到收藏夾的簡(jiǎn)單方法,有需要的朋友可以參考一下2013-08-08
js面向?qū)ο缶幊讨绾螌?shí)現(xiàn)方法重載
如何實(shí)現(xiàn)方法重載,涉及到三個(gè)問(wèn)題:同名函數(shù)的調(diào)用、函數(shù)中特殊的參數(shù)arguments、如何利用arguments實(shí)現(xiàn)方法重載,需要的朋友可以參考下2014-07-07
微信小程序?qū)崿F(xiàn)點(diǎn)擊返回頂層的方法
這篇文章主要為大家詳細(xì)介紹了微信小程序?qū)崿F(xiàn)點(diǎn)擊返回頂層的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-07-07
TypeScript中Map與Set的區(qū)別小結(jié)
TypeScript中Map和Set是兩種不同的集合類型,Map用于存儲(chǔ)鍵值對(duì),支持任意類型鍵并保持插入順序,Set用于存儲(chǔ)唯一值,自動(dòng)去重,兩者都提供高效的查找操作,下面就來(lái)詳細(xì)的介紹一下兩者的區(qū)別2025-10-10

