如何设计React应用程序的样式——比较不同的选项

146 阅读14分钟

样式在创建具有视觉吸引力和用户友好的 Web 应用程序方面起着至关重要的作用。对于 React 应用程序,可以通过多种方式来设置组件和 UI 元素的样式。

在本文中,我们将探讨几个流行的选项,包括纯 CSS、CSS 模块、CSS 预处理器、Tailwind CSS、CSS-in-JS 库(如 Styled Components)以及预构建组件库(如 Chakra UI、Material-UI 和 Bootstrap) .

我们将深入研究每个选项的主要特征、优点和缺点,以帮助您为 React 项目选择正确的样式方法。

(更多优质教程:java567.com,搜索"react")

目录

您将学习如何使用以下方法来设计您的 React 应用程序的样式:

  • 纯CSS
  • CSS 模块
  • CSS 预处理器
  • 顺风 CSS
  • CSS-in-JS
  • 组件库
  • 结论

如何使用纯 CSS 设计你的 React 应用程序的样式

纯 CSS 涉及使用标准 CSS 语法编写样式表并将它们链接到您的 React 组件。

这种方法简单且得到广泛支持,使其成为小型项目的绝佳选择。但随着应用程序的增长,管理和扩展可能变得具有挑战性。

优点:

  • 熟悉:具有 CSS 专业知识的开发人员可以快速适应这种方法。
  • 浏览器支持:所有现代浏览器都支持纯 CSS。
  • 轻量级: CSS 文件可以被浏览器缓存,从而加快页面加载时间。

缺点:

  • 全局范围: CSS 中定义的样式默认是全局的,这会导致命名冲突和样式泄漏。
  • 有限的可重用性:跨组件重用样式需要手动维护类名和选择器。

例子:

 import React from 'react';
 import './MyComponent.css';
 ​
 const MyComponent = () => {
   return (
     <div className="my-component">
       <h1 className="title">Hello, World!</h1>
       <p className="description">This is a styled React component.</p>
       <button className="btn">Click Me</button>
     </div>
   );
 };
 ​
 export default MyComponent;

在此示例中,我们有一个名为 的组件MyComponent。要使用纯 CSS 应用样式,我们导入一个名为MyComponent.css. CSS 文件可能如下所示:

 .my-component {
   background-color: #f2f2f2;
   padding: 20px;
   border-radius: 5px;
   text-align: center;
 }
 ​
 .title {
   font-size: 24px;
   color: #333;
   margin-bottom: 10px;
 }
 ​
 .description {
   font-size: 16px;
   color: #777;
 }
 ​
 .btn {
   background-color: #007bff;
   color: #fff;
   border: none;
   padding: 10px 20px;
   border-radius: 4px;
   cursor: pointer;
   transition: background-color 0.3s ease;
 }
 ​
 .btn:hover {
   background-color: #0056b3;
 }

在这个 CSS 文件中,我们为组件中使用的不同类定义了样式。类my-component样式容器 div,类title样式标题,类description样式段落,btn类样式按钮。

呈现时MyComponent,它将应用定义的样式。容器 div 将具有带填充和边框半径的浅灰色背景。标题将具有较大的字体大小和深灰色,而段落将具有较小的字体大小和浅灰色。该按钮将具有蓝色背景和白色文本,并且在悬停时会过渡为深蓝色。

请记住正确导入 CSS 文件,确保路径根据您的项目结构准确无误。

如何使用 CSS 模块设计你的 React 应用程序

CSS 模块旨在解决纯 CSS 的全局范围和可重用性问题。它们允许您编写模块化样式表,其中类名称的范围限定为特定组件。

优点:

  • Scoped Styles: CSS 模块为每个组件生成唯一的类名,避免样式冲突。
  • 可重用性: CSS 模块中定义的样式可以轻松地跨组件重用。
  • 清除依赖关系:样式表被导入并直接链接到使用它们的组件。

缺点:

  • 学习曲线:开发人员必须学习和理解 CSS 模块语法和导入机制。
  • 附加配置:将 CSS 模块集成到 React 项目中通常需要额外的配置设置。

例子

 import React from 'react';
 import styles from './MyComponent.module.css';
 ​
 const MyComponent = () => {
   return (
     <div className={styles.myComponent}>
       <h1 className={styles.title}>Hello, World!</h1>
       <p className={styles.description}>This is a styled React component.</p>
       <button className={styles.btn}>Click Me</button>
     </div>
   );
 };
 ​
 export default MyComponent;

在本例中,我们导入了一个外部 CSS 模块文件 calledMyComponent.module.css并将其分配给styles对象。该styles对象包含 CSS 类名到特定于组件的唯一生成类名的映射。

