React Native中的Grid替代方案

ruarlubt  于 2023-06-06  发布在  React
关注(0)|答案(1)|浏览(244)

因此,我目前正试图创建一个过滤器,看起来像书籍堆叠,我想实现的一个例子是在下面的链接提供:https://dribbble.com/shots/19300443-Audiobook-App
我尝试过实现网格,但似乎与react native不兼容,并且不起作用-建议将受到高度赞赏!
这是我的代码:

import { ScrollView, StyleSheet, Text, View, ImageBackground, Image, TouchableOpacity } from 'react-native'

    import React, { useState } from 'react'
    import LibraryBookCard from '../components/libraryBookCard'
    import * as Font from 'expo-font';
    import { globalStyles } from '../utils/GlobalStyles';
    
    const LibraryScreen = () => {
      const [fontLoaded, setFontLoaded] = useState(false);
    
      const loadFonts = async () => {
        await Font.loadAsync({
          'Hensa': require('../assets/fonts/Hensa.ttf'),
        });
        setFontLoaded(true);
      };
    
      React.useEffect(() => {
        loadFonts();
      }, []);
    
      let dummyData = [
        {title: 'The Lighthouse', author: 'Jess Thompson', prompt: "Magic Waterfall", genre: 'Action'},
        {title: 'Growing Pains', author: 'Cassidy Hue', prompt: "Magic Bean", genre: 'Fantasy'},
        {title: 'Lovesick', author: 'Alexa Pea', prompt: "Tinder", genre: 'Romance'},
        {title: 'Masks and Muggles', author: 'Emma Haas', prompt: "Wizardry", genre: 'Fantasy'},
        {title: 'The Magician', author: 'Joshy B', prompt: "Thee Sword", genre: 'Fantasy'},
      ]
      const handleButtonPress = () => {
        console.log("pressed");
      }
    
      return (
        <ImageBackground
          source={require('../assets/bg/general.png')}
          style={styles.backgroundImage}
        >
          {fontLoaded && (
            <View>
              <Text style={styles.heading}>Library</Text>
              <Text style={styles.body}>Let’s find the perfect story for you.</Text>
    
    
              <View style={styles.buttonContainer}>
                <TouchableOpacity style={[styles.book, styles.book1]}>
                <Text style={styles.bookText}>Book 1</Text>
              </TouchableOpacity>
    
              <TouchableOpacity style={[styles.book, styles.book2]}>
                <Text style={styles.bookText}>Book 2</Text>
              </TouchableOpacity>
    
              <TouchableOpacity style={[styles.book, styles.book3]}>
                <Text style={styles.bookText}>Book 3</Text>
              </TouchableOpacity>
    
              
              <TouchableOpacity style={[styles.book, styles.book4]}>
                <Text style={styles.bookText}>Book 4</Text>
              </TouchableOpacity>
    
                        
              <TouchableOpacity style={[styles.book, styles.book5]}>
                <Text style={styles.bookText}>Book 5</Text>
              </TouchableOpacity>
              </View>
    
              <Text style={styles.subHeading}>My Collection</Text>
              <ScrollView style={styles.scrollView}>
                {dummyData.map((project, index) => (
                  <LibraryBookCard key={index} data={project}/>
                ))}
              </ScrollView>
            </View>
          )}
        </ImageBackground>
      )
    }
    
    export default LibraryScreen
    
    const styles = StyleSheet.create({
      backgroundImage: {
        ...StyleSheet.absoluteFillObject,
        paddingLeft: 30,
        paddingRight: 30,
        paddingBottom: 30,
        justifyContent: 'center',
        alignItems: 'center',
        resizeMode: 'cover',
      },
      heading: {
        fontFamily: 'Hensa',
        fontSize: 52,
        color: 'white',
        width: 350,
        paddingTop: 65,
        paddingLeft: 20,
        lineHeight: 50,
      },
      body: {
        color: 'white',
        width: 350,
        paddingLeft: 20,
        paddingTop: 10,
        paddingBottom: 40,
      },
      scrollView: {
        height: 100,
      },
      subHeading:{
        color: 'white',
        fontWeight: 600,
        fontSize: 18,
        paddingLeft: 20,
    
      },
      buttonCcontainer: {
        flex: 1,
        display: 'grid',
        gridTemplateColumns: 'repeat(5, 1fr)',
        gridTemplateRows: 'repeat(5, 1fr)',
        gridColumnGap: 0,
        gridRowGap: 0,
        alignItems: 'center',
        justifyContent: 'center',
      },
      book1: {
        gridArea: '1 / 1 / 2 / 4',
        backgroundColor: '#B68C4C'
      },
      book2: {
        gridArea: '1 / 4 / 2 / 6',
        backgroundColor: '#9F3824'
      },
      book3: {
        gridArea: '2 / 1 / 5 / 2',
        backgroundColor: '#9F3824'
      },
      book4: {
        gridArea: '4 / 2 / 5 / 6',
        backgroundColor: '#6B8DFF'
      },
      book5: {
        gridArea: '2 / 2 / 4 / 6',
        backgroundColor: '#B68C4C'
      },
    });
e5nszbig

e5nszbig1#

在React Native中,您可以通过使用可用的布局组件并应用适当的样式来实现网格效果。以下是在React Native中创建网格布局的一般方法:
确定网格结构:确定网格布局的列数和行数。这将帮助您确定网格项的布局结构和大小。
使用Flexbox:使用Flexbox(React Native支持的CSS布局系统)创建网格布局。Flexbox提供了强大的工具,用于以灵活的方式排列项目。
选择容器组件:选择合适的容器组件(如View或ScrollView)来 Package 网格项。具体选择取决于您想要的是可滚动网格还是适合屏幕的固定大小网格。
应用样式:将适当的样式应用于容器和网格项以实现所需的网格效果。要考虑的主要样式包括:
弹性方向:将容器的flexDirection属性设置为“row”或“column”,具体取决于您需要的是基于行的网格还是基于列的网格。
flexWrap:如果需要,将容器上的flexWrap属性设置为“wrap”,以允许项换行到下一行或下一列。
flex:为每个网格项分配一个flex值,以控制其在网格中的相对大小。例如,您可以设置flex:1以使它们的大小相等,或分配不同的值以实现自定义大小调整。
宽度和高度:使用width和height属性指定网格项的尺寸。您可以设置固定大小或利用百分比或基于网格结构的计算。
边距和填充:应用适当的边距和填充值以在网格项之间创建间距。
其他样式属性:考虑使用其他样式属性(如border、backgroundColor和borderRadius)来增强网格的外观。
渲染网格项:在容器组件内部,使用适当的React Native组件渲染网格项,例如View,TouchableOpacity或自定义组件。您可以Map数据数组以动态生成网格项或手动定义网格项。
自定义网格项目内容:根据您的要求自定义每个网格项中的内容。您可以包含图像,文本,按钮或任何其他React Native组件来表示网格中的数据或交互元素。
通过结合这些步骤并应用适当的样式,您可以在React Native中实现网格效果。尝试使用不同的布局、样式属性和组件,为应用程序创建所需的网格布局。
如果您有更复杂的案例,请阅读本文-https://medium.com/@kalebjdavenport/how-to-create-a-grid-layout-in-react-native-7948f1a6f949

相关问题