样式化 React 组件的 3 种方法
Styling — 是每个 Web 开发人员必须知道的前端 Triada 中的元素之一:HTML/CSS/JS 🤔。 另一方面,有一大群 Web 开发人员不喜欢 CSS。 他们更喜欢使用一些帮助程序和库,基本上非常努力地避免编写这种神秘的样式语言。 而且我们不应该评判这些人,尤其是当它与 React 相关时,因为它是 JSX 的本质。
无论如何,这篇文章适用于:爱好者❤️和仇恨者😠。 我们将回顾 3 种将 react 组件样式化过程转变为愉快旅程的方法。 大家可以选择或多或少地控制最符合自己的用例的样式选项。
1. 使用 CSS 模块完全控制 React 组件样式
是的,大家可以完全忽略这些库并直接使用 CSS/SCSS/SASS
,就像我们没有任何 JSX 一样。 此功能从 react-scripts@2.0.0
开始可用。 基本上,一切都可以随心所欲地使用。 使用以下语法 [name].module.css
创建样式表。
Text.module.css
.success { background-color: green; }
并简单地导入组件
import React from 'react';
import styles from './Text.module.css'; // 将 css 模块样式表作为样式导入
const Text = () => {
return <div className={styles['success']}>Successful message</div>;
}
style['class-name']
与 style.className
相比,该格式更可取,以使我们的类名接近标准的 kebab 大小写而不是丑陋的驼峰大小写。
它将使用 [filename]_[classname]_[hash]
格式自动为我们确定样式范围,最终结果在浏览器中将如下所示:
<div class="Text_success_sdfg43l">Successful message</div>
我们还可以使用 SCSS 和 SASS 等预处理器样式表,只需安装 npm install scss
或 npm install sass
。
这种方法使我们可以完全自由地使用 CSS,并且无需学习新的语法或库。
2. 使用 Chakra UI 样式化 不使用 CSS
这是我的前 2 个选项,非常适合辅助项目和中小型 Web 应用程序。 今年,tailwind 变得非常流行,许多 Web 开发人员发现它是无需编写一行 CSS 即可设置组件样式的完美解决方案。 它的缺点是我们需要在开始时经常查找库,直到我们习惯它为止。 另一个问题是组件内部会有一堆类,它们会膨胀你的 React 组件并迫使你复制这些类。
Chakra UI 与此类似,但除了样式之外,我们还可以获得 UI 组件。 它拥有构建任何复杂布局所需的一切。 如果大家需要更精细的定制,它也足够灵活。 tailwind 的区别在于,在 Charka UI 中,我们将主要通过 props 传递样式,而不是编写类列表,React 应用程序使用 props 看起来更自然。
首先,我们需要安装依赖项:
$ npm i @chakra-ui/react @emotion/react @emotion/styled framer-motion
将提供程序设置到应用程序的根目录:
function App() {
return (<ChakraProvider>
<TheRestOfYourApplication />
</ChakraProvider>)
}
现在你可以开始了:
<Text fontSize='6xl'>Your 6xl size text</Text>
如果大家不需要微妙的样式并希望快速构建应用程序原型,此解决方案可以快速满足大家的需求。 我喜欢在我的大多数项目中使用它。
3. React 样式之王——styled-components
不是我最喜欢的,但最流行的 React 样式库样式组件之一。 它被许多知名公司使用。 我不喜欢它的原因是你每次想要应用一些简单的样式时都需要创建一个新组件。 可能这在正常世界中是有意义的,我们需要添加一个类,但在这里我们将拥有一个单独的组件。 如果想构建自己的 UI 组件库,这可能是一个很好的解决方案。 styled-components
的一个很酷的特点是你可以通过 props 设置样式条件,而且它是可定制的。
从安装依赖项开始:
$ npm install --save styled-components
现在我们已准备好创建第一个样式组件:
const Container = styled.div`
text-align: center;
`
然后我们可以将其用作组件:
<Container>Your text</Container>
相关文章
在 React 中循环遍历对象数组
发布时间:2023/03/18 浏览次数:124 分类:React
-
在 React 中循环对象数组: 使用 map() 方法迭代数组。 我们传递给 map() 的函数会为数组中的每个元素调用。 该方法返回一个新数组,其中包含传入函数的结果。 export default function App (
获取 React 中元素的类名
发布时间:2023/03/18 浏览次数:162 分类:React
-
在 React 中使用 event.target 获取元素的类名 获取元素的类名: 将元素上的 onClick 属性设置为事件处理函数。 访问元素的类名作为 event.currentTarget.className 。 export default function App () { cons
如何将 key 属性添加到 React 片段
发布时间:2023/03/18 浏览次数:152 分类:React
-
使用更详细的片段语法将 key 属性添加到 React 片段,例如 React.Fragment key={key} 。 更冗长的语法实现了相同的结果对元素列表进行分组,而不向 DOM 添加额外的节点。 import React from react
如何在 React 中删除事件监听器
发布时间:2023/03/15 浏览次数:203 分类:React
-
在 React 中删除事件监听器: 在 useEffect 挂钩中添加事件侦听器。 从 useEffect 挂钩返回一个函数。 当组件卸载时,使用 removeEventListener 方法移除事件监听器。 import {useRef, useEffect} from r
React 中在 map() 中使用条件跳出map
发布时间:2023/03/15 浏览次数:198 分类:React
-
React 中在 map() 中使用条件: 在数组上调用 map() 方法。 使用 if 条件,如果条件满足则显式返回。 否则返回不同的值或返回 null 以不呈现任何内容。 export default function App () { const arr =
在 React 中调用多个 onClick 函数
发布时间:2023/03/15 浏览次数:160 分类:React
-
在 React 中调用多个 onClick 函数: 在元素上设置 onClick 属性。 在事件处理函数中调用其他函数。 事件处理函数可以根据需要调用尽可能多的其他函数。 export default function App () { const s
在 React 中按类名查找所有元素
发布时间:2023/03/15 浏览次数:171 分类:React
-
在 React 中通过 className 查找所有元素: 使用 getElementsByClassName 方法获取具有特定类的所有元素。 将对该方法的调用放在 useEffect() 钩子中。 import {useEffect} from react ; const App = () = { useEf
在 React 中检查元素是否获取到焦点
发布时间:2023/03/15 浏览次数:154 分类:React
-
要检查元素是否在 React 中获得焦点: 在元素上设置 ref 属性。 元素呈现后,检查元素是否是文档中的活动元素。 如果是,则该元素被聚焦。 import {useEffect, useRef} from react ; export defaul
在 React 中悬停时显示元素或文本
发布时间:2023/03/13 浏览次数:160 分类:React
-
在 React 中悬停时显示元素或文本: 在元素上设置 onMouseOver 和 onMouseOut 属性。 跟踪用户是否将鼠标悬停在状态变量中的元素上。 根据状态变量有条件地渲染另一个元素。 import {useStat