classnames 使用

1. 什么是 classnames?

classnames 是一个用于动态地构建 CSS 类名字符串的 JavaScript 库,常用于 React 项目中。它可以根据条件来组合多个类名,简化了在模板中根据逻辑添加或删除 CSS 类名的过程。

  • 主要功能

    • 条件地添加类名:根据给定的条件,动态地组合类名字符串。
    • 处理多种输入形式:支持字符串、对象、数组等形式的参数。
    • 简洁易用:提供了简单的 API,使用起来非常直观

2. 为什么使用 classnames

React 或其他前端框架中,经常需要根据组件的状态来添加或移除 CSS 类名,以控制样式或行为。如果不使用辅助工具,这可能会导致嵌套的三元运算符或复杂的逻辑,代码可读性差

不使用 classnames 的代码:

<div className={`button ${isActive ? 'button-active' : ''} ${isDisabled ? 'button-disabled' : ''}`}>Click me
</div>

使用 classnames 后:

import classNames from 'classnames';<div className={classNames('button', { 'button-active': isActive, 'button-disabled': isDisabled })}>Click me
</div>

优点:

  • 简化代码:避免手写复杂的字符串拼接或三元运算符。
  • 提高可读性:代码更清晰明了,易于维护。
  • 更安全:减少手动拼接字符串导致的错误,例如多余的空格或漏掉的类名。

3.如何安装 classnames?

可以使用 npmyarn 来安装 classnames

npm install classnames --save或者yarn add classnames

4. 如何使用 classnames?

  • 1. 导入模块

     import classNames from 'classnames';const buttonClass = classNames('btn', 'btn-primary');<button className="btn btn-primary">Button</button>
    

    2. 条件添加类名(对象语法)

    classNames({'class-name': condition,'other-class': otherCondition,
    });
    const isActive = true;
    const isDisabled = false;const buttonClass = classNames('btn', {'btn-active': isActive,'btn-disabled': isDisabled,
    });<button className={buttonClass}>Button</button>结果:
    <button class="btn btn-active">Button</button>
    
  • 3. 混合使用字符串、数组和对象

     const buttonClass = classNames('btn', ['btn-block', 'btn-large'], {'btn-active': isActive,
    });
    结果:
    <button class="btn btn-block btn-large btn-active">Button</button>
    
  • 4. 多个参数组合
    classnames 支持多个参数,从左到右依次处理

    const buttonClass = classNames('btn', { 'btn-active': isActive }, 'additional-class');<button className={buttonClass}>Button</button>
    
  • 5. 在 React 组件中使用

    import React from 'react';
    import classNames from 'classnames';const MyButton = ({ isActive, isDisabled }) => {const buttonClass = classNames('btn', {'btn-active': isActive,'btn-disabled': isDisabled,});return <button className={buttonClass}>Button</button>;
    };export default MyButton;
    

5. 常见用法总结

  • 字符串参数

    classNames('class1', 'class2');
    // 结果:"class1 class2"
    
  • 对象参数(条件类名):

    classNames({ 'class1': true, 'class2': false });
    // 结果:"class1"
    
  • 数组参数:

    classNames(['class1', 'class2']);
    // 结果:"class1 class2"
    
  • 混合参数:

    classNames('class1', { 'class2': condition }, ['class3', 'class4']);
    // 根据 condition 的值动态组合类名
    

6. 与模板字符串的对比

不使用 classnames,用模板字符串组合类名:

const buttonClass = `btn ${isActive ? 'btn-active' : ''} ${isDisabled ? 'btn-disabled' : ''}`.trim();

缺点:

  • 需要手动处理空字符串和多余的空格。
  • 嵌套条件语句,代码可读性差。

使用 classnames:

const buttonClass = classNames('btn', {'btn-active': isActive,'btn-disabled': isDisabled,
});

优点:

  • 无需处理空字符串或多余的空格。
  • 条件逻辑清晰明了。

7. 在 TypeScript 中使用 classnames

classnames 也支持 TypeScript,无需额外配置。

安装类型定义

npm install @types/classnames --save-dev

示例

import classNames from 'classnames';interface Props {isActive: boolean;isDisabled?: boolean;
}const MyComponent: React.FC<Props> = ({ isActive, isDisabled }) => {const classes = classNames('component', {'component-active': isActive,'component-disabled': isDisabled,});return <div className={classes}>Content</div>;
};export default MyComponent;

