【React】classnames 優化類名控制

1. 介紹

classnames是一個簡單的JS庫,可以非常方便的通過條件動態的控制class類名的顯示
ClassNames是一個用于有條件處理classname字符串連接的庫
簡單來說就是動態地去操作類名,把符合條件的類名粘在一起
在這里插入圖片描述

現在的問題:字符串的拼接方式不夠直觀,也容易出錯
在這里插入圖片描述

2. 安裝

npm install classnames

3. 引入

在nodejs里引入

var classNames = require('classnames');

在js里引入

import classnames from 'classnames'

基本使用

普通字符串粘合

將參數拼接為字符串,中間用空格分開

classNames('foo', 'bar'); // => 'foo bar'

帶條件的類參數

這里第二個參數是對象類型,鍵值為true,則粘合進classname里

classNames('foo', { bar: true }); // => 'foo bar'

若為false,則不粘進去

classNames('foo', { bar: false }); // => 'foo'

參數類型是數組

var arr = ['b', { c: true, d: false }];
classNames('a', arr); // => 'a b c'

特別注意

null和undefiend會被忽略

classNames(null, false, 'bar', undefined, 0, 1, { baz: null }, ''); // => 'bar 1'

在react中優雅地使用classnames

下面這段代碼,通過if-else判斷state的狀態,動態選擇btnClass的具體值

class Button extends React.Component {// ...render () {var btnClass = 'btn';if (this.state.isPressed) btnClass += ' btn-pressed';else if (this.state.isHovered) btnClass += ' btn-over';return <button className={btnClass}>{this.props.label}</button>;}
}

現在用classnames來做,btnClass就可以邊成一個對象,通過鍵值的條件確定最終生成的classname

import classnames from 'classnames'class Button extends React.Component {// ...render () {var btnClass = classnames({btn: true,'btn-pressed': this.state.isPressed,'btn-over': !this.state.isPressed && this.state.isHovered});return <button className={btnClass}>{this.props.label}</button>;}
}

我的使用

import classnames from 'classnames'<li className="nav-sort">{/* 高亮類名: active */}{tabsList.map((item,index)=><span className={classnames('nav-item',{active:item.type===type})}key={index} onClick={()=>{changTab(item.type)}} >{item.text}</span>)}{/* {tabsList.map((item,index)=><span className={`nav-item ${item.type===type && 'active'}`} key={index} onClick={()=>{changTab(item.type)}} >{item.text}</span>)} */}</li>

原理

classNames源碼:

function classNames() {var classes = [];//用于存儲生成的類名for (var i = 0; i < arguments.length; i++) {//遍歷classnames的所有參數var arg = arguments[i];if (!arg) continue;var argType = typeof arg; //拿到每一個參數的類型if (argType === "string" || argType === "number") { //如果是字符串或數字就直接加到classes數組里classes.push(arg);} else if (Array.isArray(arg)) { //如果參數是數組,則將數組的值當作參數調用自己if (arg.length) {var inner = classNames.apply(null, arg);if (inner) {classes.push(inner);}}} else if (argType === "object") { //如果是對象且有自定義的toString方法,則調用toString方法添加到classes對象里,if里面的表達式下面會詳細介紹if (arg.toString !== Object.prototype.toString &&!arg.toString.toString().includes("[native code]") ) {classes.push(arg.toString());continue;}for (var key in arg) {if (hasOwn.call(arg, key) && arg[key]) { //如果鍵值為真就加進classes數組里classes.push(key);}}}}return classes.join(" ");// 最后在中間加上空格轉成字符串
}

arg.toString !== Object.prototype.toString啥意思?

我們知道所有js對象都繼承Object對象,即都繼承toString方法,這個表達式的意思就是這個對象的toString方法不是繼承自Object.prototype

arg.toString.toString().includes(“[native code]”) 啥意思?

我們首先要知道toString方法的一些知識:當我們對一個自定義函數調用toString()方法時,可以得到該函數的源代碼;如果對內置函數使用toString()方法時,會得到一個’[native code]'字符串。因此,可以使用toString()方法來區分自定義函數和內置函數,注意是對函數調用toString()方法,所以我們通過對toString函數調用toString方法,就能得知這個toString是內置的,還是自定義的

