在 FlatList(和 ScrollView)中锁定滚动位置
Posted
技术标签:
【中文标题】在 FlatList(和 ScrollView)中锁定滚动位置【英文标题】:Locking scroll position in FlatList (and ScrollView) 【发布时间】:2017-11-04 02:29:35 【问题描述】:我正在尝试创建一个 FlatList,它保持当前滚动位置锁定,并且不会因插入列表顶部的新项目而改变。
我创建了一个expo snack 来表明我的意图。
小吃呈现一个带有绿色项目的 ScrollView,最后是一个黑色项目。 当应用程序启动时,它会滚动到列表的底部。五秒钟后,顶部插入了 10 个项目,滚动位置根据这些项目的总大小而变化。
这是世博小吃的代码:
import React, Component from 'react';
import View, FlatList from 'react-native';
const renderItem = ( item ) =>
let backgroundColor;
if (item == 10)
backgroundColor = "black"
else
backgroundColor = item % 2 == 0 ? 'green' : 'blue'
return (
<View
style=
width: 200,
height: 50,
backgroundColor,
margin: 10,
/>
);
;
const MyList = class extends Component
componentDidMount()
setTimeout(() => this.ref.scrollToEnd( animated: false ), 500);
render()
return (
<FlatList
ref=r => this.ref = r
data=this.props.data
renderItem=this.props.renderItem
/>
);
;
export default class App extends Component
constructor(props)
super(props);
this.state =
items: [2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 10],
;
componentDidMount()
const items = [...this.state.items];
items.unshift(1, 1, 1, 1, 1, 1, 1, 1, 1, 1);
setTimeout(() => this.setState( items ), 5000);
render()
return <MyList renderItem=renderItem data=this.state.items />;
我想保持滚动位置锁定,这意味着 - 插入项目时滚动位置不会改变(或者至少在某种程度上用户不知道发生了什么)
有没有办法用 FlatList 和 ScrollView 的当前 API 做到这一点?要实现此功能需要实现什么?
【问题讨论】:
【参考方案1】:您应该使用 componentDidUpdate() 来实现这一点。
componentDidUpdate(prevProps, prevState)
if(prevProps.data != this.props.data)
this.ref.scrollToEnd( animated: false );
将此添加到您的 MyList 组件中。当组件收到新的 props.data 而不是你当前的 props.data 时,它将调用 scrollToEnd。
这可能会有所帮助!
【讨论】:
【参考方案2】:您是否尝试过使用 keyExtractor
? (https://facebook.github.io/react-native/releases/next/docs/flatlist.html#keyextractor)。
这可能有助于避免重新渲染,因此请尝试为每个项目使用唯一键。
【讨论】:
以上是关于在 FlatList(和 ScrollView)中锁定滚动位置的主要内容,如果未能解决你的问题,请参考以下文章
react-native ScrollView 嵌套 FlatList滚动
react-native-draggable-flatlist 在 ScrollView 中不起作用
RN下ScrollView包裹FlatList/SectionList类的组件,在IOS键盘遮挡问题
使用 Animated.Flatlist 和 Animated.ScrollView 为 Animated.View 设置动画效果不流畅