React項(xiàng)目中className運(yùn)用及問(wèn)題解決
拋出問(wèn)題
className 大家都用過(guò)吧,用它在 react 項(xiàng)目中設(shè)置樣式。它的用法很簡(jiǎn)單,除了可以設(shè)置一個(gè)樣式外,react 中也可以使用 className 引入多個(gè)類樣式。
這次在寫(xiě)項(xiàng)目的時(shí)候,碰到一個(gè)非常小但是當(dāng)時(shí)卻一直解決不了的問(wèn)題。后面在復(fù)盤(pán)的時(shí)候?qū)⑺鉀Q了。問(wèn)題大致是這樣的:
有兩個(gè)活動(dòng)頁(yè),每個(gè)活動(dòng)頁(yè)上都有一個(gè)活動(dòng)規(guī)則圖標(biāo)來(lái)彈出活動(dòng)規(guī)則,活動(dòng)規(guī)則圖標(biāo)距離頂部會(huì)有一個(gè)值?,F(xiàn)在問(wèn)題就是這個(gè)活動(dòng)規(guī)則在這兩個(gè)活動(dòng)頁(yè)距離頂部的這個(gè)值是不一樣的,但是我已經(jīng)將這個(gè)活動(dòng)規(guī)則圖標(biāo)做成了組件,并在這兩個(gè)活動(dòng)頁(yè)里都調(diào)用了它,從而導(dǎo)致兩個(gè)頁(yè)面的樣式會(huì)相同。如下圖所示:

解決問(wèn)題
這個(gè)問(wèn)題不算很大,但是屬于細(xì)節(jié)問(wèn)題。就和我的組長(zhǎng)所說(shuō)的一樣,一個(gè)項(xiàng)目應(yīng)該要做到先完成再完美。所以我當(dāng)時(shí)的解決方法是再寫(xiě)一個(gè)活動(dòng)規(guī)則組件,只是將距離頂部的值做出修改即可。效果確實(shí)是達(dá)到了,不過(guò)在最后復(fù)盤(pán)代碼的時(shí)候,組長(zhǎng)注意到了這兩個(gè)組件,并開(kāi)始詢問(wèn)我為什么這樣做。
組長(zhǎng):Rule_1 和 Rule_2 這兩個(gè)組件是什么意思,我看它們沒(méi)有很大的區(qū)別呀。
我便簡(jiǎn)單說(shuō)了一下緣由。
組長(zhǎng)接著說(shuō):你忘了組件是什么嗎?一個(gè) CSS 樣式值不同就大費(fèi)周章地新增一個(gè)組件,這豈不是太浪費(fèi)了。再去想想其他方案。
通過(guò)這一番談話我想起了組件化思想的運(yùn)用,發(fā)現(xiàn)之前解決的這個(gè)小問(wèn)題解決的并不夠好。于是,我就帶著組件化思想又來(lái)重新完善它。
我重新寫(xiě)了一個(gè) demo 代碼,將主要內(nèi)容和問(wèn)題在 demo 代碼中體現(xiàn)出來(lái)。下面是原版活動(dòng)規(guī)則組件 demo 代碼,之后的代碼都是基于 demo 代碼完成的
import React from "react";
import "./index.css";
const Header = ({ onClick }) => {
return (
<>
<div className="container_hd">
<div
className='affix'
onClick={onClick}
></div>
</div>
</>
);
};
export default Header;
組件化思想
我自己?jiǎn)栕约海杭热灰呀?jīng)寫(xiě)好了一個(gè)活動(dòng)規(guī)則組件,為什么僅僅因?yàn)橐粋€(gè)樣式值的不同而去新增一個(gè)功能一樣的組件?很顯然,這種方法是最笨的方案。既然是組件,那就應(yīng)該要有復(fù)用性,或者說(shuō)只需在原有的基礎(chǔ)上稍加改動(dòng)就可達(dá)到效果。
這是樣式的問(wèn)題,因此要從根本上解決問(wèn)題。單純地修改 CSS 樣式肯定不行,因?yàn)閮蓚€(gè)頁(yè)面兩個(gè)不同的樣式。
className運(yùn)用
className 就不用多介紹了,經(jīng)常能使用,咱們直接來(lái)看如何解決問(wèn)題。在這里我定義了一個(gè) Value 值,用來(lái)區(qū)分是在哪個(gè)頁(yè)面的,比如分別有提交頁(yè)和成功頁(yè),我在成功頁(yè)設(shè)置一個(gè) Value 值,,然后將 Value 值傳入到活動(dòng)規(guī)則組件,那么在活動(dòng)規(guī)則組件里只需要判斷 Value 值是否等于成功頁(yè)的 Value 值即可。在 className 處做一個(gè)三元判斷,如下所示:
className={`affix_${Value === "0" ? "main" : "submit"}`}
相當(dāng)于如果 Value 等于0的時(shí)候類名為affix_main,否則為affix_submit。最后再 css 將樣式完善即可。完整代碼可以參考如下:
- 成功頁(yè)組件
import Header from "./components/Header";
const Success = () => {
const Value = "0";
return (
<div style={{ backgroundColor: "purple", width: "375px", height: "670px" }}>
<Header Value={Value}></Header>
</div>
);
};
export default Success;
- 活動(dòng)規(guī)則組件
import React from "react";
import "./index.css";
const Header = ({ onClick, Value }) => {
return (
<>
<div className="container_hd">
<div
className={`affix_${Value === "0" ? "main" : "submit"}`}
onClick={onClick}
></div>
</div>
</>
);
};
export default Header;
- 活動(dòng)規(guī)則組件樣式
.container_hd {
width: 100%;
}
.affix_main {
position: absolute;
top: 32px;
right: -21px;
z-index: 9;
width: 84px;
height: 26px;
background: url('./assets/rule.png');
background-size: contain;
background-repeat: no-repeat;
}
.affix_submit {
position: absolute;
top: 12px;
right: -21px;
z-index: 9;
width: 84px;
height: 26px;
background: url('./assets/rule.png');
background-size: contain;
background-repeat: no-repeat;
}


