【问题标题】:React Native - Nested FlatLists Rendering ExponentiallyReact Native - 嵌套的 FlatLists 以指数方式呈现
【发布时间】:2018-07-03 03:49:16
【问题描述】:

这是一个令人头疼的问题。

为了在 SectionList 的各个部分中呈现多个列,我的理解是必须在每个部分中呈现 FlatLists。这是因为只有 FlatList 支持 numColumns 属性。

出于某种原因,下面的代码似乎呈现给定部分中每个项目的所有项目的 FlatList。

代码:

export default class LetterList extends React.Component {
  render() {
    let lists = [
        {
          key: "One",
          data: [{letter: 'a'}, {letter: 'b'}]
        },
        {
          key: "Two",
          data: [{letter: 'c'}, {letter: 'd'}, {letter:'e'}]
        }
        {
          key: "Three",
          data: [{letter: 'f'}]
        }
      ]

    return (
      <View key="letterList" >
        <SectionList
          renderItem={({section}) =>
            (
              <FlatList
                data={section.data}
                renderItem={({item}) => <Text>{item.letter}</Text>}
              />
            )
          }
          renderSectionHeader={({section}) => <Text>{section.key}</Text>}
          sections={lists}
        />
      </View>
    );
  }
}

看起来像:

One
ab
ab
Two
cd
e
cd
e
cd
e
Three
f

这可能是什么原因造成的?

感谢您的帮助。

【问题讨论】:

    标签: reactjs react-native nested react-native-flatlist


    【解决方案1】:

    这似乎是为了达到目的。

      render() {
        let lists = [
            {
              key: "One",
              data: [{letter: 'a'}, {letter: 'b'}]
            },
            {
              key: "Two",
              data: [{letter: 'c'}, {letter: 'd'}, {letter:'e'}]
            },
            {
              key: "Three",
              data: [{letter: 'f'}]
            }
          ]
        console.log("Rendering");
    //  console.log(this.props.data);
        listsComponents = [];
    
        for (var i = 0; i < lists.length; i++) {
          listsComponents[i] = (
            <View>
              <Text>{lists[i].key}</Text>
              <FlatList
                key={lists[i].key}
                data={lists[i].data}
                numColumns={2}
                renderItem={({item}) => <Text>{item.letter}</Text>}
              />
            </View>
          )
        }
    
        return (
          <View>
            {listsComponents}
          </View>
        )
      }
    }
    

    【讨论】:

      【解决方案2】:

      为了在 SectionList 的各个部分中呈现多个列,我的理解是必须在每个部分中呈现 FlatLists。这是因为只有 FlatList 支持 numColumns 属性。

      这个假设是错误的......节列表已经“创建”了所需的列表, 您不应该为每个部分创建一个 FlatList,只能按照 SectionList 需要的方式对齐数据

      请看官方文档提供的以下示例: https://facebook.github.io/react-native/docs/sectionlist

      示例 1,取自链接:

      // Example 1 (Homogeneous Rendering)
      <SectionList
        renderItem={({item, index, section}) => <Text key={index}>{item}</Text>}
        renderSectionHeader={({section: {title}}) => (
          <Text style={{fontWeight: 'bold'}}>{title}</Text>
        )}
        sections={[
          {title: 'Title1', data: ['item1', 'item2']},
          {title: 'Title2', data: ['item3', 'item4']},
          {title: 'Title3', data: ['item5', 'item6']},
        ]}
        keyExtractor={(item, index) => item + index}
      />
      

      【讨论】:

      • 是的,但是如何以这种方式实现网格布局?如果您这样做并应用 flexWrap: wrap,您将收到一个错误,建议您使用带有 numColumns 属性的 flatlist。
      • 那是正确的...... jin 为了呈现一个部分列表的侧面方式(即:像一个网格),您必须提供许多所需的列.. 如果您需要每个设备都是动态的(我猜你可能会这样做)......只需计算实际适合屏幕尺寸的单元格数量并相应地设置你的numColumns......
      • SectionList 不支持 numColumns。目前不支持具有没有副作用的网格布局的 SectionList。
      • 我们是正确的......我会更新我的答案......它的信息量不够......我确实有一个解决方案,虽然它不是一个“漂亮”的......我需要有我需要实现的自定义表情符号选择器的这种行为......我的解决方案是将 FlatList 与numColumns 一起使用,然后以在列表中呈现三种项目的方式操作数据,“ Header”项目、“Empty”项目和“Section”项目。然后列表显示一个“标题”项和几个“空”项来填充行,并且所有“部分”项将在其下方正确呈现,直到下一个标题项
      • 再次......这不是一个很好的解决方案,但如果你已经定义了应该显示的列表,它应该就足够了......
      猜你喜欢
      • 1970-01-01
      • 2021-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多