這里兩個表達式連起來的意思就是:現在這個類有toString方法,而且還是自定義的
  References

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/24688.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/24688.shtml
英文地址,請注明出處:http://en.pswp.cn/web/24688.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

KMeans聚類分析星

1. datasample initial_centroids datasample(data, k, Replace, false); 是MATLAB中的命令&#xff0c;用于從數據集data中隨機抽取k個樣本作為初始聚類匯總新&#xff0c;并且抽取時不放回。 datasample&#xff1a;是MATLAB中的函數&#xff0c;用于從數組中隨機抽取樣本d…

halcon算子之prepare_object_model_3d詳解

為某一操作準備三維對象模型。 Description 操作符prepare_object_model_3d準備3D對象模型ObjectModel3D,用于下面目的中給出的操作。它計算操作所需的值并將其存儲在ObjectModel3D中,從而加快了后續操作。沒有必要調用prepare_object_model_3d。但是,如果要多次使用3D對象…

5、js關于數組的常用方法(19種)

一、改變原數組的方法 1.push&#xff08;&#xff09; 末尾添加數據 語法&#xff1a; arr.push(要插入的數據可以多個) // push 尾部添加數據const arr [1,2,3,4,5];arr.push(6,7);console.log(arr);//(7) [1, 2, 3, 4, 5, 6, 7]2. pop&#xff08;&#xff09; 末尾刪除一…

大疆智圖_空三二維重建成果傳輸

一、軟件環境 1.1 所需軟件 1、 大疆智圖&#xff1a;點擊下載&#xff1b; ??2、 ArcGIS Pro 3.1.5&#xff1a;點擊下載&#xff0c;建議使用IDM或Aria2等多線程下載器&#xff1b; ??3、 IDM下載器&#xff1a;點擊下載&#xff0c;或自行搜索&#xff1b; ??4、 Fas…

探索 Noisee AI 的奇妙世界與變現之旅

日賺800&#xff0c;利用淘寶/閑魚進行AI音樂售賣實操 如何讓AI生成自己喜歡的歌曲-AI音樂創作的正確方式 抖音主播/電商人員有福了&#xff0c;利用Suno創作產品宣傳&#xff0c;讓產品動起來-小米Su7 用sunoAI寫粵語歌的方法&#xff0c;博主已經親自實踐可行 五音不全也…

[經驗] 潿洲島在廣西嗎 #職場發展#知識分享#媒體

潿洲島在廣西嗎 廣西潿洲島&#xff0c;是中國南海上的一顆閃亮明珠&#xff0c;位于廣西北部灣沿海&#xff0c;東經108.71度&#xff0c;北緯21.54度&#xff0c;距離北海市區30公里&#xff0c;是中國最大的海島之一&#xff0c;風景秀麗&#xff0c;氣候溫和。島上山青水秀…

!力扣3. 無重復字符的最長子串

給定一個字符串 s &#xff0c;請你找出其中不含有重復字符的 最長子串的長度。 示例 1: 輸入: s "abcabcbb" 輸出: 3 解釋: 因為無重復字符的最長子串是"abc"&#xff0c;所以其長度為 3 示例 2: 輸入: s "bbbbb" 輸出: 1 …

PCE自動裝機

服務端和客戶端 pxe&#xff1a;c/s模式&#xff0c;允許客戶端通過遠程服務器(服務端)下載引導鏡像&#xff0c;加載安裝吻技安&#xff0c;實現自動化安裝操作系統。 無人值守&#xff1a;安裝選項不需要認為干預&#xff0c;可以自動化實現。 pxe優點&#xff1a; 1.規模…

Overall timing accuracy 和Edge placement accuracy 理解

在電子設計自動化(EDA)、集成電路(IC)制造和高速數字電路設計領域,"Overall Timing Accuracy" 和 "Edge Placement Accuracy" 是兩個關鍵的性能指標,它們對于確保電路的功能正確性和性能至關重要。 當涉及到“Overall timing accuracy”(總體時序精度)…

最小相位系統

最小相位系統 1、傳遞函數 一個線性系統的響應。 比如一個RC低通濾波器&#xff1a; 交流分量在電容的充放電中被濾除掉&#xff0c;通過設置電容器的電容值&#xff0c;以及電阻值&#xff0c;能夠控制這種濾除能力&#xff0c;這個參數為RC。 電容的電抗為 1 / j w C 1/j…

