「2」expo-shopping:组织代码结构

前面我们已经准备好了expo router,现在我们来写页面

首先我们先定义一个auth用于全局的用户操作,新建context/auth.tsx

tsx 复制代码
import { createContext, useContext, useState } from "react";

const AuthContext = createContext({
  user: null,
  signIn: (val: any) => {},
  signOut: () => {},
});

export const useAuth = () => useContext(AuthContext);

export function AuthProvider({
  children,
  userCredentials,
}: {
  children: any;
  userCredentials: any;
}) {
  const [user, setAuth] = useState(userCredentials);

  return (
    <AuthContext.Provider
      value={{
        signIn: (userCredentials) => setAuth(userCredentials),
        signOut: () => setAuth(null),
        user,
      }}>
      {children}
    </AuthContext.Provider>
  );
}

主要抛出一个useAuth一个AuthProvider来包裹layout,达到复用context的作用

页面

我们现在来编写页面结构,结构如下:

新建app/_layout.tsx

tsx 复制代码
import { Stack } from "expo-router";
import { useState } from "react";

import { AuthProvider } from "../context/auth";

export default function Layout() {
  const [loadedUser, setLoadedUser] = useState(null);

  return (
    <AuthProvider userCredentials={loadedUser}>
      <Stack>
        <Stack.Screen
          name="(main)/(tabs)"
          options={{
            headerShown: false,
          }}></Stack.Screen>
      </Stack>
    </AuthProvider>
  );
}

用于在首次进入页面的时候,进入指向(main)/(tabs)下面的页面

新建关于页app/about.tsx

tsx 复制代码
import { useLocalSearchParams, useRouter } from "expo-router";
import { View, Text } from "react-native";

export default function Details() {
  const router = useRouter();
  const params = useLocalSearchParams();

  return (
    <View style={{ flex: 1, alignItems: "center", justifyContent: "center" }}>
      <Text
        onPress={() => {
          router.setParams({ name: "Updated" });
        }}>
        Update the title
      </Text>
    </View>
  );
}

这种路由地址和文件系统路径有关,至于(auth)``(main)这种其实是一样的目录,只是为了方便组织文件,做的路由分组

新建登录页app/(auth)/login.tsx

tsx 复制代码
import { useLocalSearchParams, useRouter } from "expo-router";
import { useState } from "react";
import { Pressable, Text, View } from "react-native";

import { useAuth } from "../../context/auth";

export default function Login() {
  const router = useRouter();
  const params = useLocalSearchParams();

  const [email, setEmail] = useState("1@qq.com");

  const { signIn } = useAuth();

  const onLogin = async () => {
    signIn({ email });
    router.back();
  };

  return (
    <View>
      <Pressable onPress={onLogin}>
        <Text>Login</Text>
      </Pressable>
    </View>
  );
}

tabs导航栏页面,我们先新建app/(main)/(tabs)/cart.tsx, app/(main)/(tabs)/category.tsx,app/(main)/(tabs)/profile.tsx,app/(main)/(tabs)/index.tsx 并且都填入类似的初始化代码:

tsx 复制代码
import { View, Text } from "react-native";

export default function Profile() {
  return (
    <View>
      <Text>Profile screen</Text>
    </View>
  );
}

因为我们目前只是组织项目结构,所以不急于写代码

然后我们修改app/(main)/(tabs)/_layout.tsx

tsx 复制代码
import { FontAwesome } from "@expo/vector-icons";
import { Tabs } from "expo-router";

export default function Layout() {
 return (
   <Tabs
     screenOptions={{
       tabBarActiveTintColor: "#05bfdb",
     }}>
     <Tabs.Screen
       name="index"
       options={{
         title: "feed",
         tabBarIcon: ({ color }) => <FontAwesome name="home" size={24} color={color} />,
       }}
     />
     <Tabs.Screen
       name="category"
       options={{
         tabBarIcon: ({ color }) => <FontAwesome name="search" size={24} color={color} />,
       }}
     />
     <Tabs.Screen
       name="cart"
       options={{
         tabBarIcon: ({ color }) => <FontAwesome name="bell" size={24} color={color} />,
       }}
     />
     <Tabs.Screen
       name="profile"
       options={{
         tabBarIcon: ({ color }) => <FontAwesome name="user" size={24} color={color} />,
       }}
     />
   </Tabs>
 );
}

囊括每一个tab的screen,注意这里需要安装@expo/vector-icons依赖:

shell 复制代码
npx expo install @expo/vector-icons

好了 现在打开页面效果如下:

代码地址:github.com/liyunfu1998...

相关推荐
泯泷19 分钟前
手搓JSVM第 9 篇:闭包:函数如何记住外部变量
前端·javascript·前端框架
晴天1636 分钟前
前端 SSR、BFF 原理介绍
前端·javascript·网络·html
全栈技术负责人1 小时前
AI 效能工具建设:Agent 可观测性技能技术方案与实践
前端·ai·ai编程
梦想平凡1 小时前
百游棋牌源代码开发搭建教程(一):全端工程结构、开发环境配置与首次启动验证
前端·javascript·源代码管理
妙码生花2 小时前
两个月 59 篇 AI 开发日志 + Golang 商业级实战项目收工后,得来的 AI 使用心法-上
前端·后端·gin
vx-Biye_Design2 小时前
springboot中国传统节日宣传平台49078-计算机课程设计、毕业设计
java·前端·vue.js·spring boot·后端·课程设计·idea
妙码生花2 小时前
两个月 59 篇 AI 开发日志 + Golang 商业级实战项目收工后,得来的 AI 使用心法-下
前端·后端·go
Highcharts2 小时前
常见报错排雷指南3:兼容性问题的官方解法
javascript·数据可视化
5335ld2 小时前
app版本更新(vue3+unibest+静默更新+强制更新)
开发语言·javascript·ecmascript
Cho1yon3 小时前
【AI Agent 第十五期: AI Agent 从 0 到 1 系统学习大纲】
javascript·人工智能·学习