React-Native 另一个 VirtualizedList 支持的容器

IT技术 javascript reactjs react-native
2021-04-07 16:34:03

升级到 react-native 0.61 后,我收到了很多这样的警告:

VirtualizedLists should never be nested inside plain ScrollViews with the same orientation - use another VirtualizedList-backed container instead.

VirtualizedList-backed container我应该使用的另一个什么,为什么现在建议不要那样使用?

6个回答

如果有人仍在寻找对@Ponleu 和@David Schilling 在此处描述的问题的建议(关于高于 FlatList 的内容),那么这就是我采用的方法:

<SafeAreaView style={{flex: 1}}>
    <FlatList
      data={data}
      ListHeaderComponent={ContentThatGoesAboveTheFlatList}
      ListFooterComponent={ContentThatGoesBelowTheFlatList} />
</SafeAreaView>

您可以在此处阅读更多相关信息:https : //facebook.github.io/react-native/docs/flatlist#listheadercomponent

希望它可以帮助某人。:)

@Ponleu 您可以使用useMemoReact 提供钩子记住您的 ContentThatGoesAboveTheFlatList 组件,以避免重新渲染。更多信息在这里:reactjs.org/docs/hooks-reference.html#usememo如果有帮助,请告诉我。:)
2021-05-24 16:34:03
@DavidSchilling 因为您尝试使用 2 个滚动容器的方式导致结果:ScrollView并且FlatList- 您会得到不一致的滚动行为。此答案中呈现的方式只会产生 1 个滚动容器,而在页眉/页脚中,无论多么复杂,您都可以放置任何视图。
2021-05-27 16:34:03
你知道为什么这应该比产生警告的方式更好吗?
2021-05-31 16:34:03
我需要在一页中包含不同数据集的两个平面列表……我该怎么办?
2021-06-01 16:34:03
我正在使用函数组件,并且遇到了 ContentThatGoesAboveTheFlatList 重新渲染问题。对此的任何解决方案
2021-06-07 16:34:03

以防万一这对某人有帮助,这就是我在我的情况下修复错误的方式。

我有一个FlatList嵌套在 a 中ScrollView

render() {
    return (
        <ScrollView>
            <Text>{'My Title'}</Text>
            <FlatList
                data={this.state.myData}
                renderItem={({ item }) => {
                    return <p>{item.name}</p>;
                }}
            />
            {this.state.loading && <Text>{'Loading...'}</Text>}
        </ScrollView>
    );
}

ScrollView通过使用FlatList来呈现我需要的一切来摆脱 ,从而消除了警告:

render() {
    const getHeader = () => {
        return <Text>{'My Title'}</Text>;
    };

    const getFooter = () => {
        if (this.state.loading) {
            return null;
        }
        return <Text>{'Loading...'}</Text>;
    };

    return (
        <FlatList
            data={this.state.myData}
            renderItem={({ item }) => {
                return <p>{item.name}</p>;
            }}
            ListHeaderComponent={getHeader}
            ListFooterComponent={getFooter}
        />
    );
}
对于正在寻找最佳答案的人:“选择这个。只使用一个 FlatList。”
2021-05-25 16:34:03

最好的方法是禁用该警告,因为有时Flatlist需要在ScrollView.

更新 RN V0.63 以上

YellowBox 现在已更改并替换为 LogBox

功能性

import React, { useEffect } from 'react';
import { LogBox } from 'react-native';

useEffect(() => {
    LogBox.ignoreLogs(['VirtualizedLists should never be nested']);
}, [])

基于等级

import React from 'react';
import { LogBox } from 'react-native';

componentDidMount() {
    LogBox.ignoreLogs(['VirtualizedLists should never be nested']);
}

更新 RN V0.63 下面

功能性

import React, { useEffect } from 'react';
import { YellowBox } from 'react-native';

useEffect(() => {
    YellowBox.ignoreWarnings(['VirtualizedLists should never be nested']);
}, [])

基于等级

import React from 'react';
import { YellowBox } from 'react-native';

componentDidMount() {
    YellowBox.ignoreWarnings(['VirtualizedLists should never be nested']);
}
我有一个打开对话框的按钮,里面有一个输入框。当我点击输入时,对话框立即消失。所以我不得不用 ScrollView 包装 FlatList。那是解决问题,但导致警告。我发现的所有解决方案都没有奏效。所以在这种情况下,我完全同意 Nisharg。如果有人找到解决方案,请通知我。
2021-05-27 16:34:03
你知道,警告是有原因的,你不应该忽视它们......
2021-06-06 16:34:03
这似乎对我来说是唯一的方法,没有其他建议可以帮助我,使用滚动视图之外的另一个组件是行不通的!!
2021-06-09 16:34:03
@RafaelTavares,那么为什么这些被忽略的函数存在呢?
2021-06-14 16:34:03
同意,但有时我们需要因为一些低版本的依赖
2021-06-21 16:34:03

出现警告是因为ScrollViewFlatList共享相同的逻辑,如果FlatList在里面运行ScrollView,它是重复的

顺便说一句SafeAreaView对我不起作用,唯一的解决方法是

<ScrollView>
    {data.map((item, index) => {
        ...your code
    }}
</ScrollView>

错误消失

不明白这个。地图有什么帮助?FlatList 去哪儿了?
2021-06-02 16:34:03
想法是正确的,但代码不起作用。
2021-06-02 16:34:03
这个对我有用。我需要Flatlist里面Scrollview ,而map你在这里建议的功能为我做到了!
2021-06-04 16:34:03

查看文档中的示例,我已将容器从以下位置更改:

<ScrollView>
    <FlatList ... />
</ScrollView>

到:

<SafeAreaView style={{flex: 1}}>
    <FlatList ... />
</SafeAreaView>

所有这些警告都消失了。

如果我在FlatList内部呈现内容ScrollView并希望该内容可滚动怎么办?
2021-05-23 16:34:03
例如,主要点ScrollView是使其可垂直滚动。使用该属性不会使其再次可滚动。这里的重点是什么?
2021-05-24 16:34:03
两个可滚动的视图一个挨着一个,这不是很好的用户体验。我会尝试像这样嵌套它:'<View><ScrollView><Content /></ScrollView><FlatList ... /></View>'(未测试)
2021-05-26 16:34:03
我和@Ponleu 有同样的问题。我在ScrollView里面有一些内容,然后FlatList也在ScrollView. 我希望整个屏幕一起滚动。
2021-06-10 16:34:03
<SafeAreaView>仅适用于 iOS 11 或更高版本 ( facebook.github.io/react-native/docs/safeareaview )
2021-06-14 16:34:03