0

0

我如何为我的 React Native 项目设置设计系统以加快开发速度

DDD

DDD

发布时间:2024-10-07 18:39:31

|

621人浏览过

|

来源于dev.to

转载

曾经构建过您不想自己使用的应用程序吗?

当我还是一名初级应用程序开发人员时,我曾经构建混乱的用户界面。

有时,当看到这些 ui 时,我曾经想“世界上谁会想使用这个?它看起来很糟糕”。

其他时候,只是有些“不对劲的地方”我无法指出。

虽然我曾经从设计团队那里获得过令人惊叹的精美设计,但我的应用程序看起来连 20% 都没有那么好。

我意识到了这个问题,为了解决这个问题,我深入研究了这个问题,其中我发现了一个设计系统的概念,它改变了我构建应用程序的方式。

设计系统这个神奇的东西是什么?

理解设计系统是什么至关重要,这样才能理解我们为什么需要它。

设计系统基本上是您和您的团队设计决策的集中事实来源。它告诉您要使用什么颜色以及在哪里使用?该应用程序将有多少种类型的按钮?您列表中的卡片会有阴影吗?所有的答案都来自于设计系统。

以下是拥有设计系统的一些好处:

  • 一致的用户界面:您的界面不会无缘无故地到处都有那些奇怪的间隙。它在所有设备上的外观和感觉都是统一的。

  • 快速决策:设计系统强制执行一组特定的约束,使您的决策更容易,而不是更困难。你拥有的选择越多,你遇到的分析瘫痪就越多。

  • 可扩展的应用程序:随着应用程序的增长,设计系统有助于重用组件,而不是从头开始构建。

  • 专注于开发:您不再需要强调按钮应该是绿色还是蓝色。相反,您将专注于重要的事情。

工具和库

虽然有大量的 react native ui 库,但我使用自定义方法,因为我在其中大多数库的性能和错误方面都有过可怕的经历。

我的方法唯一依赖的库是react-native-size-matters。

现在,在您尖叫“尺寸并不重要!”之前,让我向您保证,尺寸确实重要。尤其是在移动应用程序方面。

您不希望用户打开您的应用程序,看到一个覆盖所有内容的巨大徽标,然后在删除之前思考“丑陋的是什么......”,甚至不尝试就删除,因为您的徽标隐藏了按钮。

这就是react-native-size-matters 可以发挥作用的地方。它通过缩放组件以适应设备来使您的应用程序具有响应能力。因此,无论用户使用哪种设备,您的徽标都会准确地保留在您放置的位置。

设置主题

我定义的第一件事就是我的核心设计标记。这些是我的设计系统的构建模块。其中包括调色板、版式、间距和字体大小。

我通过使用以下代码创建 theme.ts 文件来实现此目的:

Magic AI Avatars
Magic AI Avatars

神奇的AI头像,获得200多个由AI制作的自定义头像。

下载

import {moderatescale} from 'react-native-size-matters';

// after installing custom fonts:
export const fontfamily = {
  bold: 'poppins-bold',
  semibold: 'poppins-semibold',
  medium: 'poppins-medium',
  regular: 'poppins-regular',
  thin: 'poppins-thin',
};

const colors = {
  primary100: '#2e2c5f',
  primary80: '#524da0',
  primary60: '#736ddf',
  primary40: '#a09bff',
  primary20: '#dcdaff',

  secondary100: '#484a22',
  secondary80: '#858945',
  secondary60: '#d9df6d',
  secondary40: '#f8fca1',
  secondary20: '#fdffd4',

  neutral100: '#131218',
  neutral90: '#1d1c25',
  neutral80: '#272631',
  neutral70: '#343341',
  neutral60: '#3e3d4d',
  neutral50: '#53526a',
  neutral40: '#757494',
  neutral30: '#9c9ac1',
  neutral20: '#cbc9ef',
  neutral10: '#e8e7ff',
  white: '#fff',
  black: '#222',

  error: '#e7002a',
  success: '#3ec55f',
  warning: '#fecb2f',
  info: '#157efb',
};