CSS 模块文件可能如下所示:

 .myComponent {
   background-color: #f2f2f2;
   padding: 20px;
   border-radius: 5px;
   text-align: center;
 }
 ​
 .title {
   font-size: 24px;
   color: #333;
   margin-bottom: 10px;
 }
 ​
 .description {
   font-size: 16px;
   color: #777;
 }
 ​
 .btn {
   background-color: #007bff;
   color: #fff;
   border: none;
   padding: 10px 20px;
   border-radius: 4px;
   cursor: pointer;
   transition: background-color 0.3s ease;
 }
 ​
 .btn:hover {
   background-color: #0056b3;
 }

在 CSS 模块文件中,您可以像在常规 CSS 中一样定义样式,但您使用的不是全局类名,而是本地类名。这些本地类名称的范围仅限于组件,并具有在构建过程中生成的唯一名称。

呈现 时MyComponent,将使用对象中相应的类名称应用 CSS 模块样式styles。组件的容器 div、标题、段落和按钮将应用各自的样式。

确保使用属性并从组件的 JSX 中的对象className引用 CSS 模块类名称。stylesCSS模块系统会自动将这些类名映射到生成的唯一类名,保证样式封装,防止类名冲突。

请注意,CSS 模块文件应具有.module.css模块的文件扩展名才能正常工作。

如何使用 CSS 预处理器为你的 React 应用程序设计样式

SASS、LESS或Stylus等 CSS 预处理器提供了额外的功能,如变量、嵌套、混合等。它提高了 CSS 代码的生产力和可维护性。

优点:

  • 高级功能: SCSS 引入了简化 CSS 编写和管理的强大功能。
  • 代码可重用性: SCSS 允许使用混入和变量创建可重用的代码片段。
  • 轻松迁移:现有的 CSS 文件可以逐步转换为 SCSS,而无需进行重大重构。

缺点:

  • 编译步骤: SCSS文件需要编译成常规的CSS才能使用。
  • 学习曲线:开发人员必须学习 SCSS 语法及其特定功能。

例子

下面是一个示例,说明如何使用 Sass 来设置 React 组件的样式。npm install node-sass首先,通过运行or确保你的项目中安装了 Sass yarn add node-sass。

 import React from 'react';
 import './MyComponent.scss';
 ​
 const MyComponent = () => {
   return (
     <div className="my-component">
       <h1 className="title">Hello, World!</h1>
       <p className="description">This is a styled React component.</p>
       <button className="btn">Click Me</button>
     </div>
   );
 };
 ​
 export default MyComponent;

在此示例中,我们导入一个名为MyComponent.scss. 确保文件扩展名适用.scss于 Sass 文件。SCSS 文件可能如下所示:

 .my-component {
   background-color: #f2f2f2;
   padding: 20px;
   border-radius: 5px;
   text-align: center;
 ​
   .title {
     font-size: 24px;
     color: #333;
     margin-bottom: 10px;
   }
 ​
   .description {
     font-size: 16px;
     color: #777;
   }
 ​
   .btn {
     background-color: #007bff;
     color: #fff;
     border: none;
     padding: 10px 20px;
     border-radius: 4px;
     cursor: pointer;
     transition: background-color 0.3s ease;
 ​
     &:hover {
       background-color: #0056b3;
     }
   }
 }

如何使用 Tailwind CSS 设计你的 React 应用程序的样式

Tailwind CSS是一个实用程序优先的 CSS 框架,它提供了大量预定义的实用程序类。它促进了整个应用程序的快速开发和一致的样式。

优点:

  • 快速原型制作: Tailwind CSS 提供了广泛的实用程序类集合,可实现快速 UI 开发。
  • 高度可定制:该框架允许通过配置文件进行定制,从而实现量身定制的样式。
  • 一致的样式:通过使用预定义的实用程序类,可以轻松维护样式的一致性。

缺点:

  • 文件大小:包括整个 Tailwind CSS 框架会导致更大的包大小。
  • 类重载:过度依赖实用类可能会导致 HTML 标记臃肿。

例子:

首先,按照官方 Tailwind CSS 文档中的安装指南,确保您的项目中安装了 Tailwind CSS 。

 import React from 'react';
 ​
 const MyComponent = () => {
   return (
     <div className="bg-gray-200 p-4 rounded-lg text-center">
       <h1 className="text-2xl text-gray-800 mb-2">Hello, World!</h1>
       <p className="text-base text-gray-600">This is a styled React component.</p>
       <button className="bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded">
         Click Me
       </button>
     </div>
   );
 };
 ​
 export default MyComponent;

在此示例中,我们不导入任何外部 CSS 或 SCSS 文件。相反,我们直接在组件的 JSX 中使用 Tailwind CSS 实用程序类。实用程序类为组件的各个方面提供了现成的样式。

