最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

React?Native?加載H5頁面的實(shí)現(xiàn)方法

 更新時(shí)間:2022年04月28日 15:28:49   作者:xiangzhihong8  
這篇文章主要介紹了React?Native?加載H5頁面的實(shí)現(xiàn)方法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

一、基本使用

作為目前流行的移動(dòng)跨平臺(tái)開發(fā)技術(shù),React Native 提供了一個(gè)使用 JavaScript 構(gòu)建原生跨平臺(tái)移動(dòng)應(yīng)用的強(qiáng)大框架。使用React Native開發(fā)時(shí),經(jīng)常會(huì)遇到加載H5網(wǎng)頁的需求,此時(shí)需要用到react-native-webview插件來執(zhí)行H5網(wǎng)頁的加載。

使用插件之前,需要先安裝npm i react-native-webview插件,命令如下:

npm i react-native-webview

然后,就可以在業(yè)務(wù)代碼中引入react-native-webview 插件的WebView組件,比如:

<WebView  ref={ (webView) => this.webView = webView }
          originWhitelist={ ['*'] }
          // 布爾值,指定WebView中是否啟用JavaScript。只在Android上使用,因?yàn)樵趇OS上默認(rèn)啟用了JavaScript。
          javaScriptEnabled={ true }
          // 布爾值,指定是否開啟DOM本地存儲(chǔ)
          domStorageEnabled={ true }
          // 允許文件上傳
          allowFileAccess={ true }
          // 在webView內(nèi)部網(wǎng)頁中,調(diào)用window.postMessage可以觸發(fā)此屬性對(duì)應(yīng)的函數(shù),通過event.nativeEvent.data獲取接收到的數(shù)據(jù),實(shí)現(xiàn)網(wǎng)頁和RN之間的數(shù)據(jù)傳遞
          onMessage={ this._onMessage }
          //初始化調(diào)用方法
          onLoad={() => { this.handleInjectJavascript();}} 
          // 加載時(shí)強(qiáng)制使用loading轉(zhuǎn)圈視圖,如果為true,webview可能會(huì)加載失敗,顯示為空白
          startInLoadingState={false}
          // webview加載錯(cuò)誤頁面
          renderError={this.renderErrorView}
          // 網(wǎng)絡(luò)路徑
          // 也可以為本地路徑 source={ {uri: 'http://192.168.1.1111:8080/'} }
          source={ {uri: 'http://www.baidu.com/'} } />

使用WebView組件加載H5頁面時(shí),必然會(huì)涉及到交互。

1.1 RN向H5發(fā)送數(shù)據(jù)

如果是RN向H5發(fā)送數(shù)據(jù),那么可以調(diào)用onLoad函數(shù)的handleInjectJavascript() 方法。

 //RN webview 向 vue發(fā)送數(shù)據(jù)
 handleInjectJavascript = (data) => {
     // 拼接數(shù)據(jù)為方法
     const injectJavascriptStr =  `(function() {
     	window.WebViewBridge.onMessage(${JSON.stringify(data)});
     })()`; 
     // 通過 injectJavaScript  將數(shù)據(jù)傳遞給WebView頁面,并立即執(zhí)行為js
     if(this.webView) {
     	this.webView.injectJavaScript(injectJavascriptStr)
     } 
 }

如果有回調(diào)的結(jié)果,需要在mounted生命周期函數(shù)中,

 mounted() {
    window.WebViewBridge = {
      onMessage: this._onMessage //在window上掛載一個(gè)onMessage方法,RN會(huì)調(diào)用
    }
    // 自定義事件后直接觸發(fā):
    const event = new Event('WebViewBridge')
    window.dispatchEvent(event);
 },
 methods: {
    // 接收 RN 發(fā)送的消息
    _onMessage(data) {
      let that = this;
      console.log('data ------- ',JSON.stringify(data)); // 'hello world'
    }
  }

以上就是RN向H5 傳值的過程,其具體過程:RN中給 window.WebViewBridge 增加一個(gè)名為 onMessage 的方法,H5初始化頁面會(huì)對(duì)應(yīng)給出onMessage 指向的方法,在此代碼塊 指向 _onMessage 方法并執(zhí)行。

1.2 H5向RN傳遞數(shù)據(jù)

如果是H5頁面主動(dòng)向RN發(fā)送數(shù)據(jù),需要用到postMessage方法。

  mounted() {
    // 自定義事件后直接觸發(fā):
    const event = new Event('WebViewBridge');
    window.dispatchEvent(event);
  },
  methods: {
    // 向rn發(fā)送消息, 將值 'hello world' 掛載到 postMessage 
    _postMessage('hello world') {
        window.ReactNativeWebView.postMessage(data);
    }
  }

