react native学习【6.1】——列表视图

news/2025/1/18 12:18:29/

react native学习【6.1】——列表视图

      • 官方文档
        • 官方文档链接
        • 具体内容
          • FlatList & SectionList
      • 具体操作
        • 1)移动文件
        • 2)修改_layout.tsx文件
          • 删除导入语句
          • 添加导入语句
          • 修改并添加具体的代码语句
          • 对报错语句进行修改
          • 最终的_layout.tsx文件的代码
        • 3)添加并编写menu.jsx文件
        • 4)编写MenuItems.js
        • 5)创建menu图像文件夹
        • 6)创建调用图像的文件MenuImages.js

官方文档

官方文档链接

https://reactnative.cn/docs/using-a-listview

具体内容
FlatList & SectionList
  1. React Native 提供了几个适用于展示长列表数据的组件,一般而言我们会选用FlatList或是SectionList。

  2. FlatList组件用于显示一个垂直的滚动列表,其中的元素之间结构近似而仅数据不同。

    1. FlatList更适于长列表数据,且元素个数可以增删。和ScrollView不同的是,FlatList并不立即渲染所有元素,而是优先渲染屏幕上可见的元素。
    2. FlatList组件必须的两个属性是datarenderItemdata是列表的数据源,而renderItem则从数据源中逐个解析数据,然后返回一个设定好格式的组件来渲染。
    3. 下面的例子创建了一个简单的FlatList,并预设了一些模拟数据。首先是初始化FlatList所需的data,其中的每一项(行)数据之后都在renderItem中被渲染成了Text组件,最后构成整个FlatList

在这里插入图片描述

  1. 如果要渲染的是一组需要分组的数据,也许还带有分组标签的,那么SectionList将是个不错的选择。

在这里插入图片描述

具体操作

1)移动文件
  1. 将(tabs)中的index.jsx contact.jsx移动到app文件夹下面;
  2. 删除(tabs)和(coffee)文件夹。
2)修改_layout.tsx文件

alt+z 可开启自动换行

  1. 删除导入语句

    import { DarkTheme, DefaultTheme, ThemeProvider } from '@react-navigation/native';

    import 'react-native-reanimated';

    import { StatusBar } from 'expo-status-bar';(如果有的话)

  2. 添加导入语句

    import { Appearance } from 'react-native';

    import { Colors } from '@/constants/Colors';

  3. 修改并添加具体的代码语句
    const colorScheme = Appearance.getColorScheme(); // 调用Appearance 来提供配色方案 'light' | 'dark'
    const theme = colorScheme === 'dark' ? Colors.dark : Colors.light; // 根据当前的配色方案选择对应的主题颜色
    
  4. 对报错语句进行修改
    // 直接删除掉相应的语句就行,下面是删除之后的代码:
    return (<Stack><Stack.Screen name="(tabs)" options={{ headerShown: false }} />{/* <Stack.Screen name="(coffee)" options={{ headerShown: false }} /> */}{/* 为每一个文件添加一个堆栈 */}{/*   <Stack.Screen name="index" options={{title: "Home", headerShown:false}} /><Stack.Screen name="contact" options={{title: "Contact Us"}} /> */}<Stack.Screen name="+not-found" /></Stack>     );
    

    之后,对Stack添加选项,设置标题headerStyle背景颜色 backgroundColor的时候需要对Colors文件添加代码hearderBackground。

在这里插入图片描述

return (<Stack screenOptions={{headerStyle: {backgroundColor: theme.headerBackground},headerTintColor: theme.text, headerShadowVisible: false,}}><Stack.Screen name="index" options={{ headerShown: false, title: 'Home'}} /><Stack.Screen name="menu" options={{ headerShown: true, title: 'Meanu', headerTitle: 'Coffee Shop  Menu' }} /><Stack.Screen name="contact" options={{ headerShown: true, title: 'Contact', headerTitle: 'Contact Us' }} /><Stack.Screen name="+not-found" options={{headerShown: false}}/></Stack> );

