classnames 源码学习笔记与解读

news2024/9/23 13:22:59

前言

这里我引用源码文档中的一句话来作为开场白: A simple JavaScript utility for conditionally joining classNames together.

话不多说,咱们直接开始 classnames 的源码学习。

核心源码解读

直接来看它的源码部分,以下这是 classnames 的核心源码,核心源码不过才四十几行,让我们一步步解读一下都是什么意思吧。

 var hasOwn = {}.hasOwnProperty; function classNames () {var classes = [];for (var i = 0; i < arguments.length; i++) {var arg = arguments[i];if (!arg) continue;var argType = typeof arg;if (argType === 'string' || argType === 'number') {classes.push(arg);} else if (Array.isArray(arg) && arg.length) {var inner = classNames.apply(null, arg);if (inner) {classes.push(inner);}} else if (argType === 'object') {for (var key in arg) {if (hasOwn.call(arg, key) && arg[key]) {classes.push(key);}}}}return classes.join(' ');} 

这里的 hasOwnProperty 这个方法是用来判断对象的属性是否属于自己本身。

整个源码里做了三个 if 类型判断。首先定义 classes 存储数组,然后遍历 arguments 拿到所有的参数;如果该项的值为 undefined、null 之类的就直接跳过;通过 var argType = typeof arg 获取该项的类型,然后 pushclasses 中就可以了。

这里面对我而言比较难懂的是这段代码:

else if (Array.isArray(arg) && arg.length) {var inner = classNames.apply(null, arg);if (inner) {classes.push(inner);} 

查阅资料得知这里利用 递归+apply 达到数组扁平化的效果,说的简单点就是将数组分拆成参数传入 classNames 函数中。

最后 returnjoin 方法将数组变为字符串,用空格隔开。

这里介绍一下参数类型的判断:

  • 如果是 string 或者 number,直接 pushclasses
  • 如果是数组,则通过 classNames.apply(null, arg),将数组分拆成参数传给 classNames 函数进行递归
  • 如果是对象,遍历对象,如果 arg[key] 为真,则 pushclasses 数组

classnames 运用

react 项目中,经常使用到 className。使用如下:

<div className="box1"></div>

.box1{color:blue;
} 

但是缺点也很明显,如果想动态添加类名,className 就有点吃力了。因此这时候就需要 classnames 了。使用 npm install classnames 安装。

众所周知,classnames 是一个库函数,使用方法有很多种,下面介绍一种比较常用的写法。

import classnames from 'classnames';

<div className={classnames({box1:true , box2: false},'box3')}></div>

// 用 className 方式表示如下

<div className="box1 box3"></div> 

总结

总体来说,通过阅读源码学到了 argumentsapply 的应用,了解了这个经常使用的库的源码可以更好地理解 classnames 的作用。

从文档中熟悉了 classnames 的用法,从 github 上了解了 classnames 的源码,这是一个与 react 项目紧密结合的库函数,所以多看文档多看源码多学习。

最后

为大家准备了一个前端资料包。包含54本,2.57G的前端相关电子书,《前端面试宝典(附答案和解析)》,难点、重点知识视频教程(全套)。



有需要的小伙伴,可以点击下方卡片领取,无偿分享

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

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

相关文章

Win10的几个实用技巧系列之win10和win8系统哪个好用、系统任务栏和窗口假死的解决方法

目录 win10系统任务栏和窗口假死怎么办?win10系统任务栏和窗口假死的解决方法 win10系统任务栏和窗口假死怎么解决 Win10进不去Epic下载的死亡搁浅怎么办?Win10玩死亡搁浅闪退的解决方法 Epic领取的死亡搁浅进不去 Win10玩死亡搁浅闪退的解决方法 win10和win8系统哪个好用…

Eth09- EthCtrlConfig:以太网控制器写MAC地址到NVM中的配置

文章目录 1 MAC地址保存到非易失性存储器中传送门 ==>> AutoSAR入门和实战系列总目录 1 MAC地址保存到非易失性存储器中 如果想把MAC地址保存到非易失性存储器中,防止掉电之后MAC地址不存在了,可以通过以下的配置参数,实现实时保存MAC地址到NVM中 EthCtrlConfig/…

【Effective Objective - C】—— 读书笔记(四)

【Effective Objective - C】—— 读书笔记&#xff08;四&#xff09; 协议与分类 文章目录【Effective Objective - C】—— 读书笔记&#xff08;四&#xff09;协议与分类23.通过委托与数据源协议进行对象间通信要点&#xff1a;24.将类的实现代码分散到便于管理的数个分类…

Friedman 检验后的two-tailed Nemenyi test和the two-tailed Bonferroni-Dunn test的关键值

Critical values qαq_{\alpha}qα​ for post-hoc tests after the Friedman testCritical values qαq_{\alpha}qα​ for the two-tailed Nemenyi test Critical values qαq_{\alpha}qα​ for the two-tailed Bonferroni-Dunn test 其中classifiers是比较的方法个数&#…

【nowcoder】笔试强训Day15

目录 一、选择题 二、编程题 2.1 查找输入整数二进制中1的个数 2.2 手套 一、选择题 1.给出数据表 score(stu-id,name,math,english,Chinese), 下列语句正确的是&#xff08; &#xff09; A. Select sum(math),avg(chinese) from score B. Select *,sum(english) from …

初步改造2

1.找到登录按钮的触发方法 views/login/index.vue 找到是handleLogin 接着发现调用的是vuex里面的user/login方法 2.vuex中的方法&#xff0c;其实对应于"store/modules/user.js 中actions的login方法 3.前端请求与发现无响应&#xff0c;我们先用postman排除是后端问题&a…

Java集合 - HashMap

介绍 HashMap Map 是一种存储键值对的集合。Map 集合可以根据 key 快速查找对应的 value 值。HashMap 是 Map 类型的一中。 HashMap 的底层存储结构是&#xff1a;数组 链表 红黑树。 下面我们通过 HashMap 的新增操作、查找操作来看 HashMap 的底层存储结构。 HashMap 的…

深入理解ConcurrentHashMap1.8源码

1. 概述 之前介绍了ConcurrentHashMap1.7&#xff0c;采用的是数组分段锁的方式来实现的。虽然说采用分段锁的方式能够在一定程度上提高并发的效率&#xff0c;但是锁的粒度是Segment级别的&#xff0c;其实还是挺大的。 于是&#xff0c;ConcurrentHashMap1.8继续在1.7版本上…

postgresql_internals-14 学习笔记(五)Buffer Cache

新年的第一篇博客~ 一、 Buffer Cache简介 1. 主要用途 调和内存&#xff08;ns级&#xff09;与磁盘&#xff08;ms级&#xff09;间的速度差异。 pg不仅用自己的buffer cache&#xff0c;也用os cache&#xff0c;所以它使用了“双缓存”&#xff0c;这也是很多文档推荐sha…

《UEFI内核导读》UEFI是不是操作系统?

敬请关注微信公众号&#xff1a;“固件C字营” 最近一直在思考一个问题&#xff0c;UEFI是什么&#xff1f;UEFI算不算是操作系统&#xff1f; 众所周知&#xff0c;计算机系统是由软件和硬件两大部分组成的&#xff0c;但从更科学的角度来划分&#xff0c;我们其实可以分得更…

电子学会2020年9月青少年软件编程(图形化)等级考试试卷(四级)答案解析

目录 一、单选题&#xff08;共15题&#xff0c;每题2分&#xff0c;共30分&#xff09; 二、判断题&#xff08;共10题&#xff0c;每题2分&#xff0c;共20分&#xff09; 三、编程题【该题由测评师线下评分】&#xff08;共5题&#xff0c;共50分&#xff09; 青少年软件…

【MySQL】说透锁机制(三)行锁升表锁如何避免? 锁表了如何排查?

文章目录前言哪些场景会造成行锁升表锁&#xff1f;如何避免?如何分析排查?查看InnoDB_row_lock%相关变量查看 INFORMATION_SCHEMA系统库总结最后前言 在上文我们曾小小的提到过&#xff0c;在索引失效的情况下&#xff0c;MySQL会把所有聚集索引记录和间隙都锁上&#xff0…

【正点原子】嵌入式Linux C应用编程-第十一章

第十一章&#xff1a;线程 前言&#xff1a; 与进程类似&#xff0c;线程是允许应用程序并发执行多个任务的一种机制&#xff0c;线程参与系统调度&#xff0c;事实上&#xff0c;系统调度的最小单元为线程&#xff0c;而不是进程 1&#xff1a;线程的概念 什么是线程&#xff…

【游戏编程扯淡精粹】自研引擎切 UE

【游戏编程扯淡精粹】自研引擎切 UE UF2022 的两篇讲座&#xff0c;再加上 The Machinery 引擎项目失败 结合过去两年笔者使用自研引擎的体验&#xff0c;其实有一部分是共通的 Crystal Dynamics&#xff1a;如何从自研引擎转变到虚幻引擎5 游戏技术&#xff08;featurelist…

LVGL的学习及使用

1、LVGL简介 LVGL是最受欢迎的免费开源嵌入式图形库&#xff0c;可为任何MCU、MPU和显示器类型创建漂亮的用户界面。使用SquareLine工作室&#xff0c;使用拖放UI编辑器来简化开发。 1.1、LVGL源码下载 lvgl 在github 上的开源代码 https://github.com/lvgl/lvgl 下载的源码包里…

Vue的数据绑定

一、Vue的数据绑定 1、单向数据绑定&#xff1a;将Model绑定到View上&#xff0c;当通过JavaScript代码改变了Model时&#xff0c;View就会自动刷新。不需要进行额外的DOM 操作就可以实现视图和模型的联动 ​ a、数据只保存一份 ​ b、data—->DOM ​ &#xff08;1&am…

在wsl下开发T113的主线linux(3)-写入spinand测试

接下来是烧写入硬件验证&#xff0c;我的板子焊接的是W25N01GV&#xff0c;这里使用xfel&#xff0c;因为支持写入spi-nand。GitHub - xboot/xfel: Tiny FEL tools for allwinner SOC, support RISC-V D1 chipTiny FEL tools for allwinner SOC, support RISC-V D1 chip - GitH…

QML学习笔记【04】:常用控件

1 Repeater与model Window {width: 640; height: 480visible: truetitle: qsTr("Hello World")Column{id: colspacing: 30Repeater{model: 3 //model控制了所有的数据&#xff0c;这里定义了Button的数量Button{width: 100; height: 50text: "btn" index…

整数划分——完全背包的变形

整数划分——完全背包的变形一、题目二、思路分析1、状态转移方程&#xff08;1&#xff09;状态表示&#xff08;2&#xff09;方程书写2、循环与初始化&#xff08;1&#xff09;循环&#xff08;2&#xff09;初始化三、代码一、题目 二、思路分析 这道题这么看的话还是比较…

Docsify使用之Markdown语法

Docsify使用过程中的排版&#xff0c;他是基于Markdown语法的。我们来看一下使用的常用语法&#xff1a; 字体加粗&#xff1a; 在需要加粗的文字前后各加两个** 具体格式如下 **加粗内容** 在需要加粗的文字前后各加一个* 具体格式如下 *倾斜内容* 在需要加粗并且倾斜的…