在平面列表中每 3 个项目添加一个分隔符 - React Native

Add a separator every 3 item in flatlist - React Native

如何为 flatlist 中的每 3 个项目添加一个分隔符?我可以在每一项之后添加一个分隔符。我没有找到一个道具。这是我的代码:

import React from 'react';
import { SafeAreaView, View, FlatList, StyleSheet, Text} from 'react-native';

const DATA = [
    {
        id: 1,
        title: 'Item 1',
    },

    {
        id: 2,
        title: 'Item 2',
    },
    {
        id: 3,
        title: 'Item 3',
    },
    {
        id: 4,
        title: ' Item 4',
    },
    {
        id: 5,
        title: 'Item 5',
    },
    {
        id: 6,
        title: 'Item 6',
    },
    {
        id: 7,
        title: 'Item 7',
    },
];


const App = () => {

    const renderItem = ({ item }) => (
        <View style={styles.item}>
            <Text style={styles.title}>{item.title}</Text>
        </View>
    );

    const seperator = () => {
        return (
            <View style={styles.seperator} />
        )
    }

    return (
        <SafeAreaView style={styles.container}>
            <FlatList
                data={DATA}
                renderItem={renderItem}
                keyExtractor={(items) => items.id}
                ItemSeparatorComponent={seperator}
            />
        </SafeAreaView>
    );
}

const styles = StyleSheet.create({
    container: {
        flex: 1,
    },
    item: {
        backgroundColor: '#f9c2ff',
        padding: 10,
        marginVertical: 8,
        marginHorizontal: 16,
    },
    title: {
        fontSize: 32,
    },
    seperator: {
        width: 300,
        height: 10,
        backgroundColor: 'red'
    }
});

export default App;

我的应用看起来像:

但我想做到:

如何为 flatlist 中的每 3 个项目添加一个分隔符?我可以在每一项之后添加一个分隔符。我没有找到它的道具。

首先,传递一个接收参数的箭头函数。在这种情况下,它是 e,它包含对象(例如第一个):

{"highlighted":false,"leadingItem":{"id":1,"title":"Item 1"}}

所以这是一个简单的方法,获取 id 并检查它是否 %3 === 0。看看:

 const seperator = (e) => {
        return (
          (e.leadingItem.id % 3 == 0) ? <View style={styles.seperator}/>
                                      : null

        )
    }

然后

return (
        <SafeAreaView style={styles.container}>
            <FlatList
                data={DATA}
                renderItem={renderItem}
                keyExtractor={(items) => items.id}
                ItemSeparatorComponent={(e) => seperator(e)}
            />
        </SafeAreaView>
    );

正如您在此工作中看到的那样 example

如果您的数据项没有 id 或 属性 可以轻松区分两个项目,请考虑使用计数器来跟踪多少次您的 separator 函数被调用了。

但是,使用 keyExtractor 中的某些键很重要,因为它用于缓存并作为反应键来跟踪项目重新排序。

对于这种情况,无论如何,可以使用 useRef 钩子,因为:

useRef returns a mutable ref object whose .current property is initialized to the passed argument

请注意,如果您改为选择 useState 挂钩,它仍然可行,但可能更冗长。

import { useRef } from 'react' 

let count = useRef(0)
const seperator = (e) => {
        count.current += 1
        return (
          (count.current % 3 == 0) ? <View style={styles.seperator}/>
                                   : null
       )
}

return (
        <SafeAreaView style={styles.container}>
            <FlatList
                data={DATA}
                renderItem={renderItem}
                ItemSeparatorComponent={(e) => seperator(e)}
            />
        </SafeAreaView>
)

因为它是可变的,每次调用函数时添加一个单位