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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

工具和库

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

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

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

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

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

设置主题

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

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

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 (          {children}      );}

我使用这个新创建的 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 (          {children}      );}

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

我如何为我的 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 (    {children}  );}

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

export default function app() {  return (                );}

现在我的整个应用程序都可以访问 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 中,我只需检查用户设置并切换主题,如下所示:

import {useColorScheme} from 'react-native';

export default function ThemeProvider({children}: PropsWithChildren) {
const isDarkMode = useColorScheme() === 'dark';
return (
{children}
);
}

结论

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

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

以上就是我如何为我的 React Native 项目设置设计系统以加快开发速度的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1492160.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月19日 14:34:25
下一篇 2025年12月19日 14:34:42

相关推荐

  • 提升我的 Web 开发技能:HNG 实习和前端技术的迷人世界

    开始新事物的兴奋感永远不会消失,尤其是当它涉及到像 HNG 实习这样的强化项目时 [https://hng.tech/internship 和 https://hng.tech/premium]。这就像再次参加编码训练营,但这一次有令人兴奋的机会来突破我的极限并加快学习速度。 HNG 实习中真正令我…

    2025年12月24日
    000
  • 深入理解 Express.js 中间件与 next 函数:构建高效请求处理流程

    本文深入探讨 Express.js 中间件的核心机制,重点解析 next 函数在请求处理流程中的关键作用。通过实际代码示例,我们将学习如何构建自定义中间件进行身份验证、如何利用 next 函数控制请求流向、在中间件之间传递数据,以及串联多个中间件以实现模块化和可维护的服务器端应用。掌握 next 函…

    2025年12月20日
    200
  • 测试自动化工具:综合指南

    在当今快节奏的软件开发领域,高效的测试至关重要。测试自动化工具应运而生,它们能够显著提升测试效率,缩短交付周期,并最终确保软件质量。本文将深入探讨测试自动化工具的方方面面,包括其定义、核心功能、常用工具及选择策略。 什么是测试自动化工具? 测试自动化工具是用于自动执行测试用例的软件应用程序,旨在减少…

    2025年12月19日
    000
  • 开发人员如何使电动汽车充电器能够与移动应用程序通信

    在电动汽车 (ev) 世界中,电动汽车驾驶员最神奇的体验之一就是在移动应用程序上点击“开始”并看到充电器开始工作。 但是这个魔法是如何发生的呢? 让我们深入了解电动汽车充电器和移动应用程序如何通信的幕后旅程。 游戏中的玩家 移动应用程序:这是用户发起操作的地方,例如开始或停止充电会话。后端服务器:操…

    2025年12月19日 好文分享
    000
  • 如何在 5 年内成为一名 Javascript 开发人员

    在 2025 年成为一名 javascript 开发人员需要掌握该语言、跟上不断发展的趋势以及构建现实世界的经验。这是分步指南: 第 1 步:学习基础知识了解编程基础知识:从变量、数据类型、循环、函数和数组等核心概念开始。学习 JavaScript 基础知识:专注于 ES6 功能(例如箭头函数、模板…

    好文分享 2025年12月19日
    000
  • 云通话

    将您的商务电话系统迁移到云端是一项战略举措,可以带来众多好处。传统电话系统成本高昂、不灵活且难以维护。通过切换到基于云的解决方案,企业可以节省成本、提高灵活性并提高效率。 云电话系统最显着的优势之一就是成本效益。与需要昂贵的硬件和维护的传统系统不同,基于云的解决方案以订阅模式运行。这意味着企业只需支…

    好文分享 2025年12月19日
    000
  • 了解 Protocol Buffers:JSON 的快速替代方案

    在数据交换领域,json(javascript 对象表示法)一直是人们的最爱。它简单、易读,并且可以跨平台无缝运行。对于许多用例来说,json 已经“足够好”。但随着系统规模的扩大以及对速度和效率的需求的增加,json 基于文本的格式可能会成为瓶颈。 这就是 protocol buffers (pr…

    2025年12月19日
    000
  • JavaScript:学习编码基础知识

    javascript 是一种强大且多功能的编程语言,对于现代 web 开发至关重要。它最初是为了使网页具有交互性而设计的,现在已经发展成为与 html 和 css 并列的 web 核心组件。如今,javascript 不仅运行在浏览器中,还运行在服务器、移动设备甚至机器人上。 1。什么是 JavaS…

    2025年12月19日 好文分享
    000
  • 探索 Nodejs 性能提升和令人兴奋的新功能

    Web 开发世界在不断发展,而 Node.js 早于这个快速变化的领域。作为当今 Web 应用程序的核心技术之一,Node.js 随着每次新的更新而进步,Node.js 22 尤其引人注目,因为它带来了每个开发人员都渴望发现的许多强大的新功能和增强功能。这些更新为每个企业带来了突破性的功能,旨在实现…

    2025年12月19日
    000
  • 如何使用计算器:完整指南

    计算器是日常生活和数学、科学、工程和金融等各个知识领域的必备工具。随着技术的发展,计算器已经从简单的手持设备发展成为复杂的数字应用程序。下面,我们从基本模型到最高级的模型,解释如何正确使用计算器。 1. 了解计算器的类型 计算器有很多种类型,每种计算器根据其特点都有特定的功能。以下是最常见的类型: …

    2025年12月19日
    000
  • 渐进式 Web 应用程序:现代 Web 开发的终极指南

    渐进式 Web 应用程序:概述渐进式 Web 应用程序是可以使用离线缓存安装的独立应用程序。它们可以安装在单个代码库上的所有设备上,为您提供类似本机的体验。它们于 2016 年推出,是作为特定于设备的应用程序的替代方案而构建的,但现在可以在一系列不同的系统上使用,包括桌面和移动设备。开发渐进式 We…

    2025年12月19日
    000
  • TypeScript 与 JavaScript:哪一个更好?

    随着对现代 Web 应用程序的需求不断增长,开发人员经常发现自己在项目中在 TypeScript 和 JavaScript 之间争论。虽然两者都是前端和后端开发不可或缺的一部分,但它们的用途略有不同。但您如何决定使用哪一个呢?本博客探讨了 TypeScript 和 JavaScript 的主要区别、…

    2025年12月19日
    000
  • Choosing Your Tech Stack: A Developer&#s Journey

    当我第一次踏上编码之旅时,我对可用的编程语言和技术堆栈的数量感到不知所措。感觉就像走进一个广阔的图书馆,每本书都承诺一次不同的冒险,但我不知道从哪里开始。 最初的困惑 作为编码世界的新手,我对不同语言的潜力、各种技术堆栈以及与不同编码相关工作相关的职责知之甚少。我记得我盯着 JavaScript、P…

    2025年12月19日
    000
  • A Comprehensive Guide to QA Testing: Ensuring Software Quality

    质量保证 (QA) 测试是软件开发生命周期的关键部分,确保产品满足功能、可靠性和用户满意度的最高标准。随着技术进步的快速发展和用户期望的不断增长,QA 测试对于提供强大且高性能的软件应用程序已变得不可或缺。本文详细探讨了 QA 测试,涵盖其重要性、类型、策略、工具和最佳实践。 什么是 QA 测试?Q…

    2025年12月19日
    000
  • 精通网络和移动设备的全栈软件工程师(联合创始人潜力)

    英国公司注:这纯粹是为了股权,因为这还处于早期阶段,没有收入或投资。这是您参与大事的机会!! 我正在开发一家令人兴奋的新健身科技初创公司,专注于为健身房及其会员提供独特的价值。我们的平台旨在彻底改变健身体验,在健身房与其用户之间建立更牢固的联系。我已经用我的编码知识构建了该平台的基础,但现在我正在寻…

    2025年12月19日
    000
  • 如何获取 Canara Hsbc 收据 下载

    如何下载您的 Canara HSBC Premium 付款收据 如果您需要一份 Canara HSBC 人寿保险保费付款收据副本,这比您想象的要容易。收据确认您的保费支付,对于跟踪保单更新、管理税收优惠以及为未来索赔提供文件至关重要。这是下载收据的完整指南。 1. 网上门户方法 获取收据的最快方法之…

    2025年12月19日
    000
  • QA 自动化综合指南:简化质量保证,实现更快、更可靠的软件发布

    质量保证 (QA) 自动化已成为软件开发生命周期中的关键组成部分,使团队能够以更快的速度交付高质量的应用程序。随着软件复杂性的不断增加以及对更短发布周期的需求,手动测试往往无法满足要求。 QA 自动化通过自动化重复测试任务、提高准确性和缩短上市时间来帮助克服这些限制。本文将探讨 QA 自动化的基础知…

    2025年12月19日
    000
  • 单页应用程序 (SPA) 如何提高访客到客户的转化率

    单页应用程序 (SPA) 通过提供更流畅、响应更灵敏的用户体验,改变了 Web 开发,这在当今快节奏的数字环境中至关重要。随着企业越来越多地寻求在线平台来推动参与度和销售,SPA 的采用可以改变游戏规则,将网站访问者转化为客户。 SPA 简化导航、提高性能并增强用户参与度——所有这些都是提高客户满意…

    2025年12月19日
    000
  • 使用 React Native 探索 Android 应用程序中的高级 UI/UX 设计

    随着移动应用程序已发展成为个人和专业任务的重要工具,用户对视觉吸引力、无缝体验的期望急剧上升。 React Native 是一种用于构建跨平台应用程序的流行框架,它使得为 Android 和 iOS 创建功能强大、引人入胜的应用程序成为可能。虽然其跨平台功能是一个显着优势,但为 Android 设计…

    2025年12月19日
    000
  • js如何配置环境

    要设置 JavaScript 环境,需根据环境类型进行配置。浏览器环境中,通过 HTML 标签加载 JavaScript 文件并确保代码符合浏览器规则。在 Node.js 环境中,需安装 Node.js,创建 JavaScript 文件,并使用命令行工具运行它。对于其他环境,配置过程根据使用的框架或…

    2025年12月19日
    000

发表回复

登录后才能评论
关注微信