8. 实战示例

  • 1. 根据状态动态添加类名
    例如,一个导航菜单,根据当前选中的项,添加 active 类名:

    const MenuItem = ({ isActive, label }) => {const itemClass = classNames('menu-item', { active: isActive });return <li className={itemClass}>{label}</li>;
    };
    
  • 2. 根据多种条件组合类名
    例如,一个表单输入框,根据验证状态添加不同的类名:

    const InputField = ({ hasError, isDisabled }) => {const inputClass = classNames('input-field', {'input-error': hasError,'input-disabled': isDisabled,});return <input className={inputClass} disabled={isDisabled} />;
    };
    
  • 3. 与 CSS 模块配合使用
    如果使用了 CSS Modules,导入的类名是一个对象,可以这样使用:

    import styles from './styles.module.css';
    import classNames from 'classnames';const Component = ({ isActive }) => {const className = classNames(styles.component, {[styles.active]: isActive,});return <div className={className}>Content</div>;
    };
    

9. 注意事项

不要忘记导入 classnames:在使用之前,需要先导入模块。

import classNames from 'classnames';
  • 处理 null 或 undefined:
  • classnames 会自动忽略值为 false、null、undefined 的类名。
  • 无需额外处理这些值。

避免与同名函数冲突:
classnames 导入后通常命名为 classNames,但您可以根据喜好重命名。

import cx from 'classnames';const className = cx('class1', { 'class2': condition });

10. classnames 的替代品

除了 classnames,还有其他类似的库提供了相似的功能,例如:

  • clsx:
    功能与 classnames 类似,但体积更小。
    安装:

    npm install clsx
    
  • bem-cn:
    专注于 BEM 命名规范的 CSS 类名生成。

11. 总结

  • classnames 是一个用于动态组合 CSS 类名的实用工具,在 React 开发中非常常用。
  • 它简化了根据条件添加或删除类名的过程,使代码更加清晰和易于维护
  • 使用方法简单直观,支持多种参数形式,包括字符串、对象、数组等。
  • 在开发中,合理使用 classnames 可以提高代码质量和开发效率

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/57028.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

nginx中的HTTP 负载均衡

HTTP 负载均衡&#xff1a;如何实现多台服务器的高效分发 为了让流量均匀分配到两台或多台 HTTP 服务器上&#xff0c;我们可以通过 NGINX 的 upstream 代码块实现负载均衡。 方法 在 NGINX 的 HTTP 模块内使用 upstream 代码块对 HTTP 服务器实施负载均衡&#xff1a; upstr…

Maven与Gradle的区别

Maven与Gradle是两种流行的构建工具&#xff0c;广泛用于Java项目的管理和构建。以下是它们的对比&#xff0c;包括官网、Windows 11配置环境、在IDEA中的相同点和不同点&#xff0c;以及它们各自的优缺点。 官网 Maven官网: https://maven.apache.orgGradle官网: https://gr…

[Linux网络编程]02-Socket编程

一.套接字(Socket) 在通信过程中&#xff0c;套接字一定是成对出现的(通信双方各持一个) 一个文件描述符指向一个套接字(该套接字内部由内核借助两个缓冲区实现读写),即一个套接字只有一个文件描述符&#xff0c;但有两个缓存区&#xff0c;与管道正好相反。 Linux套接字实现…

解决k8s集群中安装ks3.4.1开启日志失败问题

问题 安装kubesphere v3.4.1时&#xff0c;开启了日志功能&#xff0c;部署时有三个pod报错了 Failed to pull image “busybox:latest”: rpc error: code Unknown desc failed to pull and unpack image “docker.io/library/busybox:latest”: failed to copy: httpRead…

uniapp使用html2canvas时,页面内的image元素模糊

不废话很简单只需要将image改成img就行 改之前 改之后 原因可能是因为uniapp里面的image标签做了某种处理

QT教程-二十一,Qt动画类

目录 1. QPropertyAnimation 主要功能 示例 2. QVariantAnimation 主要功能 3. QAbstractAnimation 主要功能 4. QAnimationGroup 主要功能 5. QSequentialAnimationGroup 示例 6. QParallelAnimationGroup 示例 7. QEasingCurve 示例 8. 例子,实现一边移动一边…

1.计算机网络_基本知识

基本知识 计算机网络的类别&#xff1a; 1、按作用范围来分类 2、按网络的使用者来分类 什么是计算机网络&#xff1a; 计算机网络由若干个节点和链接这些节点的链路组成&#xff0c;节点可以是计算机、集线器、交换机、路由器等。互联网络是多个网络通过路由器连接在了一起…

具备技术二:正则表达式

一、C正则库 regex 用于报文的解析。 使用接口&#xff1a;bool regex_match(const string &src, smatch &matches, regex &e); src&#xff1a;要解释的字符串。 smatch&#xff1a;一个类似于数组的结构&#xff0c;用于存储一个个解释之后的字符串。 matche…

可视化大屏的C位放啥(02):3D建筑,数据的集大成展示。

