【问题标题】:Grid view without using FlatList in React native在 React native 中不使用 FlatList 的网格视图
【发布时间】:2021-07-30 11:00:43
【问题描述】:

我刚刚开始学习 React Native。我想创建网格视图。我知道我可以使用FlatList 来做到这一点。但我不想那样。我只是映射数组中的数据并使用它制作一个网格。但它没有奏效。这是我的代码。

const ingredientnsViews = INGREDIENTS.map(data => {
  return (
     <View style={styles.gridIngredients}>
       <Image
         style={styles.ingredientImage}
         resizeMode="contain"
         source={data.image}
       />
       <Text style={styles.ingredientsText}>{data.title}</Text>
     </View>
  );
});

这是我的风格。

ingredientsText: {
fontFamily: AppFonts.Primary.Sans.Regular,
fontStyle: 'normal',
fontWeight: '400',
alignSelf: 'center',
fontSize: 12,
color: COLORS.black,
},

gridIngredients: {
marginTop: 12,
width: '30%',
flexDirection: 'row',
justifyContent: 'center',
backgroundColor: COLORS.tabBgColor,
paddingStart: 16,
paddingEnd: 16,
paddingTop: 8,
paddingBottom: 8,
borderRadius: 8,
},

ingredientImage: {
width: 15,
alignSelf: 'center',
height: 15,
},

INGREDIENTS 是我的数组。我需要带有4 comumns 的网格。 提前感谢您的帮助。

【问题讨论】:

    标签: reactjs react-native gridview


    【解决方案1】:

    您需要ScrollView。在ScrollView 中,您可以使用地图渲染您的网格视图。

    https://snack.expo.dev/O9KI-80gn

    请查看下方添加代码。

    import * as React from 'react';
    import {Text, Image, View, ScrollView, StyleSheet} from 'react-native';
    import Constants from 'expo-constants';
    
    
    // or any pure javascript modules available in npm
    import {Card} from 'react-native-paper';
    const INGREDIENTS = [
      {name: 'Banana', image: 'https://picsum.photos/seed/picsum/200/300'},
      {name: 'Apple', image: 'https://picsum.photos/seed/picsum/200/300'},
      {name: 'Orange', image: 'https://picsum.photos/seed/picsum/200/300'},
      {name: 'Banana', image: 'https://picsum.photos/seed/picsum/200/300'},
      {name: 'Apple', image: 'https://picsum.photos/seed/picsum/200/300'},
    
      {name: 'Orange', image: 'https://picsum.photos/seed/picsum/200/300'},
        {name: 'Banana', image: 'https://picsum.photos/seed/picsum/200/300'},
      {name: 'Apple', image: 'https://picsum.photos/seed/picsum/200/300'},
      {name: 'Orange', image: 'https://picsum.photos/seed/picsum/200/300'},
      {name: 'Banana', image: 'https://picsum.photos/seed/picsum/200/300'},
      {name: 'Apple', image: 'https://picsum.photos/seed/picsum/200/300'},
      {name: 'Orange', image: 'https://picsum.photos/seed/picsum/200/300'},
      
    ];
    export default function App() {
      const ingredientnsViews = data => {
        return (
          <View style={styles.gridIngredients}>
            <Image
              style={styles.ingredientImage}
              resizeMode="contain"
              source={data.image}
            />
            <Text style={styles.ingredientsText}>{data.name}</Text>
          </View>
        );
      };
      return (
        <View style={styles.container}>
          <ScrollView>
            <View style={{flexDirection: 'row', flexWrap: 'wrap'}}>
              {INGREDIENTS.map((value, index) => {
                return ingredientnsViews(value);
              })}
            </View>
          </ScrollView>
        </View>
      );
    }
    
    const styles = StyleSheet.create({
      container: {
        flex: 1,
        justifyContent: 'center',
        paddingTop: Constants.statusBarHeight,
        backgroundColor: '#ecf0f1',
        padding: 8,
      },
      ingredientsText: {
        //fontFamily: AppFonts.Primary.Sans.Regular,
        fontStyle: 'normal',
        fontWeight: '400',
        alignSelf: 'center',
        fontSize: 12,
        color: 'black',
      },
    
      gridIngredients: {
        marginTop: 12,
        width: '22%',
        flexDirection: 'row',
        justifyContent: 'center',
        backgroundColor: 'yellow',
        paddingStart: 16,
        paddingEnd: 16,
        paddingTop: 8,
        marginRight: 10,
        paddingBottom: 8,
        borderRadius: 8,
      },
    
      ingredientImage: {
        width: 15,
        alignSelf: 'center',
        height: 15,
      },
    });
    

    输出:-

    【讨论】:

    • 好的。但我已经有一个父 ScrollView
    • 能否请您添加完整的代码 sn-p ?根据共享的问题,我们看起来你唯一不想创建网格的平面列表
    • 如果我们已经有ScrollView 作为父级,您只需在ScrollView 中添加map。并返回View
    • 网格未居中。如您所见,第一列左侧没有间距。我们可以将 marginLeft 添加到整个父 View,但它不会响应。我在 flex 视图中使用了“空间均匀”,它看起来不错,但是如果该行少于 4 个项目,则最后一行将无法正确对齐。知道如何解决这个问题吗?
    猜你喜欢
    • 2019-03-20
    • 2022-11-30
    • 1970-01-01
    • 2018-05-09
    • 2020-01-25
    • 2020-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多