RN 頁面在接收到 vue 傳輸?shù)臄?shù)據(jù)之后執(zhí)行 onMessage 函數(shù)方法。

onMessage={ this._onMessage }
 _onMessage = (event) => {
        console.log('接收vue發(fā)來的消息onMessage', event.nativeEvent.data); 
  }

1.3 雙向傳值

當(dāng)然,有時(shí)候,也會(huì)涉及到多次雙向傳遞的情況。

  mounted() {
    window.WebViewBridge = {
      onMessage: this._onMessage,
      receiveMessage: this._receiveMessage //在window上掛載一個(gè)receiveMessage方法,RN自行調(diào)用
    }
    const event = new Event('WebViewBridge')
    window.dispatchEvent(event);
  },
  methods: {
    // 向rn發(fā)送消息
    _postMessage('wow,RN!!') {
        window.ReactNativeWebView.postMessage(data);   // 將值 'wow,RN!!' 掛載到 postMessage 
    },
    // 二次或多次接收RN發(fā)送消息
     _receiveMessage(data){
      let that = this;
      console.log('data receiveMessage-------  ',JSON.stringify(data));
     }
  }

RN 頁面在接收到 H5 傳輸?shù)臄?shù)據(jù)之后執(zhí)行 onMessage 函數(shù)。

onMessage={ this._onMessage }
 // 接受H5發(fā)送來的消息
 _onMessage = (event) => {
        console.log('接收H5發(fā)來的消息onMessage', event.nativeEvent.data); 
       
        const injectJavascriptStr =  `(function() {
 	   window.WebViewBridge.receiveMessage(${JSON.stringify('hello,vue2!!! ')});
        })()`;
        this.webView.injectJavaScript(injectJavascriptStr);
  }

二、屬性和方法

使用 WebView 組件我們可以通過 url 來加載顯示一個(gè)網(wǎng)頁,也可以傳入一段 html 代碼來顯示。該組件的引入是解決 React Native 內(nèi)嵌 H5 的比較好的解決方案,該組件自帶的常用屬性和方法我們可以歸納如下:

2.1 屬性

  • source:在 WebView 中載入一段靜態(tài)的 html 代碼或是一個(gè) url(還可以附帶一些 header 選項(xiàng))
  • automaticallyAdjustContentInsets:設(shè)置是否自動(dòng)調(diào)整內(nèi)容。格式:boolean
  • contentInset:設(shè)置內(nèi)容所占的尺寸大小。格式為{top:number,left:number,bottom:number,right:number}
  • injectJavaScript:當(dāng)網(wǎng)頁加載之前注入一段 js 代碼。其值是字符串形式。
  • startInLoadingState:是否開啟頁面加載的狀態(tài),其值為 true 或者 false。
  • bounces(僅iOS):回彈特性。默認(rèn)為 true。如果設(shè)置為 false,則內(nèi)容拉到底部或者頭部都不回彈。
  • scalesPageToFit(僅iOS):用于設(shè)置網(wǎng)頁是否縮放自適應(yīng)到整個(gè)屏幕視圖,以及用戶是否可以改變縮放頁面。
  • scrollEnabled(僅iOS):用于設(shè)置是否開啟頁面滾動(dòng)。
  • domStorageEnabled(僅Android):用于控制是否開啟 DOM Storage(存儲(chǔ))。
  • javaScriptEnabled(僅Android):是否開啟 JavaScript,在 iOS 中的 WebView 是默認(rèn)開啟的。

2.2 方法

  • onNavigationStateChange:當(dāng)導(dǎo)航狀態(tài)發(fā)生變化的時(shí)候調(diào)用。
  • onLoadStart:當(dāng)網(wǎng)頁開始加載的時(shí)候調(diào)用。
  • onError:當(dāng)網(wǎng)頁加載失敗的時(shí)候調(diào)用。
  • onLoad:當(dāng)網(wǎng)頁加載結(jié)束的時(shí)候調(diào)用。
  • onLoadEnd:當(dāng)網(wǎng)頁加載結(jié)束調(diào)用,不管是成功還是失敗。
  • renderLoading:WebView組件正在渲染頁面時(shí)觸發(fā)的函數(shù),只有 startInLoadingState 為 true 時(shí)該函數(shù)才起作用。
  • renderError:監(jiān)聽渲染頁面出錯(cuò)的函數(shù)。
  • onShouldStartLoadWithRequest(僅iOS):該方法允許攔截 WebView 加載的 URL 地址,進(jìn)行自定義處理。該方法通過返回 true 或者 false 來決定是否繼續(xù)加載該攔截到請求。

三、使用示例

3.1 加載外源網(wǎng)頁信息

