是否可以在WebView组件内创建一个函数,触发React Native函数?
答案 0 :(得分:4)
这是可能的,但我不确定这是否是唯一的方法。
基本上你可以设置一个onNavigationStateChange
事件处理程序,并在导航网址中嵌入函数调用信息,这是一个概念的例子。
在React Native上下文中
render() {
return <WebView onNavigationStateChange={this._onURLChanged.bind(this)} />
}
_onURLChanged(e) {
// allow normal the natvigation
if(!e.url.startsWith('native://'))
return true
var payload = JSON.parse(e.url.replace('native://', ''))
switch(e.functionName) {
case 'toast' :
native_toast(e.data)
break
case 'camera' :
native_take_picture(e.data)
break
}
// return false to prevent webview navitate to the location of e.url
return false
}
要调用本机方法,请使用此方法触发webview的导航事件,并将函数调用信息嵌入URL中。
window.location = 'native://' + JSON.stringify({
functionName : 'toast', data : 'show toast text'
})
答案 1 :(得分:0)
是的,它是可能的,它为react-native-webview-bridge提供了一个包。 我在生产中大量使用它并且它完美地工作。
答案 2 :(得分:0)
您可以在加载时向webview注入一个javascript函数,然后使用onMessage从您注入的函数中获取响应更多信息IN Here
答案 3 :(得分:0)
在 onMessage
上使用 <WebView/>
eventListner
<WevView onMessage={onMessage} ... />
/** on message from webView -- window.ReactNativeWebView?.postMessage(data) */
const onMessage = event => {
const {
nativeEvent: {data},
} = event;
if (data === 'goBack') {
navigation.goBack();
} else if (data?.startsWith('navigate')) {
// navigate:::routeName:::stringifiedParams
try {
const [, routeName, params] = data.split(':::');
params = params ? JSON.parse(params) : {};
navigation.navigate(routeName, params);
} catch (err) {
console.log(err);
}
}
};
在您的 HTML 中使用它来发布消息事件
window.ReactNativeWebView?.postMessage("data")
答案 4 :(得分:-2)
我不确定,但我的意见是 -
你做不到。 Webview只能加载我们可以在Webview组件中定义的js部分。这与其他组件完全分开,它只是一个可视区域。