const theme = {
  colors,
  fontsizes: {
    xxl: moderatescale(32),
    xl: moderatescale(28),
    lg: moderatescale(24),
    md: moderatescale(20),
    body: moderatescale(17),
    sm: moderatescale(14),
    xs: moderatescale(12),
    xxs: moderatescale(10),
    xxxs: moderatescale(8),
  },
  spacing: {
    none: 0,
    xxs: moderatescale(4),
    xs: moderatescale(8),
    md: moderatescale(12),
    lg: moderatescale(16),
    xl: moderatescale(20),
    xxl: moderatescale(24),
    xxxl: moderatescale(28),
  },
};

export default theme;


创建可重用组件

一旦我的设计令牌就位,我就会定义一些可重用的组件,例如 box、typography 和 input。这些组件遵循设计令牌,确保整个应用程序的一致性。

例如,这是我创建 box 组件的方法:


import {
  view,
  type viewprops,
  type flexaligntype,
  type viewstyle,
} from 'react-native';
import theme from '../styles/theme/theme';

export interface ibox extends viewprops {
  backgroundcolor?: keyof typeof theme.colors;
  p?: keyof typeof theme.spacing;
  pv?: keyof typeof theme.spacing;
  ph?: keyof typeof theme.spacing;
  pt?: keyof typeof theme.spacing;
  pb?: keyof typeof theme.spacing;
  pl?: keyof typeof theme.spacing;
  pr?: keyof typeof theme.spacing;
  m?: keyof typeof theme.spacing;
  mv?: keyof typeof theme.spacing;
  mh?: keyof typeof theme.spacing;
  mt?: keyof typeof theme.spacing;
  mb?: keyof typeof theme.spacing;
  ml?: keyof typeof theme.spacing;
  mr?: keyof typeof theme.spacing;
  gap?: number;
  flex?: number;
  flexdirection?: 'row' | 'column' | 'row-reverse' | 'column-reverse';
  alignitems?: flexaligntype;
  justifycontent?:
    | 'center'
    | 'flex-start'
    | 'flex-end'
    | 'space-between'
    | 'space-around'
    | 'space-evenly';
  rounded?: boolean;
}

export default function box({
  backgroundcolor,
  p,
  pv,
  ph,
  pt,
  pb,
  pr,
  pl,
  m,
  mv,
  mh,
  mt,
  mb,
  ml,
  mr,
  children,
  style,
  flex,
  alignitems,
  justifycontent,
  flexdirection = 'column',
  rounded = false,
  gap = undefined,
  ...rest
}: ibox) {
  const getmargin = () => {
    const obj: any = {};

    if (m) {
      obj.margin = theme.spacing[m];
      return obj;
    }
    if (mt) obj.margintop = mt ? theme.spacing[mt] : 0;
    if (mb) obj.marginbottom = mb ? theme.spacing[mb] : 0;
    if (ml) obj.marginleft = ml ? theme.spacing[ml] : 0;
    if (mr) obj.marginright = mr ? theme.spacing[mr] : 0;
    if (mv) obj.marginvertical = theme.spacing[mv];
    if (mh) obj.marginhorizontal = theme.spacing[mh];
    return obj;
  };

  const getpadding = () => {
    const obj: any = {};

    if (p) {
      obj.padding = theme.spacing[p];
      return obj;
    }

    if (pt) obj.paddingtop = pt ? theme.spacing[pt] : 0;
    if (pb) obj.paddingbottom = pb ? theme.spacing[pb] : 0;
    if (pl) obj.paddingleft = pl ? theme.spacing[pl] : 0;
    if (pr) obj.paddingright = pr ? theme.spacing[pr] : 0;
    if (pv) obj.paddingvertical = theme.spacing[pv];
    if (ph) obj.paddinghorizontal = theme.spacing[ph];

    return obj;
  };

  const boxstyles: viewstyle[] = [
    {
      backgroundcolor: backgroundcolor
        ? theme.colors[backgroundcolor]
        : undefined,
      flex,
      justifycontent,
      alignitems,
      flexdirection,
      borderradius: rounded ? 10 : 0,
      gap,
    },
    getmargin(),
    getpadding(),
    style,
  ];

  return (
    <view style={boxstyles} {...rest}>
      {children}
    </view>
  );
}