3D 建筑以其立体、逼真的形态&#xff0c;瞬间抓住人们的眼球。它不仅仅是一个静态的模型&#xff0c;更是一个承载着丰富数据的载体。通过精细的建模&#xff0c;可以展示建筑的外观、结构、内部布局等多方面信息。 从数据展示的角度来看&#xff0c;3D 建筑可以与各种数据进…

【zookeeper】集群配置

zookeeper 数据结构 zookeeper数据模型结构&#xff0c;就和Linux的文件系统类型&#xff0c;看起来是一颗树&#xff0c;每个节点称为一个znode.每一个Znode默认的存储1MB的数据&#xff0c;每个Znode都有唯一标识&#xff0c;可以通过命令显示节点的信息每当节点有数据变化…

相同的树算法

给你两棵二叉树的根节点 p 和 q &#xff0c;编写一个函数来检验这两棵树是否相同。 如果两个树在结构上相同&#xff0c;并且节点具有相同的值&#xff0c;则认为它们是相同的。 示例 1&#xff1a; 输入&#xff1a;p [1,2,3], q [1,2,3] 输出&#xff1a;true示例 2&…

最新开发项目H5商城小程序源码系统 带源代码安装包以及搭建部署教程

系统概述 在当今数字化迅猛发展的时代&#xff0c;电子商务已成为企业拓展市场、提升品牌影响力的重要手段。H5商城小程序作为一种跨平台、轻量级的应用形式&#xff0c;凭借其无需下载安装、即用即走的特性&#xff0c;迅速赢得了广大用户的青睐。为了满足企业对高质量H5商城…

【工具变量】A股上市企业大数据应用(2001-2023年)-参考柏淑嫄实践

数据简介&#xff1a;企业数字化转型的浪潮孕育出大数据&#xff0c;大数据技术是在数据处理和应用中释放大数据多元价值的必要手段。大数据作为企业发展的战略资源和生产要素对企业转型发展具有重要意义。对上市企业大数据应用程度进行测算不仅有助于了解大数据相关技术在企业…

Linux安装部署服务:Nginx和Openresty

Linux安装部署服务&#xff1a;Nginx和Openresty 一、安装环境说明1.1 虚拟机环境1.2 nginx 安装包1.3 openresty 安装包 二、安装 nginx 服务2.1 安装前环境准备2.2 源码安装 nginx2.3 开机自启 nginx 三、安装 openresty 服务3.1 安装前环境准备3.2 源码安装 openresty3.4 离…

执行vue create XXX报错The operation was rejected by your operating system

创建项目&#xff1a; vue create my-project 报错&#xff1a; npm ERR! code EPERM npm ERR! syscall open npm ERR! path D:\Program Files\nodejs\node_cache\_cacache\tmp\5d2a6f8e npm ERR! errno -4048 npm ERR! Error: EPERM: operation not permitted, open D:\Pro…

Svan.的创作纪念日

机缘 大家好&#xff0c;今天是我成为CSDN创作者的1024天&#xff0c;作为一名算是资深社区的博主&#xff0c;我有太多的话想和大家说&#xff0c;但是近几天真的很忙&#xff0c;所以我只用最简洁的话来说一下我一路走来的创作经验和感受&#xff01;&#xff01; 首先说一…

界面组件DevExpress WPF v24.1亮点 - 支持全新的字体图标图像

DevExpress WPF拥有120个控件和库&#xff0c;将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpress WPF能创建有着强大互动功能的XAML基础应用程序&#xff0c;这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。 DevExpress WPF控件日…

移情别恋c++ ദ്ദി˶ー̀֊ー́ ) ——14.哈希(2)(模拟实现)

1.概念介绍 1.1开散列 开散列&#xff08;Open Hashing&#xff09;&#xff0c;也叫链地址法&#xff0c;是一种解决哈希冲突的方法。每个哈希表槽位保存一个链表&#xff0c;所有散列到同一位置的元素都存储在该链表中。当插入元素发生冲突时&#xff0c;将新元素添加到相应…

Ansible概述

目录 一、ansible简介 二、absible的特点 三、ansible的工作原理以及流程 四、ansible环境安装部署 五、ansible命令行模块 六、inventory 主机清单 一、ansible简介 Ansible是一个基于Python开发的配置管理和应用部署工具&#xff0c;现在也在自动化管理领域大放异彩。…

HCIP-HarmonyOS Application Developer 习题(十二)

&#xff08;多选&#xff09;1、声明式开发范式的转场动画包含以下哪几种类型? A、页面间转场 B、应用间转场 C、共享元素转场 D、组件内转场 答案&#xff1a;ACD 分析&#xff1a; &#xff08;多选&#xff09;2、公共事件服务为应用程序提供哪些能力。 A、取消发布公共…