單片機+TN901非接觸式紅外測溫設計

摘要 溫度測量技術應用十分廣泛&#xff0c;而且在現代設備故障檢測領域中也是一項非常重要的技術。但在某些應用領域中&#xff0c;要求測量溫度用的傳感器不能與被測物體相接觸&#xff0c;這就需要一種非接觸的測溫方式來滿足上述測溫需求。本論文正是應上述實際需求而設計的…

C語言實戰:貪吃蛇(萬字詳解)

&#x1f4a1;目錄 效果圖 界面設計思路 1. 基本布局 2. 視覺元素 游戲機制設計 基本規則 游戲代碼 前期準備 游戲代碼詳解 數據結構設計 宏定義 數據結構定義 函數原型&#xff08;詳見后文&#xff09; 主函數代碼 核心代碼 Review 效果圖 界面設計思路 1. 基…

轉型AI產品經理(4):“認知負荷”如何應用在Chatbot產品

認知負荷理論主要探討在學習過程中&#xff0c;人腦處理信息的有限容量以及如何優化信息的呈現方式以促進學習。認知負荷定律認為&#xff0c;學習者的工作記憶容量是有限的&#xff0c;而不同類型的認知任務會對工作記憶產生不同程度的負荷&#xff0c;從而影響學習效果。以下…

Python自學(適用于略有基礎)

Python語法&#xff08;基于C語言基礎和簡單Python基礎&#xff09; 參考學習資料&#xff1a;【你覺得自己這輩子都學不會編程&#xff1f;超超超基礎Python課程&#xff0c;3小時快速入門 【自學Python教程合集】【3小時快速入門Python】】 https://www.bilibili.com/video/B…

Elasticsearch 認證模擬題 - 16

一、題目 創建一個搜索模版&#xff0c;要求 match_prase 查詢&#xff0c;并且用指定的格式高亮&#xff0c;并排序 # 創建索引 PUT my_index {"settings": {"number_of_replicas": 0,"number_of_shards": 1},"mappings": {"p…

【SpringCloud學習筆記】Docker(上篇)

Docker 1. 前置準備 在學習Docker之前我們需要具備以下環境&#xff1a; Linux云服務器 / 虛擬機安裝并配置Docker環境&#xff08;命令行中輸入docker -v能夠顯示對應版本證明安裝成功&#xff09; 2. 快速入門 要求&#xff1a; 我們先來嘗試使用Docker創建MySQL服務&am…

如何離線下載 Microsoft Corporation II Windows Subsystem for Android

在本文中&#xff0c;我們將指導您通過一個便捷的步驟來離線下載 Microsoft Corporation II Windows Subsystem for Android。這個過程將利用第三方工具來生成直接下載鏈接&#xff0c;從而讓您能夠獲取該應用程序的安裝包&#xff0c;即使在沒有訪問Microsoft Store的情況下也…

ChatGLM2-6b的本地部署

** 大模型玩了一段時間了&#xff0c;一直沒有記錄&#xff0c;借假期記錄下來 ** ChatGlm2介紹&#xff1a; chatglm2是清華大學發布的中英文雙語對話模型&#xff0c;具備強大的問答和對話功能&#xff0c;擁有長達32K的上下文&#xff0c;可以輸出比較長的文本。6b的訓練參…

HTTP常見響應狀態碼

1xx&#xff1a;正在處理中 100 Continue&#xff1a;服務器確認收到了請求的第一部分&#xff0c;并告知客戶端繼續發送剩余的請求。 101 Switching Protocols&#xff1a;服務器根據客戶端的請求&#xff0c;同意切換到另一個協議。 2xx&#xff1a;成功響應 200 OK&#…

pycharm使用pip安裝依賴包報錯 -----Microsoft Visual C++ 14.0 is required解決方法

pip安裝第三方庫的時候會報錯&#xff1a;需要Microsoft Visual C14.0或更高版本。 報錯原因 因為pip所安裝的包需要使用C編譯后才能夠正常安裝&#xff0c;但是當前安裝環境中缺少完整的C編譯環境&#xff0c;因此安裝失敗。 這樣解決方案就很明確了&#xff0c;安裝完整的C編…