AtomicServiceWeb 使用方法全解析

AtomicServiceWeb 使用方法全解析

一、整體概述

AtomicServiceWeb 是對(duì) Web 組件的升級(jí)椿访,用于在特定場(chǎng)景下實(shí)現(xiàn)更高效和功能豐富的網(wǎng)頁(yè)交互乌企。它在一些接口和屬性的使用上與 Web 組件有所不同,需要開(kāi)發(fā)者按照新的規(guī)范進(jìn)行操作赎离。

二逛犹、參數(shù)傳遞

  1. 通過(guò) src 傳遞參數(shù)

    • 適用場(chǎng)景:例如在登錄認(rèn)證場(chǎng)景中,將元服務(wù)原生頁(yè)面獲取的登錄參數(shù)傳遞給 H5 頁(yè)面梁剔。

    • 傳參格式:在設(shè)置src屬性時(shí)虽画,將參數(shù)添加到 URL 中,如src =https://xx.com/login?authcode=${authcode}``荣病,其中authcode是要傳遞的參數(shù)码撰。

    • 示例代碼

      • login.ets中:
import { authentication } from '@kit.AccountKit';
import { hilog } from '@kit.PerformanceAnalysisKit';
import { AtomicServiceWeb, AtomicServiceWebController } from '@kit.ArkUI';
@Entry
@Component
struct LoginPage {
    @State authorizationCode: string = '';
    @State src: ResourceStr = 'resource://rawfile/login.html';
    @State controller: AtomicServiceWebController = new AtomicServiceWebController();
    navPathStack: NavPathStack = new NavPathStack();
    async getAuthorizationCode() {
        // 創(chuàng)建登錄請(qǐng)求并獲取授權(quán)碼的邏輯
    }
    async aboutToAppear() {
        await this.getAuthorizationCode();
    }
    build() {
        NavDestination() {
            if (this.authorizationCode) {
                AtomicServiceWeb({
                    src: this.src + `?AuthorizationCode=${this.authorizationCode}`,
                    navPathStack: this.navPathStack,
                    controller: this.controller
                })
            }
        }
           .onReady((context: NavDestinationContext) => {
                this.navPathStack = context.pathStack;
            })
    }
}
@Builder
export function AtomicServiceWebPageBuilder(name: string, param: Object) {
    LoginPage()
}
  • login.html中,可以通過(guò)window.location.href獲取 URL 中的參數(shù):
<!DOCTYPE html>
<html>
<style>
    body {
        padding-left: 30px;
    }
    h1 {
        font-size: 100px;
    }
   .button {
        font-size: 80px;
        margin: 8px 0px;
        padding: 8px 15px;
        border-radius: 10px;
        color: #fff;
        background-color: #007bff;
        border-color: #007bff;
        border: 1px solid transparent;
    }
   .button_error {
        color: #fff;
        background-color: #dc3545;
        border-color: #dc3545;
    }
</style>
<body>
<h1>H5 Page</h1>
<br/>
<button type="button" class="button" onclick="getUrlParams()">獲取AuthorizationCode參數(shù)</button>
<p id="demo"></p>
<script src="../dist/asweb-sdk.umd.js"></script>
<script>
    function getUrlParams() {
        const params = {};
        const url = window.location.href;
        const urlObj = new URL(url);
        for (const [key, value] of urlObj.searchParams.entries()) {
            params[key] = value;
            document.getElementById("demo").innerHTML = params[key];
        }
        return params;
    }
</script>
</body>
</html>
  1. 通過(guò)路由傳參

    • 適用場(chǎng)景:常見(jiàn)于 H5 跳轉(zhuǎn)原生頁(yè)面實(shí)現(xiàn)賬號(hào)關(guān)聯(lián)个盆、調(diào)用原生實(shí)名認(rèn)證等能力時(shí)傳遞參數(shù)脖岛。

    • 傳參格式:使用has.router.pushPath('LoginPage','xxxxx'),其中LoginPage是目標(biāo)頁(yè)面颊亮,xxxxx是要傳遞的參數(shù)柴梆。

    • 示例代碼

      • login.html中:
<!DOCTYPE html>
<html>
<meta charset="utf-8">
<style>
    body {
        padding-left: 30px;
    }
    h1 {
        font-size: 100px;
    }
   .button {
        font-size: 80px;
        margin: 8px 0px;
        padding: 8px 15px;
        border-radius: 10px;
        color: #fff;
        background-color: #007bff;
        border-color: #007bff;
        border: 1px solid transparent;
    }
   .button_error {
        color: #fff;
        background-color: #dc3545;
        border-color: #dc3545;
    }