import React,{Component} from 'react'
import {
    StyleSheet,
    View,
    Text,
    WebView,
} from 'react-native'
export default class Root extends Component{
    constructor(props){
        super(props)
    }
    render(){
        return (
            <View style={styles.container}>
                <WebView
                  source={{uri: 'https://www.baidu.com'}}
                    domStorageEnabled={true}
                    javaScriptEnabled={true}
                    startInLoadingState={true}
                    automaticallyAdjustContentInsets={true}>
                </WebView>
            </View>
        )
    }
}
const styles = StyleSheet.create({
    container:{
        flex:1,
    },
})

上面是一個(gè)加載百度首頁的示例。

3.2 登陸場景

一款 toB 的 app,面對(duì)很多家客戶,每家客戶都有自己的登錄系統(tǒng)界面,并且客戶要求接入自己的登錄系統(tǒng)。這個(gè)時(shí)候就需要 webview 接入登錄界面之后,進(jìn)行一些 “值攔截”,進(jìn)行登錄狀態(tài)判斷。這里主要用到 webview 的 onNavigationStateChange 參數(shù)。此方法會(huì)在當(dāng)導(dǎo)航狀態(tài)發(fā)生變化的時(shí)候調(diào)用,例如取到下面的參數(shù):

   { 
      "canGoBack": false,
      "canGoForward": false, 
      "loading": true,
      "navigationType": "other", 
      "target": 229, 
      "title": "", 
      "url": "https://www.baidu.com/"
   }

這里主要注意 url 字段,網(wǎng)頁內(nèi)部登錄完成之后,可以發(fā)起一個(gè)重定向,前端關(guān)注 url 變化,進(jìn)行登錄狀態(tài)的判斷,同時(shí)重定向的 url 中可以拼接一些登錄信息字段,用于前端登錄狀態(tài)校驗(yàn)等。

{ "url": "https://www.baidu.com ? sessionId=xxx & username= xxx" }

3.3 功能模塊嵌入到 RN 中

將 webview 作為功能模塊載體,這個(gè)時(shí)候就會(huì)涉及到用戶交互,需要 rn 與 h5 進(jìn)行值的互相傳遞。此時(shí)就要react native 向 web 中注入 js,web 也可以主動(dòng)回傳數(shù)據(jù)到 react native中。webview 組件提供了 injectedJavaScript 用于向 h5 注入js,在 h5 中使用 window.ReactNativeWebView.postMessage 進(jìn)行主動(dòng)的回調(diào),并且在 webview 的 onMessage 中進(jìn)行字段的監(jiān)聽,以此就可以完成 react 和 h5 之間的數(shù)據(jù)交互。

const injectJSStr = `
  window.injectStr='我是注入的字段';
  var div = document.getElementById('testID');
  div.style.color='red';
  div.style.fontSize='100px';
`;
const html = `
    <html>
    <head></head>
    <body>
      <script>
        setTimeout(function () {
          window.ReactNativeWebView.postMessage(window.injectStr)
        }, 2000)
      </script>
      <div id='testID'>Hello Word</div>
    </body>
    </html>
 `;
  ......
<View style={{flex: 1}}>
    <WebView
        source={{html}}
        injectedJavaScript={injectJSStr}
        onMessage={event => {
        alert(event.nativeEvent.data);
        }}
    />
</View>

3.4 完整示例

例如,有下面一個(gè)需求:RN里面通過觸發(fā)刷新使H5界面的背景色可以隨機(jī)改變;H5 界面我們寫一個(gè)簡單的 input 輸入使輸入的文字可以在RN 顯示出來。

import React, {Component} from 'react';
import {Text, StyleSheet, View, Button} from 'react-native';
import WebView from 'react-native-webview';
export default class App extends Component {
  state = {colorIndex: 0, tip: '原生的Text組件,等webview中的發(fā)送。。'};
  changeColor = () => {
    this.webview.reload();
    let colorIndex = this.state.colorIndex;
    colorIndex = ++colorIndex % 5;
    this.setState({colorIndex});
  };
  recieve = msg => {
    let data = msg.nativeEvent.data;
    let uname = JSON.parse(data).uname;
    this.setState({tip: uname});
  };
  render() {
    let colors = ['gray', 'yellow', 'red', 'antiquewhite', 'white'];
    let scriptStr = `document.body.style.backgroundColor='${
      colors[this.state.colorIndex]
    }'`;
    return (
      <View style={{flex: 1}}>
        <Button title="刷新WebView的背景色" onPress={this.changeColor} />
        <Text style={{fontSize: 30}}>{this.state.tip}</Text>
        <WebView
          onMessage={this.recieve}
          ref={ref => (this.webview = ref)}
          injectedJavaScript={scriptStr}
          source={{uri: 'http://192.168.180.241:8080/test.html'}}
        />
      </View>
    );
  }
}

