我正在尝试在我的应用程序中实现react native webview组件,但是web视图没有加载任何只显示白页的url。
var React = require('react-native');
var{
View,
Text,
StyleSheet,
WebView
} = React;
module.exports = React.createClass({
render: function(){
return(
<View style={styles.container}>
<WebView source={{uri: 'https://m.facebook.com'}} style= {styles.webView}/>
</View>
);
}
});
var styles = StyleSheet.create({
container: {
flex:1,
backgroundColor: '#ff00ff'
},webView :{
height: 320,
width : 200
}
});
答案 0 :(得分:35)
我有这个问题。当WebView是唯一返回的组件时,它将呈现,但在嵌套在另一个View组件中时则不会呈现。
由于原因,我不完全确定通过在WebView组件上设置width属性来解决问题。
class App extends React.Component {
render() {
return (
<View style={styles.container}>
<WebView
source={{uri: 'https://www.youtube.com/embed/MhkGQAoc7bc'}}
style={styles.video}
/>
<WebView
source={{uri: 'https://www.youtube.com/embed/PGUMRVowdv8'}}
style={styles.video}
/>
</View>
);
}
}
const styles = StyleSheet.create({
container: {
flex: 1,
alignItems: 'center',
justifyContent: 'space-between',
},
video: {
marginTop: 20,
maxHeight: 200,
width: 320,
flex: 1
}
});
答案 1 :(得分:12)
我面临同样的问题。我观察到WebView
如果嵌套则不起作用。如果组件只返回WebView,那么一切都很好。
答案 2 :(得分:7)
WebView在Android上运行良好。但是,您需要为某些网页启用javascript和dom存储。
<WebView style={styles.webView}
source={{uri: 'https://google.com/'}}
javaScriptEnabled={true}
domStorageEnabled={true}
startInLoadingState={true}
>
</WebView>
答案 3 :(得分:4)
如果您希望组件呈现整个页面,则需要使用包含flex: 1
的View对其进行包装。以下代码适用于我:
<View style={{flex:1, alignItems: 'flex-end'}}>
<WebView
source={{uri: this.state.webContentLink}}
startInLoadingState={true}
scalesPageToFit={true} />
</View>
答案 4 :(得分:4)
package.json
和样式如下:
<View>
<WebView
source={{uri: this.props.link}}
style={styles.webview}
javaScriptEnabled={true}
domStorageEnabled={true}
startInLoadingState={true}
/>
</View>
这一切都是为了处理糟糕的webview维度,所以只需设置一个特定的高度和特定的宽度(如上例所示,deviceHeight和deviceWidth)。
答案 5 :(得分:3)
使用其他用户的答案,我能够在视图内部和视图外部使用webview进行反应。我的问题归结为两件事。在Android模拟器上和代理后面,我只需要在android模拟器中访问我的浏览器(chrome)并登录到公司代理。其次,一些网站工作,其他网站不工作。无论webview是否嵌套在View标签内,cnn.com和slack.com等网站都可以正常工作,但无论我为google.com尝试了什么设置,它都行不通(即使代理将绝对允许google.com)最后,当我重建我的应用程序并将模拟器推送到新应用程序时,有时需要花费非常长的时间才能加载任何网站。但是一旦加载了网站,链接就会快速响应。因此,如果您在构建之后没有首先看到某些内容,也请耐心等待。希望这有助于其他人。
我的最终app.js
import React, { Component } from 'react';
import {
Platform,
StyleSheet,
Text,
View,
Dimensions
} from 'react-native';
import { WebView } from 'react-native';
const deviceHeight = Dimensions.get('window').height;
const deviceWidth = Dimensions.get('window').width;
type Props = {};
export default class App extends Component<Props> {
render() {
return (
<View style={{flex:1}}>
<WebView
style={styles.webview}
source={{uri: 'https://www.slack.com'}}
javaScriptEnabled={true}
domStorageEnabled={true}
startInLoadingState={false}
scalesPageToFit={true} />
</View>
);
}
}
const styles = StyleSheet.create({
webview: {
flex: 1,
backgroundColor: 'yellow',
width: deviceWidth,
height: deviceHeight
}
});
答案 6 :(得分:2)
下面是一段对我有用的代码。
render: function(){
return(
<View style={styles.container}>
<WebView url={'https://m.facebook.com'} style= {styles.webView}/>
</View>
);
}
答案 7 :(得分:1)
让我给出一个可以无缝运行的最简单的示例:
import React from 'react';
import { WebView } from 'react-native';
export default class App extends React.Component {
render() {
return (
<WebView
source={{uri: 'https://github.com/facebook/react-native'}}
/>
);
}
}
请勿在创建问题的视图中添加WebView组件,并且不会渲染Webview URL,而是显示视图样式。
答案 8 :(得分:1)
我认为您必须删除此内容:
<View style={styles.container}>
</view>
答案 9 :(得分:1)
WebView被移至react-native-webview
除此方法外,其他答案均无效:
<View style={{ flex: 1, alignItems: 'flex-end' }}>
<WebView
source={{
uri: 'https://www.yahoo.com',
}}
startInLoadingState={true}
scalesPageToFit={true}
style={{
width: 320,
height: 300,
}}
/>
</View>
然后按以下方式使用它:
Jekyll::Hooks.register :site, :post_write do |site|
if site.config['create_index']
system('npm run index')
end
end
答案 10 :(得分:1)
截至2020年6月(注明日期,因为React Native答案似乎很快就过时了),对此的最简单解决方案似乎是:
import React from 'react'
import { View, StyleSheet } from 'react-native'
import { WebView } from 'react-native-webview'
export const ComponentWithWebView = () => {
return (
<View style={styles.view}>
<WebView source = {{uri: 'https://www.google.com/'}} />
</View>
)
}
const styles = StyleSheet.create({
view: {
alignSelf: 'stretch',
flex: 1,
}
}
这将导致WebView
填充可用空间并嵌套在View
中。我相信将WebView
放在View
内时遇到的典型问题是View
希望孩子们迫使View
扩展(即Text
组件将占用View
然后容纳的一些宽度和高度)。另一方面,除非传递指定WebView
的样式,否则width
会扩展到父组件的大小。因此,简单的<View><WebView /></View>
导致宽度为0,屏幕上没有任何显示。较早的设置WebView
宽度的解决方案效果很好,但是需要获取设备尺寸(可能不是所需的宽度),或者要求View
具有onLayout
函数,并且有一些方法可以将View
扩展到所需的空间。我发现最简单的方法是,只应用flex: 1
的{{1}}和alignSelf: 'stretch'
来填充所需的空间,然后View
来自动跟随。
希望这可以在过时之前帮助别人!
答案 11 :(得分:0)
我遇到了同样的问题,花了一天时间试图修复它。我复制了UIExplorer webview示例,但是没有用。
我最终最终升级了反应并创建了一个新的react-native项目并将文件复制到那里,并修复了它。
我希望我能更好地回答为什么修复它,但希望有帮助
答案 12 :(得分:0)
我最近遇到了同样的问题。我发现
对齐方式:“居中”
为我造成了问题。我对此发表了评论,并立即加载了webView。 我在这里找到解决方案: https://github.com/facebook/react-native/issues/5974 “ brunocvcunha”的回复对我有用。
答案 13 :(得分:0)
我正在做React Native Webview,请您建议我如何使Webview加载uri
render() {
return (
<Modal
animationType="slide"
ref={"webModal"}
style={{
justifyContent: 'center',
borderRadius: Platform.OS === 'ios' ? 30 : 0,
width: screen.width,
height: screen.height,borderColor:'red',
borderWidth: 5
}}
position='center'
backdrop={false}
onClosed={() => {
// alert("Modal closed");
}}>
<View style={{ flexDirection: 'row', justifyContent: 'space-between', paddingHorizontal: 20, top: 10 }} >
<Text style={{ fontSize: 24, fontWeight: '700' }}>
Interests
</Text>
<Icon name="ios-close" size={40} color='purple' onPress={() => { this.refs.webModal.close() }} />
</View>
<WebView
source={{ uri: this.state.link }}
style={{ marginTop: 20,borderColor:'green',
borderWidth: 5 }}
/>
</Modal>
);
}
}
答案 14 :(得分:0)
从'react-native'导入{WebView}; 已弃用
在行下方使用
npm install react-native-render-html@4.1.2 --save
然后
从“ react-native-render-html”导入HTML;
react-native-render-html从版本4.2.0开始,react-native-webview现在是对等依赖项。因此,您需要自行安装。