網站首頁 編程語言 正文
React設置多個className
在一個元素上設置樣式,有一個固定的樣式,然后還有一個使用三元運算符根據條件添加的樣式。
比如說有一個固定樣式"title":
<div className="title">標題</div>
然后還要一個點擊高亮的樣式:
<div className={index === this.state.active ? "active" : null}>標題</div>
不能這樣寫:
<div className="title" className={index === this.state.active ? "active" : null}>標題</div>
方法一:ES6 模板字符串 ``
className={`title ${index === this.state.active ? 'active' : ''}`}
方法二:join("")
className={["title", index === this.state.active?"active":null].join(' ')}
方法三:classnames(需要下載classnames)
const classNames = require('classnames');
?
const Button = React.createClass({
? // ...
? render () {
? ? const 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>;
? }
});
個人喜好 第二種,一方面代碼量少,另一方面方便對 className數組的增加與刪除。
React className的寫法
本文中展示的,都是多className情況下的寫法,提供的寫法都是筆者個人的一些經驗總結,并不一定是最標準的寫法,但是符合高內聚,低耦合的工程思想。
(ps:csdn里貌似 jsx 的代碼高亮有些問題,我就用模板字符串包住了)
模板字符串的寫法
//寫法一
export default class A extends Component {
state ={
work: true,
sabbatical: false,
}
render(){
return (
`<div
className={`calend-item ${work ? '' : "off-day"} ${sabbatical ? "sabbatical" : ''}`}
>
{/*...............*/}
</div >`
)
}
}
//寫法二
export default class B extends Component {
state ={
work: true,
sabbatical: false,
}
render(){
return (
`<div
className={`
'calend-item'
${work ? '' : "off-day"}
${sabbatical ? "sabbatical" : ''}
`}
>
{/*...............*/}
</div >`
)
}
}
寫法一:模板字符串非折疊的寫法,不僅代碼看起來非常的惡心,而且萬一少一個空格隔開,是沒有錯誤提示的(這點是最致命的),同時最后render出的html結構中還會帶來無意義的空格(見下圖 )。
寫法二:模板字符串折疊的寫法,雖然代碼看起來清楚了些也不會少敲空格,但是最后render出的html結構中不僅有空格,還有換行(見下圖)顯然是顧此失彼。
formatClass的方法
顯然模板字符串帶來了很多的麻煩。
既然className本質上就是要得到一個字符串,那么我們就自己寫個方法來得到目標字符串。
//寫法三
export default class A extends Component {
state ={
work: true,
sabbatical: false,
}
render(){
//可以將所有的className屬性都塞入下面的對象中
let _class = formatReactClass({
item: [
'calend-item',
work ? null : "off-day",
sabbatical ? "sabbatical" : null,
]
})
return (
`<div className={_class.item} >
{/*...............*/}
</div >`
)
}
}
//下面倆函數可以放到自己項目里的工具函數模塊中
/**
* @description: 格式化組件class
* @param {Object} classObj
* @return {Object}
*/
function formatReactClass(classObj) {
return mapObj(classObj, i =>
Array.isArray(i) ? i.filter(i => i && i !== '').join(' ') : i
);
}
/**
* @description: map對象
* @param {Object} Obj
* @param {Function} callback should be returnable
* @return {Object}
*/
function mapObj(Obj, callback) {
let res = {};
Object.keys(Obj).forEach(i => (res[i] = callback(Obj[i])));
return res;
}
寫法三:我們將所有的className屬性的值都塞入一個對象中(高內聚思想的體現),同時使用formatReactClass工具函數格式化我們的_class對象。使我們的無論是代碼中,還是最后render出的html結構中的class屬性都十分的規整。
小結:除了上述寫法、還可以引入如?classnames 等三方的庫來解決問題。筆者的寫法不一定是最好的,但無論是從開發代碼的規整度,還是從二次翻閱代碼的舒適度、都是目前個人覺得不錯的一個寫法。
總結
原文鏈接:https://blog.csdn.net/qq_35605231/article/details/84974029
相關推薦
- 2023-01-13 Pytorch如何加載自己的數據集(使用DataLoader讀取Dataset)_python
- 2022-11-05 go?module化?import?調用本地模塊?tidy的方法_Golang
- 2022-04-22 Spring AOP 在注解上使用SPEL表達式注入對象
- 2022-05-27 python繪制棉棒圖的方法詳解_python
- 2022-05-03 ASP.NET?Core基于滑動窗口實現限流控制_實用技巧
- 2022-11-10 C語言strlen函數全方位講解_C 語言
- 2022-10-30 C++中線程池ThreadPool源碼解析_C 語言
- 2022-08-10 C語言如何在字符數組中插入一個字符_C 語言
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支