首页 > 其他分享 >classnames的理解

classnames的理解

时间:2023-12-07 14:45:03浏览次数:32  
标签:const classNames js classnames 理解 arg true

本篇文章主要是学习classnames的相关理解及使用。
下面列举的是如何在项目中使用

安装方式

npm install classnames

使用方式

  1. 引入时可使用require的方式引入,也可以通过import的方式引入

使用方法

import classnames form 'classnames
classnames('foo','bar') == 'foo bar'
classnames('foo',{bar:true}) == 'foo bar'

一般在React中,我们会在构建组件或需要根据某些判断条件动态生成类名时,classnames会非常有用。

示例一:

import React, { useState } from 'react';

export default function Button (props) {
	const [isPressed, setIsPressed] = useState(false);
	const [isHovered, setIsHovered] = useState(false);

	let btnClass = 'btn';
	if (isPressed) btnClass += ' btn-pressed';
	else if (isHovered) btnClass += ' btn-over';

	return (
		<button
			className={btnClass}
			onMouseDown={() => setIsPressed(true)}
			onMouseUp={() => setIsPressed(false)}
			onMouseEnter={() => setIsHovered(true)}
			onMouseLeave={() => setIsHovered(false)}
		>
			{props.label}
		</button>
	);
}

使用classnames之后

import React, { useState } from 'react';
import classNames from 'classnames';

export default function Button (props) {
	const [isPressed, setIsPressed] = useState(false);
	const [isHovered, setIsHovered] = useState(false);

	const btnClass = classNames({
		btn: true,
		'btn-pressed': isPressed,
		'btn-over': !isPressed && isHovered,
	});

	return (
		<button
			className={btnClass}
			onMouseDown={() => setIsPressed(true)}
			onMouseUp={() => setIsPressed(false)}
			onMouseEnter={() => setIsHovered(true)}
			onMouseLeave={() => setIsHovered(false)}
		>
			{props.label}
		</button>
	);
}

源码理解

classnames文件目录结构
classnames

标签:const,classNames,js,classnames,理解,arg,true
From: https://www.cnblogs.com/bllx/p/17881041.html

相关文章

  • xss专题1-原理解析和简单利用
    XSS原理解析跨站脚本攻击(XSS)是一种常见的网络安全漏洞,其原理涉及恶意用户向网页注入客户端脚本代码,使其在用户的浏览器中执行。攻击者利用输入栏或其他用户可输入内容的地方,注入包含恶意脚本的数据。当其他用户访问包含恶意注入内容的页面时,这些脚本将在其浏览器中执行,导致攻击者......
  • 深入理解和实现Qt中的单例模式
    在Qt框架中,单例模式的实现是一个常见的需求,它有多种实现方式,每种都有其特点。以下是对这些方法的探讨,包括宏定义方式、模板类方式,以及Qt的内置单例宏,并附有具体的使用示例。宏定义方式的单例模式宏定义方式是一种传统且直接的实现单例模式的方法,但它可能导致代码重复和类型安全......
  • Flink State 状态原理解析
    一、FlinkState概念State用于记录Flink应用在运行过程中,算子的中间计算结果或者元数据信息。运行中的Flink应用如果需要上次计算结果进行处理的,则需要使用状态存储中间计算结果。如Join、窗口聚合场景。Flink应用运行中会保存状态信息到State对象实例中,State对象实......
  • C语言--深入理解指针
    C语言--深入理解指针一.指针的概念要知道指针的概念,要先了解变量在内存中是如何存储的。在存储时,内存被分为一块一块的,每一块都有一个特有的编号。而这个编号可以暂时理解为指针,就是酒店的门牌号一样。变量和地址看下面代码voidmain(){intx=10,inty=20;}代......
  • 深入理解泛型(经典详解):<T> T 和 T的使用以及public <E> List<E> get()泛型方法详解、类型擦
     一、为什么要使用泛型?    泛型俗称“标签”,使用<E>表示。泛型就是在允许定义类,接口时通过一个标识表示某个属性的类型或者是某个方法的返回值或者是参数类型,参数类型在具体使用的时候确定,在使用之前对类型进行检查。     泛型意味着编写的代码可以被很多不同......
  • 无人巡检 | AIRIOT变电站运防一体管理解决方案
    传统的变电站安全管理存在着人力成本高、效率低、安全风险难以全面控制等问题,主要依靠人工巡检和监控设备,往往存在如下的运维问题和管理痛点:• 巡检监控能力差:传统变电站管理系统无法对变电站进行全面的巡检监控,以及无法完成对变电站周边环境的监测,企业管理难度大;• 异常检测不及......
  • 软件测试/人工智能|Python 数据类型转换解析:理解数据之间的灵活转换
    引言数据类型转换是指将一种数据类型的值转换为另一种数据类型的过程。在编程中,我们经常需要处理不同类型的数据,正确地进行类型转换是编写健壮程序的关键。常见的数据类型转换整数和浮点数转换为字符串#示例代码num_int=10num_float=3.14str_int=str(num_int)str......
  • 深入理解HarmonyOS UIAbility:生命周期、WindowStage与启动模式探析
    本文分享自华为云社区《深入理解HarmonyOSUIAbility:生命周期、WindowStage与启动模式探析》,作者:柠檬味拥抱。UIAbility组件概述UIAbility组件是HarmonyOS中一种包含UI界面的应用组件,主要用于与用户进行交互。每个UIAbility组件实例对应最近任务列表中的一个任务,可以包含多个页......
  • 如何理解微服务体系结构中的 CQRS
    本文翻译自HowToUnderstandCQRSInMicroservicesArchitecture,原作者OLEKSII。问题描述在典型的软件应用程序中,有一个负责写入和读取操作的数据存储。通常,应用程序实现一些CRUD操作,并且非常简单。你存储了一些东西并读取了相同的结果。然而,在复杂的应用程序中,情况......
  • 深入理解C++继承(一)
    一、继承的概念及定义1.1继承的概念 继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的复......