javascript - React Native 选项卡视图的高度始终等于最高选项卡的高度
问题描述
介绍
我有一个在其页脚中呈现选项卡视图的 FlatList。此选项卡视图允许用户在一个 FlatList 或另一个之间切换。所以,最后这些是同级 FlatLists。
问题
第一个 FlatList“A”的高度大于第二个“B”。当我选择第二个列表时,它的高度与“A”FlatList 的高度相同。
我在小吃中重现了这个问题,您可以在其中看到类似的代码。我承认代码有点长但是太简单了,只关注父 FlatList(在 App 组件中)和每个选项卡中呈现的两个 FlatList(在代码末尾)
问题
任何想法如何解决这个问题?我不知道问题出在样式上,还是我必须做其他事情才能完成这项工作(所有平面列表都必须有自己的高度,而不是更大的高度)。
谢谢你,我真的很感谢你的帮助。
解决方案
2022 年更新
const renderScene = ({ route }) => {
//
// Note: We are hidding tabs in order to avoid the
// "FlexBox Equal Height Columns" typical problem
//
switch (route.key) {
case "bitcoin":
return (
<View style={index !== 0 && styles.hidden}>
<Bitcoin />
</View>
);
case "ethereum":
return (
<View style={index !== 1 && styles.hidden}>
<Etherum />
</View>
);
case "rose":
return (
<View style={index !== 2 && styles.hidden}>
<Rose />
</View>
);
default:
return null;
}
};
...
<TabView
renderTabBar={renderTabBar}
navigationState={{ index, routes }}
renderScene={renderScene}
onIndexChange={handleOnIndexChange}
initialLayout={{ width: layout.width }}
removeClippedSubviews={false}
swipeEnabled
swipeVelocityImpact={0.2}
gestureHandlerProps={{
activeOffsetX: [-30, 30], // To solve swipe problems on Android
}}
style={globalStyles.flexContainer}
/>
款式:
hidden: { display: "none" }
我已经用解决方案更新了零食!
正如在我实现自己的 TabView 的小吃中一样,我决定使用库“react-native-tab-view”实现相同的解决方案,因为它是目前反应原生的最佳选项卡。
认为有些人有这个问题将能够解决它。
基本上,我们需要做的是动态计算每个选项卡场景的高度,并使用 onLayout 属性将其传递给 TabView 的样式。
像这样:
const renderScene = ({ route }) => {
switch (route.key) {
case "inifiniteScrollFlatList":
return (
<FirstRoute />
);
case "rawDataFlatList":
return (
<View
onLayout={(event) => setTab1Height(event.nativeEvent.layout.height + TAB_HEIGHT)}
>
<SecondRoute />
</View>
);
case "otherRawDataFlatList":
return (
<View
onLayout={(event) => setTab2Height(event.nativeEvent.layout.height + TAB_HEIGHT)}
>
<ThirdRoute />
</View>
);
default:
return null;
}
};
<TabView
style={ index !== 0 && {
height: index === 1 ? tab1Height : tab2Height,
}}
renderTabBar={renderTabBar}
navigationState={{ index, routes }}
renderScene={renderScene}
onIndexChange={setIndex}
initialLayout={initialLayout}
removeClippedSubviews={false} // Pd: Don't enable this on iOS where this is buggy and views don't re-appear.
swipeEnabled={true}
/>
Pd:您不应该对使用无限滚动和分页的选项卡执行此操作。相反,您必须将高度设置为 null 以允许父 FlatList 自动获取其高度。
推荐阅读
- ios - 从短信 iOS 读取用户名/密码
- python - Splitting a text file into integers in Python
- syncfusion - Syncfusion mvc grid control filtering on hyperlink column
- javascript - 子字符串方法不适用于 API 数据
- python - 为什么我必须将类的实例传递给线程来修改其数据,而不是直接传递变量?
- php - Error while doing PHP mysqli insert into table
- r - 如何正确合并(完全连接)三个以上 data.tables 的列表?
- typescript - 如何以有意义的方式在没有 instanceof 的情况下使用“未知”?
- flash - How to set dynamic variables in flash (swf) that are passed from javascript?
- r - Identifying if one field is partial derived from another in R