我使用这个新创建的 box 组件来替代 view。它允许我通过 props 快速设计它的样式(如果您使用打字稿,则提供建议),如下所示:

我如何为我的 React Native 项目设置设计系统以加快开发速度

这是我如何创建 typography 组件的示例,我使用它来代替 react native 的 text 组件:


import react from 'react';
import {text, type textprops} from 'react-native';
import theme, {fontfamily} from '../styles/theme/theme';

export interface itypography extends textprops {
  size?: keyof typeof theme.fontsizes;
  color?: keyof typeof theme.colors;
  textalign?: 'center' | 'auto' | 'left' | 'right' | 'justify';
  variant?: keyof typeof fontfamily;
}

export default function typography({
  size,
  color,
  textalign,
  children,
  style,
  variant,
  ...rest
}: itypography) {
  return (
    <text
      {...rest}
      style={[
        {
          color: color ? theme.colors[color] : theme.colors.white,
          textalign,
          fontsize: size ? theme.fontsizes[size] : theme.fontsizes.body,
          fontfamily: variant ? fontfamily[variant] : fontfamily.regular,
        },
        style,
      ]}>
      {children}
    </text>
  );
}


以下是我向自定义排版组件添加样式的速度的预览:

我如何为我的 React Native 项目设置设计系统以加快开发速度

自定义使用主题挂钩

我没有一次又一次地导入主题,而是通过创建一个自定义的 usetheme 挂钩来使代码更具可读性,我在应用程序中的任何位置调用该挂钩来添加符合我的主题的样式。

为了做到这一点,我利用 react 的 context api 在应用程序中传递我的主题。

我创建了一个 themeprovider.tsx 文件,并在内部定义了 themecontext 和 themeprovider 以将我的应用程序组件包装在其中。代码如下:


import react, {type propswithchildren, createcontext} from 'react';
import theme from './theme';

export const themecontext = createcontext(theme);

export default function themeprovider({children}: propswithchildren) {
  return (
    <themecontext.provider value={theme}>{children}</themecontext.provider>
  );
}


然后,在我的应用程序组件内:


export default function app() {
  return (
    <themeprovider>
      <appnavigation />
    </themeprovider>
  );
}


现在我的整个应用程序都可以访问 themecontext,我创建了 usetheme 挂钩:


import {usecontext} from 'react';
import {themecontext} from '../styles/theme/themeprovider';

export default function usetheme() {
  const theme = usecontext(themecontext);
  return theme;
}


现在我可以通过调用 usetheme 挂钩在任何地方访问我的主题,如下所示:


const theme = usetheme();
// example usage:
theme.colors.primary100;
theme.spacing.md;
theme.fontsizes.lg;


深色模式

为了实现深色模式,在 theme.ts 文件中,我添加了另一个包含深色模式颜色的调色板。


export const darktheme = {
  // define dark mode colors here keeping the keys same as the light mode only changing the values.
}


然后,在 themeprovider 中,我只需检查用户设置并切换主题,如下所示:


<p>import {useColorScheme} from 'react-native';</p>

<p>export default function ThemeProvider({children}: PropsWithChildren) {<br>
const isDarkMode = useColorScheme() === 'dark';<br>
  return (<br>
    <ThemeContext.Provider value={isDarkMode ? darkTheme : theme}>{children}</ThemeContext.Provider><br>
  );<br>
}</p>




结论

遵循这种清晰的结构化方法为我的应用带来了急需的清晰度、一致性和美观性,同时也将我的开发速度加快了至少 10 倍,因为我不再需要纠结于设计决策。

我鼓励您尝试这种方法,并在评论中让我知道你们的想法。也许稍微改进一下吧?

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
点击input框没有光标怎么办
点击input框没有光标怎么办

