React中如何设置多个className

 更新时间:2023年01月17日 09:06:12   作者:sky_Wolf丶  
这篇文章主要介绍了React中如何设置多个className问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

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 等三方的库来解决问题。笔者的写法不一定是最好的,但无论是从开发代码的规整度,还是从二次翻阅代码的舒适度、都是目前个人觉得不错的一个写法。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • React Hooks之usePolymerAction抽象代码结构设计理念

    React Hooks之usePolymerAction抽象代码结构设计理念

    这篇文章主要为大家介绍了React Hooks之usePolymerAction抽象代码结构设计理念,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-09-09
  • React Native第三方平台分享的实例(Android,IOS双平台)

    React Native第三方平台分享的实例(Android,IOS双平台)

    本篇文章主要介绍了React Native第三方平台分享的实例(Android,IOS双平台),具有一定的参考价值,有兴趣的可以了解一下
    2017-08-08
  • React 服务器组件的使用方法详解

    React 服务器组件的使用方法详解

    最近,React 服务器组件受到了广泛的关注和热捧,这是因为 React 服务器组件允许开发人员将与组件相关的任务外包给服务器,在本文中,我们将讨论什么是 React 服务器组件,以及如何将它们集成到构建应用程序中,需要的朋友可以参考下
    2023-10-10
  • react+antd树选择下拉框中增加搜索框

    react+antd树选择下拉框中增加搜索框

    这篇文章主要介绍了react+antd树选择下拉框中增加搜索框方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-06-06
  • 深入浅析React refs的简介

    深入浅析React refs的简介

    React中的Refs提供了一种方式,允许我们访问DOM节点或在render方法中创建的React元素,本文给大家介绍react refs的相关知识,感兴趣的朋友一起看看吧
    2021-07-07
  • react使用antd-design中select不能及时刷新问题及解决

    react使用antd-design中select不能及时刷新问题及解决

    这篇文章主要介绍了react使用antd-design中select不能及时刷新问题及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-03-03
  • React的diff算法核心复用图文详解

    React的diff算法核心复用图文详解

    这篇文章主要为大家介绍了React的diff算法核心复用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08
  • webpack构建react多页面应用详解

    webpack构建react多页面应用详解

    这篇文章主要介绍了webpack构建react多页面应用详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-09-09
  • React路由的history对象的插件history的使用解读

    React路由的history对象的插件history的使用解读

    这篇文章主要介绍了React路由的history对象的插件history的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-10-10
  • 详解React中合并单元格的正确写法

    详解React中合并单元格的正确写法

    用表格进行页面布局,页面布局在各种浏览器的的兼容性, 本文主要介绍了详解React中合并单元格的正确写法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-01-01

最新评论