React Native报错:VirtualizedList嵌套同方向列表需设唯一listKey
嘿,咱们先把这个错误的核心意思掰明白:
Invariant Violation: A VirtualizedList contains a cell which itself contains more than one VirtualizedList of the same orientation as the parent list. You must pass a unique listKey prop to each sibling list.
简单说就是:你在一个滚动列表(比如FlatList,它是VirtualizedList的封装)的列表项里,嵌套了不止一个和父列表滚动方向相同的子列表,React Native内部没办法区分这些子列表,就抛出了这个错误。举个例子:父FlatList是垂直滚动的,某个列表项里又放了两个垂直滚动的FlatList,这时候就会触发这个问题。
你之前的操作为啥没解决问题?
你给FlatList加了keyExtractor、给react-native-elements的List子项加了key——这些都是给列表里的单个条目做唯一标识用的,和子列表组件本身的标识完全是两回事!这个错误要求的是给每个子VirtualizedList/FlatList组件本身加唯一标识,也就是listKey属性。
怎么解决?
很简单,给每个嵌套的同方向子FlatList/VirtualizedList加一个独一无二的listKey就行:
// 父列表的某个cell里的两个子垂直FlatList <FlatList listKey="user-posts-list" // 唯一值,别和其他子列表重复 data={userPosts} keyExtractor={(item) => item.postId} renderItem={({item}) => <PostCard item={item} />} /> <FlatList listKey="user-comments-list" // 另一个唯一值 data={userComments} keyExtractor={(item) => item.commentId} renderItem={({item}) => <CommentCard item={item} />} />
listKey的取值只要保证在同方向的子列表里唯一就行,你可以用业务相关的名称(比如上面的user-posts-list),或者用数据的唯一ID、索引拼接字符串都可以。
额外提醒
如果子列表的滚动方向和父列表不一样(比如父列表垂直,子列表水平),那你完全不用加listKey,React Native能通过滚动方向区分它们,不会触发这个错误。
内容的提问来源于stack exchange,提问作者Dan