示例中使用的实用程序类 ( bg-gray-200, p-4, rounded-lg, text-center, , text-2xl, text-gray-800, mb-2, text-base, text-gray-600, bg-blue-500, hover:bg-blue-700, text-white, font-bold, py-2, px-4)rounded定义背景颜色、填充、边框半径、文本对齐方式、文本大小、文本颜色、边距、按钮样式等.

渲染时MyComponent,来自 Tailwind CSS 的各个实用程序类将应用于相应的元素,从而产生所需的样式。

确保您的项目已正确配置为使用 Tailwind CSS,包括导入必要的 Tailwind CSS 样式表和应用所需的构建过程(例如运行npm run build或yarn build生成生产就绪的 CSS 文件)。

Tailwind CSS 提供了广泛的实用程序类,您可以混合搭配它们来为您的 React 组件创建所需的样式。有关可用实用程序类和自定义选项的更多信息,请参阅官方 Tailwind CSS 文档。

如何使用 CSS-in-JS 设计你的 React 应用程序的样式

像Styled Components这样的 CSS-in-JS 库允许开发人员直接在他们的 JavaScript 代码中编写 CSS,从而提供了一种独特的样式化方法。Styled Components 提供了一种在 React 组件中创建可重用和作用域样式的方法。

优点:

  • 基于组件的样式:样式是在组件内编写的,增强了代码组织和可重用性。
  • 动态样式:样式化组件启用基于组件道具或状态的动态样式。
  • Easy Theme Integration:主题可以轻松整合,在整个应用程序中提供一致的样式。

缺点:

  • 构建复杂性: CSS-in-JS 解决方案通常需要额外的构建工具和依赖项。
  • 性能影响:在运行时生成动态样式会影响应用程序的性能。

例子

npm install styled-components首先,通过运行或确保您的项目中安装了 Styled Components 库yarn add styled-components。

 import React from 'react';
 import styled from 'styled-components';
 ​
 const StyledDiv = styled.div`
   background-color: #f2f2f2;
   padding: 20px;
   border-radius: 5px;
   text-align: center;
 `;
 ​
 const StyledTitle = styled.h1`
   font-size: 24px;
   color: #333;
   margin-bottom: 10px;
 `;
 ​
 const StyledDescription = styled.p`
   font-size: 16px;
   color: #777;
 `;
 ​
 const StyledButton = styled.button`
   background-color: #007bff;
   color: #fff;
   border: none;
   padding: 10px 20px;
   border-radius: 4px;
   cursor: pointer;
   transition: background-color 0.3s ease;
 ​
   &:hover {
     background-color: #0056b3;
   }
 `;
 ​
 const MyComponent = () => {
   return (
     <StyledDiv>
       <StyledTitle>Hello, World!</StyledTitle>
       <StyledDescription>This is a styled React component.</StyledDescription>
       <StyledButton>Click Me</StyledButton>
     </StyledDiv>
   );
 };
 ​
 export default MyComponent;

styled在此示例中,我们从库中导入函数styled-components。然后,我们通过将使用所需 HTML 元素调用的结果分配styled给变量 ( StyledDiv, StyledTitle, StyledDescription, StyledButton) 来创建样式组件。