</style>
<body>
<h1>H5 Page</h1>
<br/>
<button type="button" class="button" onclick="pushPath('LoginPage', 'xxxxx')">H5傳遞參數(shù)</button>
<p id="demo"></p>
<script src="../dist/asweb-sdk.umd.js"></script>
<script>
    function pushPath(name, param, animated, onPop) {
        has.navPathStack.pushPath({
            name: name,
            param: param,
            animated: animated,
            onPop: onPop,
            callback: (err, res) => commonCallback('pushPath', err, res)
        });
    }
    let onPop = event => {
        consoleLog('pushPath onPop event=' + JSON.stringify(event));
    };
</script>
</body>
</html>
  • LoginPage.ets中接收參數(shù):
import { AtomicServiceWeb, AtomicServiceWebController } from '@kit.ArkUI';
@Entry
@Component
struct LoginPage {
    @State src: ResourceStr = 'resource://rawfile/login.html';
    @State param: object | string = '';
    @State controller: AtomicServiceWebController = new AtomicServiceWebController();
    navPathStack: NavPathStack = new NavPathStack();
    build() {
        NavDestination() {
            if (this.param) {
                Column() {
                    Text(`接收H5頁(yè)面?zhèn)鬟f參數(shù):${this.param}`)
                }
                   .width('100%')
            } else {
                AtomicServiceWeb({
                    src: this.src,
                    navPathStack: this.navPathStack,
                    controller: this.controller
                })
            }
        }
           .onReady((context: NavDestinationContext) => {
                this.navPathStack = context.pathStack;
                this.param = context.pathInfo?.param as string
            })
    }
}
@Builder
export function AtomicServiceWebPageBuilder(name: string, param: Object) {
    LoginPage()
}
  • MainPage.ets中創(chuàng)建路由跳轉(zhuǎn):
@Entry
@Component
struct MainPage {
    navPathStack: NavPathStack = new NavPathStack();
    @Builder
    NavPathStackComponent(name: string, page: string, param?: object): void {
        Button(name)
           .type(ButtonType.Capsule)
           .width('60%')
           .margin({
                top: '50px'
            }).onClick(() => {
            this.navPathStack.pushPath({
                name: page,
                param: param
            });
        })
    }
    build() {
        Navigation(this.navPathStack) {
            Row() {
                Column() {
                    this.NavPathStackComponent('LoginPage', 'LoginPage')
                }.width('100%')
            }.height('100%')
        }.title('XXX')
    }
}

同時(shí)需要在route_map.json中添加對(duì)應(yīng)路由:

{
    "name": "LoginPage",
    "pageSourceFile": "src/main/ets/pages/LoginPage.ets",
    "buildFunction": "AtomicServiceWebPageBuilder",
    "data": {
        "description": "this is LoginPage"
    }
}

三、常用接口 / 屬性遷移

  1. controller
    • 使用說(shuō)明:使用AtomicServiceWebController替換原來(lái)的控制器终惑。
    • 示例代碼
import { AtomicServiceWeb, AtomicServiceWebController } from '@kit.ArkUI';
@Entry
@Component
struct WebComponent {
    @State controller: AtomicServiceWebController = new AtomicServiceWebController();
    build() {
        Column() {
            AtomicServiceWeb({
                src: 'www.example.com',
                controller: this.controller
            })
        }
    }
}
  1. javaScriptAccess
    • 使用說(shuō)明:默認(rèn)值為true绍在,無(wú)需單獨(dú)設(shè)置。
  2. domStorageAccess
    • 使用說(shuō)明:默認(rèn)值為true,無(wú)需單獨(dú)設(shè)置偿渡。
  3. mixedMode
    • 使用說(shuō)明:可以設(shè)置為MixedMode.All等模式臼寄,示例如下:
import { AtomicServiceWeb, AtomicServiceWebController } from '@kit.ArkUI';
@Entry
@Component
struct WebComponent {
    @State controller: AtomicServiceWebController = new AtomicServiceWebController();
    @State mixedMode: MixedMode = MixedMode.All;
    build() {
        Column() {
            AtomicServiceWeb({
                src: 'www.example.com',
                controller: this.controller,
                mixedMode: this.mixedMode
            })
        }
    }
}
  1. darkMode
    • 使用說(shuō)明:可以設(shè)置為WebDarkMode.On等模式,示例如下:
