reactjs - 反应,渲染不同的组件并保持滚动位置
问题描述
假设您有一个水平平面列表。
当用户单击项目中的按钮时,您希望呈现一个看起来与您拥有的平面列表项目不同的视图。
假设你像下面这样实现它
{showDetail ? (
<DetailView onPress={toggleShowDetail} />
) : (
<FlatList
data={data}
renderItem={() => (
<View>
<Button onPress={toggleShowDetail} />{' '}
</View>
)}
/>
)}
当 flatlist 被替换和替换回来时,flatlist 的滚动位置是否保持不变DetailView
?
如果没有,我可以采取哪些方法?
如果可能的话,我想避免使用模态
- 编辑,
我不确定设置样式width=0
是否会在设置时保持滚动位置width=prevSavedWidth
..但肯定可以尝试..
import _ from 'lodash'
import React, {useState} from 'react'
import {useDispatch} from 'react-redux'
import {useSelector} from 'react-redux'
import {
Text,
Image,
View,
NativeModules,
NativeEventEmitter,
TouchableOpacity,
FlatList,
} from 'react-native'
const Qnas = props => {
const flatlistRef = React.useRef(null)
const [single, setSingle] = React.useState(false)
let qnas = [
{
title: 'a',
id: 1,
},
{
title: 'b',
id: 2,
},
{
title: 'c',
id: 3,
},
{
title: 'd',
id: 4,
},
{
title: 'e',
},
{
title: 'f',
},
{
title: 'j',
},
]
const toggle = () => {
setSingle(!single)
}
const renderItem = ({item: qna, index}) => {
return (
<View style={{height: 80, width: 200}}>
<Text>{qna.title}</Text>
<TouchableOpacity onPress={toggle}>
<Text>toggle</Text>
</TouchableOpacity>
</View>
)
}
const keyExtractor = (item, index) => {
return `qna-${item.title}-${index}`
}
return (
<View style={{height: 200}}>
{single ? (
<View>
<Text>hello</Text>
<TouchableOpacity onPress={toggle}>
<Text>toggle</Text>
</TouchableOpacity>
</View>
) : (
<FlatList
horizontal
ref={flatlistRef}
data={qnas}
renderItem={renderItem}
keyExtractor={keyExtractor}
contentContainerStyle={{
flexDirection: 'column',
flexWrap: 'wrap',
}}
/>
)}
</View>
)
}
export default Qnas
解决方案
您可以有一个 handleScroll 方法,该方法在 FlatList Scroll 上被调用并将 srollPosition 保存在状态
const handleScroll = event => {
console.log(event);
setScrollPosition(event.nativeEvent.contentOffset.x);
};
<FlatList onScroll={handleScroll} />```
and then in your toggle method have a check on if single is true set the scrollPosition of the FlatList using ref
const toggle = () => {
if(single){
this.flatlistRef.scrollToOffset({ animated: true, offset: scrollPosition }
setSingle(!single);
}
hope this helps
推荐阅读
- json - 将 JSON 解析为多个 Typescript 对象
- php - 如何以选项卡作为链接的形式在所有子域中共享多站点主域的非主菜单?
- python - QMediaPlayer setPlaybackRate > 1 导致高音音频
- java - 最新 FLP api 客户端构建期间的 Android AR Core 异常。回归传统
- reactjs - 使用 React Router 更改链接文本时链接回上一页
- asp.net-mvc - 安装后 x 次不再应用资源翻译
- spring - 无法将对象从一个 Thymeleaf 视图传递到另一个 Thymeleaf 视图
- wordpress - Wordpress 5.6.1 - Permissions-Policy Header 实现
- python - 使用 plotnine 时基于 pandas 数据框中的值的颜色条
- php - 在 WooCommerce 中选择本地取货方式时显示商店位置