react 通过 classnames 处理 多个class 的问题
react原生动态添加多个className会报错:
- import style from './style.css'
- <div className={style.class1 style.class2}</div>
想要得到最终渲染的效果是:
- <div class='class1 class2'></div>
引入classnames库,安装:
- npm install classnames --save
使用:
- import classnames from 'classnames'
- <div className=classnames({
- 'class1': true,
- 'class2': true
- )>
- </div>
可以将后面的true省略,但这种我认为是比较直观的,可以对传入的class进行比较明显的动态判断
其他用法:
- classNames('foo', 'bar'); // => 'foo bar'
- classNames('foo', { bar: true }); // => 'foo bar'
- classNames({ 'foo-bar': true }); // => 'foo-bar'
- classNames({ 'foo-bar': false }); // => ''
- classNames({ foo: true }, { bar: true }); // => 'foo bar'
- classNames({ foo: true, bar: true }); // => 'foo bar'
- // lots of arguments of various types
- classNames('foo', { bar: true, duck: false }, 'baz', { quux: true }); // => 'foo bar baz quux'
- // other falsy values are just ignored
- classNames(null, false, 'bar', undefined, 0, 1, { baz: null }, ''); // => 'bar 1'
也可以传入数组对象:
- var arr = ['b', { c: true, d: false }];
- classNames('a', arr); // => 'a b c'
可以传入动态class
- let buttonType = 'primary';
- classNames({ [`btn-${buttonType}`]: true });
在react中可以直接在classname内部传入动态class并进行条件判断,
不适用classnames时的书写方式:
- var Button = React.createClass({
- // ...
- 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>;
- }
- });
使用了之后可以简化:
- var classNames = require('classnames');
- var Button = React.createClass({
- // ...
- 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>;
- }
- });
.
react 通过 classnames 处理 多个class 的问题的更多相关文章
- react+classnames
之前做项目的时候一直不知道有不知道有classnames这个东西,一直用的都是字符串拼接,感觉用的很别扭. classnames用法和angular1.x及vue差不多,所以用起来会比较顺手 1)安装 ...
- classnames & React & taro
classnames & React & taro classnames https://www.npmjs.com/package/classnames demo https://g ...
- 野心勃勃的React组件生命周期
当你还在写着Angular指令,过滤器,注入,服务,提供者,视图模版的时候,是不是觉得很烦,好在这个时候,React已经神一样的出现在历史舞台. React组件 React实现了UI=Fn(St ...
- [React Testing] Conditional className with Shallow Rendering
Often our components have output that shows differently depending on the props it is given; in this ...
- [闲的蛋疼系列]从零开始用TypeScript写React的UI组件(0)-先写一个Button??
0.咸鱼要说的 一入前端深似海,咸鱼入海更加咸. 最近闲的蛋疼,手上年前的事也完成了7788了,借助[PG1]的话来说,我们要keep real. 咸鱼肯定不real 了,因为我们都活在梦里,所以咱们 ...
- react 自定义 TabBar 组件
1.创建 组件 src/components/TabBar/index.js /** * TabBar 组件 */ import React ,{ PureComponent } from 'reac ...
- 前端笔记之React(二)组件内部State&React实战&表单元素的受控
一.组件内部的State 1.1 state state叫状态,是每一个类式组件都有的属性,但函数式组件,没有state. state是一个对象,什么值都可以定义. 在任何类式组件的构造函数中,可以用 ...
- 前端笔记之React(四)生命周期&Virtual DOM和Diff算法&日历组件开发
一.React生命周期 一个组件从出生到消亡,在各个阶段React提供给我们调用的接口,就是生命周期. 生命周期这个东西,必须有项目,才知道他们干嘛的. 1.1 Mouting阶段[装载过程] 这个阶 ...
- react项目中canvas之画形状(圆形,椭圆形,方形)
组件DrawShape.jsx如下: import React, { Component } from 'react' // import ClassNames from 'classnames' i ...
随机推荐
- selenium - 弹出框操作
# 6. 弹出框操作 # 6.1 页面弹出框操作# 页面弹出框 是一个html页面的元素,由用户在页面的操作触发弹出# (1)执行触发操作之后,等待弹出框出现之后,# (2)再定位弹出框中的元素并操作 ...
- EOJ Monthly 2018.3
985月赛我只喜欢ECNU.jpg A. 打工时不可能打工的 Time limit per test: 2.0 seconds Memory limit: 256 megabytes 我 Ayano ...
- Collection类及常用API
Collection类及常用API Collection—类集工具类,定义了若干用于类集和映射的算法,这些算法被定义为静态方法,具体查看api文档; a) public static void so ...
- [LOJ#515]「LibreOJ β Round #2」贪心只能过样例
[LOJ#515]「LibreOJ β Round #2」贪心只能过样例 试题描述 一共有 \(n\) 个数,第 \(i\) 个数 \(x_i\) 可以取 \([a_i , b_i]\) 中任意值. ...
- 【CCF】高速公路 tarjan强连通缩点
[题意] 给定一个有向图,问图中互相可达(强连通)的点有多少对 [AC] 强连通缩点,缩点后是一个DAG,所以互相可达的点只在强连通块里. #include<iostream> #incl ...
- 【Vijos1222】等值拉面(DP)
题意:有N个数对(a[i],b[i]) 每次可以把(x,y)变成(x+a[i],y+b[i])或(x+b[i],x+a[i]),后者称为交换一次 求使abs(x-y)最小时的最小交换次数 n<= ...
- Mysql基本操作语句【重要】
一.对数据库的操作 1. 创建一个库 create database 库名 create database 库名 character set 编码
- Linux 虚拟内存和物理内存的理解【转】
转自:http://www.cnblogs.com/dyllove98/archive/2013/06/12/3132940.html 首先,让我们看下虚拟内存: 第一层理解 1. 每 ...
- 51深入理解C指针之---指针与线程
一.size_t:用于安全表示长度,所有平台和系统都会解析成自己对应的长度 1.定义:size_t类型表示C中任何对象所能表示的最大长度,是个无符号整数:常常定义在stdio.h或stdlib.h中 ...
- 系统虚拟内存的理解 转载自http://blog.csdn.net/do2jiang/article/details/4690967
在进入正题前先来谈谈操作系统内存管理机制的发展历程,了解这些有利于我们更好的理解目前操作系统的内存管理机制. 一 早期的内存分配机制 在 早期的计算机中,要运行一个程序,会把这些程序全都装入内存,程序 ...