React里通过使用classNames优化类名控制

介绍

classNames是一个用于动态构建CSS 类名字符串的JavaScript库 ,常用于React 项目中。它可以根据条件 动态地组合类名字符串,简化了在模板中根据逻辑添加或删除CSS类名的过程。使用classNames 可以避免手写复杂的字符串拼接或三元运算符,提高代码的可读性和维护性 。

基本用法

安装

通过 npm 或yarn 来安装classNames

命令:

  1. npm install classnames --save
  2. yarn add classnames
引入

在 React 项目中,可以通过以下方式引入:
import classNames from 'classnames';

在nodejs里引入:
var classNames = require('classnames');

使用

classNames 接受多个参数 ,可以是字符串、对象或布尔值。它会根据传入参数的真值来决定是否添加对应的类名。

下面对比普通字符串拼接实现动态类名及使用classnames来实现动态类名。

普通字符串拼接

这里直接使用了上篇文章的部分代码,具体的字符串拼接完整页面文档可参考上篇文章。

js 复制代码
{tabList.map(item =>
   <span key={item.type}
     className={`type-tab ${ currentType == item.type && 'activeType'}`}
     onClick={() => checkType(item.type)}
   >{item.tab}</span>
 )}

分析: 这里使用了 字符串拼接的方式 来实现了动态控制类名的显示与隐藏;

缺点: 当类名过多的时候,使用 字符串拼接的方式 ,不直观,也很容易出错。

classNames
  1. 直接在页面里添加classNames , 这里直接对比上方的 字符串拼接的方式的代码,进行修改
js 复制代码
{tabList.map(item =>
   <span key={item.type}
     className = {classNames('type-tab', {activeType: currentType == item.type})}
     onClick={() => checkType(item.type)}
   >{item.tab}</span>
 )}
  1. 在js里定义,然后在页面通过className直接使用。
js 复制代码
// css部分
.redStyle {
  color: red;
}
.sizeStyle {
  font-size: 26px;
}
//  js 部分
// js引入  classnames
import classNames from 'classnames'
//  定义是否显示
const isRed = true;
const isSize = true;
//  定义样式,word-style是默认样式,对象里的另外两个是通过条件控制的样式。
const moreStyle = classNames('word-style',{
  'redStyle' : isRed,
  'sizeStyle': isSize,
})
console.log(moreStyle)  // word-style redStyle sizeStyle
// html部分
 <p className={moreStyle}>这是一段文字</p>

分析:这里使用了 classnames的方式,来添加动态类名;可以通过条件来组合类名,以对象来控制是否显示当前类名。

优点:

  • 简化代码: 避免手写复杂的字符串拼接或三元运算符,减少代码量。
  • 提高可读性: 代码更清晰明了,易于维护。
  • 减少错误: 减少手动拼接字符串导致的错误,如多余的空格或漏掉的类名‌。
相关推荐
ZoeLandia2 天前
React11:数据请求与 TanStack Query
前端·react.js·typescript·react
瓦瓦gogo2 天前
实习中接触前端开发后,我开始了解 React
前端·react.js·前端框架
ZoeLandia3 天前
React08:自定义 Hook
开发语言·前端·react.js·typescript
空中湖4 天前
用 React 写数据大屏:为什么我不建议用图表库
前端·react.js·前端框架
来一首_We_go6 天前
React Flow Pro 高级交互实现
前端·react.js
weedsfly6 天前
React 不可变数据:为什么页面“明明数据变了却不更新
前端·javascript·react.js
随风一样自由6 天前
【React+TS71007】Next.js “use client” 误用导致 TS71007:客户端/服务端引入问题的完整排查与修复
前端·javascript·react.js
ZoeLandia6 天前
React6:组件通信
前端·react.js·typescript
ZoeLandia7 天前
React03:useState 与不可变更新
前端·react.js·typescript·react
鬼手点金7 天前
单轮对话:最简单的 API 调用
java·服务器·前端·javascript·react.js·servlet·tomcat