我的 RN 申请中有一个特殊案例。
我有一个 Webview 可以在特定屏幕上加载第三方小部件。
流程类似于:
问题是每次我导航到 ItemDetails 屏幕时,都需要初始化 Webview,下载并执行 HTML/JS/CSS 内容。 返回主屏幕时,Webview 被卸载并销毁 当打开一个不同的项目时,所有的 Webview 初始化都会重新开始。
诀窍是我只需更改 URL 即可加载新项目的信息,而无需完全重新加载 Web 视图。
是否有任何选项可以让 WebView 保持打开状态,以便在两次导航之间避免所有安装延迟,并且可以更快地显示信息。
技术细节:
以下代码只是作为当前项目的一个例子的简化。
import { createStackNavigator } from '@react-navigation/stack';
const Stack = createStackNavigator();
function MyStack() {
return (
<Stack.Navigator>
<Stack.Screen name="ItemsList" component={ItemList} />
<Stack.Screen name="ItemDetails" component={ItemDetails} />
</Stack.Navigator>
);
}
import React from 'react';
import { SafeAreaView, TouchableOpacity, FlatList, StyleSheet, Text, StatusBar } from 'react-native';
const DATA = [
{
id: 'bd7acbea-c1b1-46c2-aed5-3ad53abb28ba',
title: 'First Item',
},
{
id: '3ac68afc-c605-48d3-a4f8-fbd91aa97f63',
title: 'Second Item',
},
{
id: '58694a0f-3da1-471f-bd96-145571e29d72',
title: 'Third Item',
},
];
const Item = ({ title, id }) => (
<TouchableOpacity style={styles.item} onPress={() => navigation.navigate('ItemDetails', { id })}>
<Text style={styles.title}>{title}</Text>
</View>
);
const App = () => {
const renderItem = ({ item }) => (
<Item title={item.title} />
);
return (
<SafeAreaView style={styles.container}>
<FlatList
data={DATA}
renderItem={renderItem}
keyExtractor={item => item.id}
/>
</SafeAreaView>
);
}
const styles = StyleSheet.create({
container: {
flex: 1,
marginTop: StatusBar.currentHeight || 0,
},
item: {
backgroundColor: '#f9c2ff',
padding: 20,
marginVertical: 8,
marginHorizontal: 16,
},
title: {
fontSize: 32,
},
});
export default App;
import React, { Component } from 'react';
import { WebView } from 'react-native-webview';
const ItemDetails = ({ route }) => (
<WebView
source={{ uri: `https://thirdpartywidget.com/${route.params.id}` }}
style={{ marginTop: 20 }}
/>
)