H5的代碼如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <input class="info" name="uname" value="John" />
    <br>
    <button class="info">發(fā)送給原生組件</button>
    <script>
        document.querySelector('button').addEventListener('click', () => {
            let uname = document.querySelector('input[name="uname"]').value
            let msg = JSON.stringify({
                uname
            })
            window.ReactNativeWebView.postMessage(msg)
        })
    </script>
</body>
</html>

到此這篇關(guān)于React Native 加載H5頁面的文章就介紹到這了,更多相關(guān)React Native H5頁面內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • React封裝全屏彈框的方法

    React封裝全屏彈框的方法

    這篇文章主要為大家詳細(xì)介紹了React封裝全屏彈框的方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • 詳解React Native網(wǎng)絡(luò)請求fetch簡單封裝

    詳解React Native網(wǎng)絡(luò)請求fetch簡單封裝

    本篇文章主要介紹了詳解React Native網(wǎng)絡(luò)請求fetch簡單封裝,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-08-08
  • React實(shí)現(xiàn)歌詞滾動(dòng)效果(跟隨音樂播放時(shí)間滾動(dòng))

    React實(shí)現(xiàn)歌詞滾動(dòng)效果(跟隨音樂播放時(shí)間滾動(dòng))

    這篇文章主要為大家詳細(xì)介紹了React實(shí)現(xiàn)歌詞滾動(dòng)效果(跟隨音樂播放使勁按滾動(dòng)),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2024-02-02
  • React虛擬渲染實(shí)現(xiàn)50個(gè)或者一百個(gè)圖表渲染

    React虛擬渲染實(shí)現(xiàn)50個(gè)或者一百個(gè)圖表渲染

    這篇文章主要為大家介紹了React虛擬渲染實(shí)現(xiàn)50個(gè)或者100個(gè)圖表渲染的實(shí)現(xiàn),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • 深入了解React中的虛擬DOM

    深入了解React中的虛擬DOM

    歡迎來到今天的探險(xiǎn)之旅!在這篇博客中,我們將深入了解 React 中神奇的虛擬DOM,并通過一個(gè)簡單的例子來揭開其神秘面紗,文中通過代碼示例也講解非常詳細(xì),感興趣的朋友可以參考下
    2024-01-01
  • React中的Context應(yīng)用場景分析

    React中的Context應(yīng)用場景分析

    這篇文章主要介紹了React中的Context應(yīng)用場景分析,Context 提供了一種在組件之間共享數(shù)據(jù)的方式,而不必顯式地通過組件樹的逐層傳遞 props,通過實(shí)例代碼給大家介紹使用步驟,感興趣的朋友跟隨小編一起看看吧
    2021-06-06
  • React受控組件與非受控組件詳細(xì)介紹

    React受控組件與非受控組件詳細(xì)介紹

    具體來說這是一種react非受控組件,其狀態(tài)是在input的react內(nèi)部控制,不受調(diào)用者控制。可以使用受控組件來實(shí)現(xiàn)。下面就說說這個(gè)React中的受控組件與非受控組件的相關(guān)知識(shí),感興趣的朋友一起看看吧
    2022-09-09
  • React18系列reconciler從0實(shí)現(xiàn)過程詳解

    React18系列reconciler從0實(shí)現(xiàn)過程詳解

    這篇文章主要介紹了React18系列reconciler從0實(shí)現(xiàn)過程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-01-01
  • React SSR服務(wù)端渲染的實(shí)現(xiàn)示例

    React SSR服務(wù)端渲染的實(shí)現(xiàn)示例

    本文主要介紹了實(shí)現(xiàn)React服務(wù)端渲染,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-01-01
  • 一文帶你深入理解React中的Context

    一文帶你深入理解React中的Context

    React?Context是React提供給開發(fā)者的一種常用的狀態(tài)管理機(jī)制,本文主要來和大家講講為什么需要Context,又是如何使用Context的,感興趣的可以了解一下
    2023-05-05

最新評(píng)論

西乌珠穆沁旗| 桑日县| 兴国县| 灌云县| 横峰县| 利川市| 镇平县| 靖安县| 浮山县| 迁西县| 商南县| 阳朔县| 宜都市| 垦利县| 长治县| 定结县| 齐河县| 大宁县| 华池县| 云浮市| 梅河口市| 鄂尔多斯市| 麻城市| 桐乡市| 阿拉尔市| 中江县| 阿城市| 营山县| 泾源县| 临安市| 黄石市| 亚东县| 维西| 潢川县| 阜城县| 旌德县| 聂荣县| 保定市| 南陵县| 寿光市| 钟祥市|