需要注意的是,还没有创建menu相关的文件,可能会报错。

  1. 最终的_layout.tsx文件的代码
    import { useFonts } from 'expo-font';
    import { Stack } from 'expo-router';
    import * as SplashScreen from 'expo-splash-screen';
    import { useEffect } from 'react';
    import { Appearance } from 'react-native';
    import { Colors } from '@/constants/Colors';// Prevent the splash screen from auto-hiding before asset loading is complete.
    SplashScreen.preventAutoHideAsync();export default function RootLayout() {const colorScheme = Appearance.getColorScheme(); // 调用Appearance 来提供配色方案 'light' | 'dark'const theme = colorScheme === 'dark' ? Colors.dark : Colors.light; // 根据当前的配色方案选择对应的主题颜色const [loaded] = useFonts({SpaceMono: require('../assets/fonts/SpaceMono-Regular.ttf'),});useEffect(() => {if (loaded) {SplashScreen.hideAsync();}}, [loaded]);if (!loaded) {return null;}return (<Stack screenOptions={{headerStyle: {backgroundColor: theme.headerBackground},headerTintColor: theme.text, headerShadowVisible: false,}}><Stack.Screen name="index" options={{ headerShown: false, title: 'Home'}} /><Stack.Screen name="menu" options={{ headerShown: true, title: 'Meanu', headerTitle: 'Coffee Shop  Menu' }} /><Stack.Screen name="contact" options={{ headerShown: true, title: 'Contact', headerTitle: 'Contact Us' }} /><Stack.Screen name="+not-found" options={{headerShown: false}}/></Stack> );
    }
    
3)添加并编写menu.jsx文件

在app文件夹下面添加menu.jsx文件(注意,此时的menu.jsx是和index.jsx文件是同等级的)

提到SafeAreaViewhttps://reactnative.cn/docs/safeareaview

import { StyleSheet, Appearance, Platform, SafeAreaView, ScrollView, FlatList, View, Text, Image } from "react-native";
import { Colors } from "@/constants/Colors";export default function MenuScreen(){const colorScheme = Appearance.getColorScheme();const theme = colorScheme === "dark"? Colors.dark : Colors.light;const styles = createStyles(theme, colorScheme);// SafeAreaView在移动设备上使用,ScrollView在web上使用const Container = Platform.OS === 'web' ? ScrollView : SafeAreaView;// 菜单屏幕功能的返回return (// 这里的Container是父容器<Container>  {/* data需要具体的数值,所以在constants文件夹下面创建文件MenuItems.js */}<FlatListdata ={[]}renderItem={({item}) => ()}></FlatList></Container>)
}function createStyles(theme, colorScheme) {return StyleSheet.create({});
}

上述内容存在不完善,提示一个错误。后面会完善

4)编写MenuItems.js

在constants文件夹下面创建文件MenuItems.js 。

在这里插入图片描述

export const MENU_ITEMS = [{"id":1,"title":"Espresso","description": "Strong, concentrated coffee.",},{"id":2,"title":"Latte","description": "Rich, smooth milk with a smooth texture.",},{"id":3,"title":"Cappuccino","description": "A smooth, rich, and creamy coffee with a smooth texture.",},{"id":4,"title":"Americano","description": "A strong, thick coffee with a smooth texture.",},{"id":5,"title":"Mocha","description": "A smooth, rich, and creamy coffee with a smooth texture.",},{"id":6,"title":"Macchiato","description": "A smooth, rich, and creamy coffee with a smooth texture.",},{"id":7,"title":"affogato","description": "A smooth, rich, and creamy coffee with a smooth texture.",},{"id":8,"title":"coldblew","description": "Rich, smooth milk with a smooth texture.",},{"id":9,"title":"cortado","description": "A strong, thick coffee with a smooth texture.",},{"id":10,"title":"flatwhite","description": "A smooth, rich, and creamy coffee with a smooth texture.",}
]
// 上述内容不一定准确,只是一个示例
5)创建menu图像文件夹

在images目录下面,创建menu文件夹,并将已有的coffee图像移动到该文件夹当中。

图像来源: https://github.com/gitdagray/react-native-course/tree/lesson-4/MyApp/assets/images/menu
在这里插入图片描述

6)创建调用图像的文件MenuImages.js

在constants文件夹下面创建文件MenuImages.js

创建数组存储这些咖啡。

