Home >Web Front-end >JS Tutorial >Setting Up Expo with Styled Components and TypeScript
This guide walks you through setting up an Expo project using styled-components and TypeScript. The project supports a theme system, dark mode, and type-safe UI components, making it a robust foundation for modern React Native applications.
Code
Run the following command to initialize a new Expo project:
npx create-expo-app styled-setup --template # Choose template: ➟ Blank (TypeScript)
Install the required dependencies for styled-components:
# Install styled-components npm install styled-components # Install type definitions for styled-components npm install @types/styled-components-react-native --save-dev
Organize your project with the following structure:
├── app/ # Expo Router app directory │ ├── (tabs)/ # Tab navigation │ │ ├── index.tsx # First tab screen │ │ ├── two.tsx # Second tab screen │ │ └── _layout.tsx # Tab layout configuration │ ├── _layout.tsx # Root layout │ ├── modal.tsx # Modal screen │ └── +not-found.tsx # 404 screen ├── components/ │ ├── ui/ # UI components │ │ ├── button/ │ │ ├── container/ │ │ ├── text/ │ │ └── layout/ │ └── ExternalLink.tsx ├── themes/ # Theme configuration │ ├── colors.ts # Color definitions │ ├── sizes.ts # Size scales │ ├── spacing.ts # Spacing system │ ├── styles.ts # Common styles │ ├── theme.d.ts # Theme type definitions │ └── index.ts # Theme export └── hooks/ # Custom hooks └── useColors.ts # Theme colors hook
The Button component is a flexible, styled button supporting variants, sizes, and loading states.
import Button from "@/components/ui/button"; // Usage <Button variant="primary" size="lg" shape="rounded" loading={false}> Click Me </Button>;
Props:
The Flex and FlexItem components offer a flexible layout system inspired by CSS flexbox.
import { Flex, FlexItem } from "@/components/ui/layout"; // Usage <Flex direction="row" justify="space-between" align="center" gap="md"> <FlexItem grow={1}> <Text>Content</Text> </FlexItem> </Flex>;
Props:
Define a consistent color palette in themes/colors.ts:
const colors = { primary: "#3b82f6", secondary: "#22c55e", success: "#16a34a", error: "#dc2626", warning: "#f59e0b", info: "#0ea5e9", // Additional colors... };
Standardize spacing in themes/spacing.ts:
const spacing = { padding: { xs: 4, sm: 8, md: 16, lg: 24, xl: 32, }, // Margin and gap definitions... };
Define font sizes in themes/styles.ts:
const fontSizes = { xs: 8, sm: 12, base: 14, md: 16, lg: 20, xl: 24, // Additional sizes... };
The app adapts to system dark mode preferences dynamically:
npx create-expo-app styled-setup --template # Choose template: ➟ Blank (TypeScript)
Ensure theme type safety with themes/theme.d.ts:
# Install styled-components npm install styled-components # Install type definitions for styled-components npm install @types/styled-components-react-native --save-dev
Define props for the Button component:
├── app/ # Expo Router app directory │ ├── (tabs)/ # Tab navigation │ │ ├── index.tsx # First tab screen │ │ ├── two.tsx # Second tab screen │ │ └── _layout.tsx # Tab layout configuration │ ├── _layout.tsx # Root layout │ ├── modal.tsx # Modal screen │ └── +not-found.tsx # 404 screen ├── components/ │ ├── ui/ # UI components │ │ ├── button/ │ │ ├── container/ │ │ ├── text/ │ │ └── layout/ │ └── ExternalLink.tsx ├── themes/ # Theme configuration │ ├── colors.ts # Color definitions │ ├── sizes.ts # Size scales │ ├── spacing.ts # Spacing system │ ├── styles.ts # Common styles │ ├── theme.d.ts # Theme type definitions │ └── index.ts # Theme export └── hooks/ # Custom hooks └── useColors.ts # Theme colors hook
This guide provides a comprehensive setup for using styled-components with Expo and TypeScript. With a robust theme system, dark mode support, and type-safe components, this foundation ensures a scalable and maintainable codebase. Customize and extend this setup to meet your project’s unique requirements.
Have questions or feedback? Drop a comment or reach out! ?
The above is the detailed content of Setting Up Expo with Styled Components and TypeScript. For more information, please follow other related articles on the PHP Chinese website!