点击input框没有光标的解决办法:1、确认输入框焦点;2、清除浏览器缓存;3、更新浏览器;4、使用JavaScript;5、检查硬件设备;6、检查输入框属性;7、调试JavaScript代码;8、检查页面其他元素;9、考虑浏览器兼容性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

197

2023.11.24

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

76

2026.03.11

Go高并发任务调度与Goroutine池化实践
Go高并发任务调度与Goroutine池化实践

本专题围绕 Go 语言在高并发任务处理场景中的实践展开,系统讲解 Goroutine 调度模型、Channel 通信机制以及并发控制策略。内容包括任务队列设计、Goroutine 池化管理、资源限制控制以及并发任务的性能优化方法。通过实际案例演示,帮助开发者构建稳定高效的 Go 并发任务处理系统,提高系统在高负载环境下的处理能力与稳定性。

38

2026.03.10

Kotlin Android模块化架构与组件化开发实践
Kotlin Android模块化架构与组件化开发实践

本专题围绕 Kotlin 在 Android 应用开发中的架构实践展开,重点讲解模块化设计与组件化开发的实现思路。内容包括项目模块拆分策略、公共组件封装、依赖管理优化、路由通信机制以及大型项目的工程化管理方法。通过真实项目案例分析,帮助开发者构建结构清晰、易扩展且维护成本低的 Android 应用架构体系,提升团队协作效率与项目迭代速度。

83

2026.03.09

JavaScript浏览器渲染机制与前端性能优化实践
JavaScript浏览器渲染机制与前端性能优化实践

本专题围绕 JavaScript 在浏览器中的执行与渲染机制展开,系统讲解 DOM 构建、CSSOM 解析、重排与重绘原理,以及关键渲染路径优化方法。内容涵盖事件循环机制、异步任务调度、资源加载优化、代码拆分与懒加载等性能优化策略。通过真实前端项目案例,帮助开发者理解浏览器底层工作原理,并掌握提升网页加载速度与交互体验的实用技巧。

97

2026.03.06

Rust内存安全机制与所有权模型深度实践
Rust内存安全机制与所有权模型深度实践

本专题围绕 Rust 语言核心特性展开,深入讲解所有权机制、借用规则、生命周期管理以及智能指针等关键概念。通过系统级开发案例,分析内存安全保障原理与零成本抽象优势,并结合并发场景讲解 Send 与 Sync 特性实现机制。帮助开发者真正理解 Rust 的设计哲学,掌握在高性能与安全性并重场景中的工程实践能力。

223

2026.03.05

PHP高性能API设计与Laravel服务架构实践
PHP高性能API设计与Laravel服务架构实践

本专题围绕 PHP 在现代 Web 后端开发中的高性能实践展开,重点讲解基于 Laravel 框架构建可扩展 API 服务的核心方法。内容涵盖路由与中间件机制、服务容器与依赖注入、接口版本管理、缓存策略设计以及队列异步处理方案。同时结合高并发场景,深入分析性能瓶颈定位与优化思路,帮助开发者构建稳定、高效、易维护的 PHP 后端服务体系。

458

2026.03.04

AI安装教程大全
AI安装教程大全

2026最全AI工具安装教程专题:包含各版本AI绘图、AI视频、智能办公软件的本地化部署手册。全篇零基础友好,附带最新模型下载地址、一键安装脚本及常见报错修复方案。每日更新,收藏这一篇就够了,让AI安装不再报错!

169

2026.03.04

Swift iOS架构设计与MVVM模式实战
Swift iOS架构设计与MVVM模式实战

本专题聚焦 Swift 在 iOS 应用架构设计中的实践,系统讲解 MVVM 模式的核心思想、数据绑定机制、模块拆分策略以及组件化开发方法。内容涵盖网络层封装、状态管理、依赖注入与性能优化技巧。通过完整项目案例,帮助开发者构建结构清晰、可维护性强的 iOS 应用架构体系。

246

2026.03.03

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Javascript趣味课堂
Javascript趣味课堂

共49课时 | 11.3万人学习

ionic中文教程
ionic中文教程

共37课时 | 22.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号