import espresso from "@/assets/images/menu/espresso.png"
import americano from "@/assets/images/menu/americano.png"
import latte from "@/assets/images/menu/latte.png"
import cappuccino from "@/assets/images/menu/cappuccino.png"
import macchiato from "@/assets/images/menu/macchiato.png"
import mocha from "@/assets/images/menu/mocha.png"
import flatwhite from "@/assets/images/menu/flatwhite.png"
import cortado from "@/assets/images/menu/cortado.png"
import coldbrew from "@/assets/images/menu/coldbrew.png"
import affogato from "@/assets/images/menu/affogato.png"export default [espresso,americano,latte,cappuccino,macchiato,mocha,flatwhite,cortado,coldbrew,affogato
]

欢迎交流~
一切顺利!


http://www.ppmy.cn/news/1564145.html

相关文章

Starrocks 开启 Ranger 权限认证支持

Starrocks 开启 Ranger 权限认证支持 SR 支持版本 : 3.1.9 及以后版本&#xff0c;Ranger 版本 2.1 及以后版本 Ranger Apache Ranger 提供了一个集中式的安全管理框架&#xff0c;用户可以通过可视化的 Web 页面来定制各种访问策略&#xff0c;决定哪些角色能访问哪些数据&…

Day38补20250117代码随想录动态规划6 322.零钱兑换|279.完全平方数|139.单词拆分|多重背包问题|总结

Day38补20250117代码随想录动态规划6 322.零钱兑换|279.完全平方数|139.单词拆分|多重背包问题|总结 【多重背包问题】稍微了解了一下&#xff0c;没有具体敲代码 322.零钱兑换 题目 给你一个整数数组 coins &#xff0c;表示不同面额的硬币&#xff1b;以及一个整数 amoun…

海康MV-EB435i立体相机SDK安装(ROS 2)

文章目录 一、简介二、驱动配置小结 一、简介 MV-EB435i相机是一款低成本、小体积、配置全面的立体相机&#xff0c;凭借硬件级的深度图像处理方案&#xff0c;相机可在高性能输出的同时维持低功耗的水平。相机采用海康MV3D SDK&#xff0c;并提供跨平台支持&#xff0c;广泛应…

内网渗透测试工具及渗透测试安全审计方法总结

1. 内网安全检查/渗透介绍 1.1 攻击思路 有2种思路&#xff1a; 攻击外网服务器&#xff0c;获取外网服务器的权限&#xff0c;接着利用入侵成功的外网服务器作为跳板&#xff0c;攻击内网其他服务器&#xff0c;最后获得敏感数据&#xff0c;并将数据传递到攻击者&#xff0…

2025年第三届“华数杯”国际赛A题解题思路与代码(Python版)

游泳竞技策略优化模型代码详解 第一题&#xff1a;速度优化模型 在这一部分&#xff0c;我们将详细解析如何通过数学建模来优化游泳运动员在不同距离比赛中的速度分配策略。 1. 模型概述 我们的模型主要包含三个核心文件&#xff1a; speed_optimization.py: 速度优化的核…

2025年供应链攻击或成企业主要威胁

2024年由于网络安全领域的活动显著增加&#xff0c;网络威胁动态性和数字攻击面不断扩大&#xff0c;预计2025年企业将面临更大的网络攻击挑战。 安全专家预测&#xff0c;在众多形式的网络攻击中&#xff0c;供应链攻击正成为一种日益严重的安全隐患&#xff0c;它通过渗透企…

Lambda 架构之实时处理层的深度剖析:从原理到 Java 实战

一、背景知识 在当今的信息时代&#xff0c;数据的产生速度呈现爆炸式增长&#xff0c;并且越来越多的业务场景对数据处理的实时性提出了严格的要求。传统的数据处理架构往往侧重于批处理&#xff0c;对于实时数据的处理能力有限&#xff0c;难以满足诸如实时监控、即时推荐、…

【UNION与UNION ALL的区别?】

UNION与UNION ALL的区别&#xff1f; UNION和UNION ALL都是用来合并两个或多个SQL查询的结果集的运算符&#xff0c;但它们之间有一些关键的区别&#xff1a; 重复数据处理: UNION会自动去除所有结果集中的重复记录。这意味着如果你从不同的查询中得到了相同的行&#xff0c;U…