通過(guò)對(duì)比效果圖可以看出,兩者的效果確實(shí)發(fā)生變化。完成之后,我心里在想:為什么當(dāng)時(shí)就沒(méi)想出這個(gè)簡(jiǎn)單易行的方案呢?動(dòng)態(tài)判斷并設(shè)置類名,至少比最開(kāi)始的新增一個(gè)組件的方法高級(jí)多了。
總結(jié)問(wèn)題
通過(guò)這個(gè) className 的靈活使用,讓我對(duì) className 的用法有了更進(jìn)一步的掌握,也不得不感嘆組件化思想的廣泛運(yùn)用,這里最大程度地將組件化思想通過(guò)className 發(fā)揮出來(lái)。
因此,希望通過(guò)這個(gè)問(wèn)題,來(lái)學(xué)會(huì) className 的靈活用法,并理解好組件化思想。
以上就是React項(xiàng)目中className運(yùn)用及問(wèn)題解決的詳細(xì)內(nèi)容,更多關(guān)于React項(xiàng)目className運(yùn)用的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
React使用useEffect解決setState副作用詳解
這篇文章主要為大家介紹了React使用useEffect解決setState副作用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-10-10
React語(yǔ)法中設(shè)置TS校驗(yàn)規(guī)則的步驟詳解
這篇文章主要給大家介紹了React語(yǔ)法中如何設(shè)置TS校驗(yàn)規(guī)則,文中有詳細(xì)的代碼示例供大家參考,對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2023-10-10
React?Hooks?實(shí)現(xiàn)的中文輸入組件
這篇文章主要為大家介紹了React?Hooks實(shí)現(xiàn)的中文輸入組件示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-05-05
react中使用redux-persist做持久化儲(chǔ)存的過(guò)程記錄
這篇文章主要介紹了react中使用redux-persist做持久化儲(chǔ)存的相關(guān)資料,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2024-01-01
React中實(shí)現(xiàn)編輯框自動(dòng)獲取焦點(diǎn)與失焦更新功能
在React應(yīng)用中,編輯框的焦點(diǎn)控制和數(shù)據(jù)回填是一個(gè)常見(jiàn)需求,本文將介紹如何使用useRef和useEffect鉤子,在組件中實(shí)現(xiàn)輸入框自動(dòng)獲取焦點(diǎn)及失焦后更新數(shù)據(jù)的功能,文中通過(guò)代碼示例給大家講解的非常詳細(xì),需要的朋友可以參考下2024-01-01
React Native項(xiàng)目中使用Lottie動(dòng)畫(huà)的方法
這篇文章主要介紹了React Native 實(shí)現(xiàn)Lottie動(dòng)畫(huà)的相關(guān)知識(shí),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-10-10