import { AtomicServiceWeb, AtomicServiceWebController } from '@kit.ArkUI';
@Entry
@Component
struct WebComponent {
    @State controller: AtomicServiceWebController = new AtomicServiceWebController();
    @State mode: WebDarkMode = WebDarkMode.On;
    build() {
        Column() {
            AtomicServiceWeb({
                src: 'www.example.com',
                controller: this.controller,
                darkMode: this.mode,
            })
        }
    }
}
  1. forceDarkAccess
    • 使用說(shuō)明:設(shè)置為truefalse來(lái)控制是否啟用強(qiáng)制黑暗模式溜宽,示例如下:
import { AtomicServiceWeb, AtomicServiceWebController } from '@kit.ArkUI';
@Entry
@Component
struct WebComponent {
    @State controller: AtomicServiceWebController = new AtomicServiceWebController();
    @State access: boolean = true;
    build() {
        Column() {
            AtomicServiceWeb({
                src: 'www.example.com',
                controller: this.controller,
                forceDarkAccess: this.access
            })
        }
    }
}
  1. fileAccess
    • 使用說(shuō)明:在 AtomicServiceWeb 中默認(rèn)值為false吉拳,僅只讀資源目錄/data/storage/el1/bundle/entry/resources/resfile里面的file協(xié)議資源可訪問(wèn),$rawfile(filepath/filename)rawfile路徑的文件不受影響适揉。升級(jí)后不再支持自定義該接口留攒,需刪除相關(guān)設(shè)置代碼。
  2. onlineImageAccess 和 imageAccess
    • 使用說(shuō)明:在 AtomicServiceWeb 中默認(rèn)值為True涡扼,升級(jí)后不再支持自定義這兩個(gè)接口稼跳,需刪除相關(guān)設(shè)置代碼。
  3. geolocationAccess
    • 使用說(shuō)明:升級(jí)后不再支持該接口吃沪,在 H5 頁(yè)面中可替換使用has.location.getLocation()汤善。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市票彪,隨后出現(xiàn)的幾起案子红淡,更是在濱河造成了極大的恐慌,老刑警劉巖降铸,帶你破解...
    沈念sama閱讀 211,376評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件在旱,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡推掸,警方通過(guò)查閱死者的電腦和手機(jī)桶蝎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,126評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)谅畅,“玉大人登渣,你說(shuō)我怎么就攤上這事≌毙海” “怎么了胜茧?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,966評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)仇味。 經(jīng)常有香客問(wèn)我呻顽,道長(zhǎng),這世上最難降的妖魔是什么丹墨? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,432評(píng)論 1 283
  • 正文 為了忘掉前任廊遍,我火速辦了婚禮,結(jié)果婚禮上贩挣,老公的妹妹穿的比我還像新娘喉前。我一直安慰自己英染,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,519評(píng)論 6 385
  • 文/花漫 我一把揭開(kāi)白布被饿。 她就那樣靜靜地躺著,像睡著了一般搪搏。 火紅的嫁衣襯著肌膚如雪狭握。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,792評(píng)論 1 290
  • 那天疯溺,我揣著相機(jī)與錄音论颅,去河邊找鬼。 笑死囱嫩,一個(gè)胖子當(dāng)著我的面吹牛恃疯,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播墨闲,決...
    沈念sama閱讀 38,933評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼今妄,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了鸳碧?” 一聲冷哼從身側(cè)響起盾鳞,我...
    開(kāi)封第一講書(shū)人閱讀 37,701評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎瞻离,沒(méi)想到半個(gè)月后腾仅,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,143評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡套利,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,488評(píng)論 2 327
  • 正文 我和宋清朗相戀三年推励,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片肉迫。...
    茶點(diǎn)故事閱讀 38,626評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡验辞,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出昂拂,到底是詐尸還是另有隱情受神,我是刑警寧澤,帶...
    沈念sama閱讀 34,292評(píng)論 4 329
  • 正文 年R本政府宣布格侯,位于F島的核電站鼻听,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏联四。R本人自食惡果不足惜撑碴,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,896評(píng)論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望朝墩。 院中可真熱鬧醉拓,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,742評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至排吴,卻和暖如春秆乳,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背钻哩。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工屹堰, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人街氢。 一個(gè)月前我還...
    沈念sama閱讀 46,324評(píng)論 2 360
  • 正文 我出身青樓扯键,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親珊肃。 傳聞我的和親對(duì)象是個(gè)殘疾皇子荣刑,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,494評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容