在每个样式组件的反引号 (`) 中,我们定义了特定于该组件的 CSS 规则。

呈现时MyComponent,样式化的组件将用于代替常规的 HTML 元素。在各个样式组件中定义的样式将应用于相应的元素。

Styled Components 允许您直接在 JavaScript 代码中编写 CSS,从而轻松封装样式和创建可重用的组件。您还可以将道具传递给样式化组件,并在您的 CSS 规则中使用它们来创建动态样式。

在您的组件中使用它们之前,请确保styled从styled-components您的样式组件导入函数并定义它们。

请记住在您的项目中安装和配置 Styled Components,然后再使用它们。

如何使用组件库来设计你的 React 应用程序

Chakra UI、Material-UI和Bootstrap等组件库提供预构建和样式化的 React 组件以及随附的样式。这些库提供了一致且有凝聚力的 UI 设计语言。

优点:

  • 快速开发:即用型组件可加快开发过程。
  • 一致的样式:库中的组件遵循统一的设计系统,确保视觉一致性。
  • 广泛的文档:流行的组件库具有文档齐全的 API 和指南。

缺点:

  • 定制限制:虽然这些库提供定制选项,但它们可能无法满足所有设计要求。
  • 捆绑包大小:包含整个组件库会增加应用程序的捆绑包大小。

例子

npm install @mui/material首先,通过运行或确保您的项目中安装了 Material-UI yarn add @mui/material。

 import React from 'react';
 import { styled } from '@mui/system';
 import { Button, Paper, Typography } from '@mui/material';
 ​
 const StyledPaper = styled(Paper)(({ theme }) => ({
   backgroundColor: '#f2f2f2',
   padding: theme.spacing(2),
   borderRadius: theme.spacing(1),
   textAlign: 'center',
 }));
 ​
 const StyledTitle = styled(Typography)(({ theme }) => ({
   fontSize: 24,
   color: '#333',
   marginBottom: theme.spacing(1),
 }));
 ​
 const StyledDescription = styled(Typography)(({ theme }) => ({
   fontSize: 16,
   color: '#777',
 }));
 ​
 const StyledButton = styled(Button)(({ theme }) => ({
   backgroundColor: '#007bff',
   color: '#fff',
   borderRadius: theme.spacing(1),
   padding: theme.spacing(1, 2),
   transition: 'background-color 0.3s ease',
 ​
   '&:hover': {
     backgroundColor: '#0056b3',
   },
 }));
 ​
 const MyComponent = () => {
   return (
     <StyledPaper>
       <StyledTitle variant="h1">Hello, World!</StyledTitle>
       <StyledDescription variant="body1">This is a styled React component.</StyledDescription>
       <StyledButton variant="contained">Click Me</StyledButton>
     </StyledPaper>
   );
 };
 ​
 export default MyComponent;

Button在此示例中,我们从 Material-UI ( , Paper, Typography)导入必要的组件,并styled从 导入函数@mui/system。然后我们使用该函数创建样式组件styled,将结果分配给变量 ( StyledPaper, StyledTitle, StyledDescription, StyledButton)。

在传递给 的函数中styled,我们使用 Material-UI 主题对象 ( ) 定义特定于每个样式化组件的 CSS 规则,theme以实现一致的主题。

渲染时MyComponent,样式化的组件将用于代替常规的 Material-UI 组件。在各个样式组件中定义的样式将应用于相应的元素。

styledMaterial-UI 中的样式化组件遵循与样式化组件类似的方法,允许您使用函数和 Material-UI 主题对象将样式封装在组件中。

确保从 Material-UI 导入必要的组件和功能,并在您的组件中使用它们之前定义您的样式组件。

请记住在使用前在您的项目中安装和配置 Material-UI。

结论

根据我们所看到的,这里有一个快速比较表,用于设计 React 应用程序的不同选项:

选项主要特征优点缺点何时使用
纯CSS使用全局 CSS 文件的传统方法简单而熟悉缺乏封装和类名冲突的可能性小型项目或 CSS 自定义是主要焦点时
CSS 模块具有局部作用域类名的 CSS 文件作用域样式并防止类名冲突需要导入和引用唯一的类名需要样式封装的中型项目
CSS 预处理器(例如 Sass、Less)使用变量、混合等增强 CSS 语法。可重用的代码、模块化和可维护的风格编译所需的构建过程受益于增强的 CSS 语法的项目
顺风 CSS基于实用程序的 CSS 框架快速开发、一致的样式、广泛的实用程序类由于实用程序类,文件较大快速开发至关重要的原型制作或项目
CSS-in-JS使用 Styled Components 或 Emotion 等库直接在 JavaScript 中编写 CSS基于组件的样式、动态样式、基于道具的样式增加的包大小,额外的学习曲线具有复杂或动态样式要求的项目
组件库(例如 MUI、Chakra)预先设置样式和可定制的 UI 组件一致的设计、广泛的组件库、主题支持有限的定制选项,更大的包大小需要具有主题支持的即用型 UI 组件的项目

每个选项都有自己的优点和缺点,选择取决于具体的项目要求和偏好。以下是每个选项何时更方便的细分:

  • 纯 CSS:适用于小型项目或 CSS 自定义是主要焦点时。它简单而熟悉,但缺乏封装,在较大的项目中可能导致类名冲突。
  • CSS Modules:适用于需要样式封装的中型项目。它提供作用域样式,防止类名冲突,并需要导入和引用唯一的类名。
  • CSS 预处理器:推荐用于受益于具有变量、混合和其他功能的增强 CSS 语法的项目。它们提倡可重用和可维护的样式,但需要一个编译构建过程。
  • Tailwind CSS:非常适合快速开发和原型制作。它提供了一组广泛的实用程序类以实现一致的样式,但由于实用程序类的数量可能会导致文件过大。
  • CSS-in-JS:非常适合具有复杂或动态样式要求的项目。直接在 JavaScript 中编写 CSS 提供了基于组件的样式和动态样式功能,但它可能会增加包的大小并且具有额外的学习曲线。
  • 组件库:当您需要具有一致设计和主题支持的即用型 UI 组件时非常有用。它们提供了广泛的组件库,但可能具有有限的自定义选项并导致更大的捆绑包大小。

选择合适的样式选项时,请考虑项目的大小、样式需求、开发速度和自定义要求。还值得考虑团队对所选选项及其生态系统的熟悉程度。

大家好,一如既往,我希望你喜欢这篇文章并学到新东西。

(更多优质教程:java567.com,搜索"react")