React中的样式处理

最近有在写react应用了,以前总是图简单,直接用inline style。趁着有空,总结一下除了inline style之外更优的react样式处理方法。

1.classname库

便于给组件动态设置className。

impoert React, { Componet } from 'react';import classNames from 'classnames';

class  extends Component {  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>  }}
  1. CSS Modules

    实现组件样式的局部作用域和模块依赖问题。
    使用方法 :
    webpack的css-loader内置了CSS Modules功能,所以使用CSS Modules首先要在webpack配置中启用css Modules,如下

css?modules&localIdentName=[name]__[local]-[hash:base64:5]

? 其中加上modules即为启用,localIdentName是设置样式的命名规则。
? 接着在组件文件中将css样式import进来使用即可。

.normal {  color: #eee;}import style from './styles.css';class Button extends Component {  render(){    return <button className={style.normal}></button>      }}

其它注意

  1. 全局样式:CSS Module默认采用了局部样式,即样式外用:local包裹,生成的css名字附加了一串随机数,以此来实现样式的局部化。
    自己可以用:global来实现全局样式。

    :global(.btn) {…}// more than one syle in gloabl:global {.normal{ ...}.danger{  ...  }}
    1. 样式复用:使用compose
.base{  //通用样式}.normal{    composes:base;      //normal独有样式}

? 此时使用了normal样式的元素或者组件实际会生成两个class。

  1. CSS Modules只会转换class名相关的样式,即只会转变类选择器。所以id选择器或者其他属性选择器的样式不会被css modules进行转化。
  2. CSS Mdoules结合classNames在react中的应用:
    ...import className from 'classnames';import styles from './styles.css';
    
    class Dialog extends Component {    render() {    const cx = classNames({      confirm: !this.state.disabled,      disabledConfirm: this.state.disabled,    });      return (          <div className={styles.root}>            <a className={styles[cx]}>Confirm</a>            </div>      )    }}
  3. 结合react-css-modules库,避免重复输入styles.xx。
     //....import CSSModules from 'react-css-modules'; //...    return (         <div styleName={root}>            <a styleName={cx}>Confirm</a>            </div>    ) export default CSSModules(Dialog, styles);

其它:

ts中import css文件的时候报错。

解决方法:增加一个module definition告诉typescript可以import css文件。

declare module '*.css' {    const content: any;    export default content;}

原文:大专栏  React中的样式处理

原文地址:https://www.cnblogs.com/petewell/p/11614949.html

时间: 2024-10-08 06:38:32

React中的样式处理的相关文章

Andriod React Native 样式表中可用样式属性

写了这么多篇Android React Native的博文,基本上把复杂的东西都搞定了,接下来来看看一些轻松的东西,和布局有关,就是css样式,那么一个View可以设置哪些css样式呢,是和web中的css样式完全一样呢,还是有所不同呢?其实你只要在样式表中书写一个不存在的样式,就会报一大堆错,提示你该样式不存在,然后提供所有可用的样式给你,如图 下面的样式就是样式表中所有可用的属性. "alignItems", "alignSelf", "backfac

React Native 三:样式

一.声明和使用样式 1.React Native里面的样式和使用如下面所示,StyleSheet.create这个构造函数不是必须的: index.android.js文件 import React, { - - } from 'react-native'; class AwesomeProject extends Component { render() { return ( <View> //所有核心组件都可以接受style属性 <Text style={styles.base}&g

React Native之样式

样式 React Native 不实现 CSS,而是依赖于 JavaScript 来为你的应用程序设置样式.这是一个有争议的决定,你可以阅读那些幻灯片,了解背后的基本原理. 声明样式 在 React Native 中声明样式的方法如下: var styles = StyleSheet.create({ base: { width: 38, height: 38, }, background: { backgroundColor: '#222222', }, active: { borderWid

CSS modules 与 React中实践

最近一直在学习React,看上去蛮简单的内容,其实学习曲线还是比较高的. 目前学到css绑定的问题,看到有一篇好的文章,就转过来了. CSS 模块化的解决方案有很多,但主要有两类.一类是彻底抛弃 CSS,使用 JS 或 JSON 来写样式.Radium, jsxstyle ,react-style 属于这一类.优点是能给 CSS 提供 JS 同样强大的模块化能力:缺点是不能利用成熟的 CSS 预处理器(或后处理器) Sass/Less/PostCSS, :hover 和 :active 伪类处理

在React中使用Redux

修复遗留问题 webpack.prod.config.js中缺少了对path库的引用,执行构建npm run build:prod的时候失败.在文件开始的地方引入node.js的path库就可以了. package.json里面定义了一个build:dev的脚本,这个脚本其实有点多余,不过有时候需要打包测试版本的文件,所以还是需要存在.主要有个问题是webpack.dev.config.js中output节点下错误定义了path的值为根目录'/',这在使用npm start命令启动运行时打包的时

React中css的使用

网页的布局.颜色.形状等UI展示方式主要是由Css进行设置,在ReactJs中也是一样.ReactJs中的Css结构方式与传统的Web网页类似,但依然存在一些差异.ReactJs中Css文件本身的编写上并没有差异,我们可以定义特定的样式类名,也可以正对Html元素定义样式.差异主要在React对Css的使用上 引用的差异: 传统html文件中css文件引用方式: <link rel="stylesheet" type="text/css" href="

整理下react中常见的坑

其实有些也不能算是坑,有些是react的规定,或者是react的模式和平常的js处理的方式不同罢了 1.setState()是异步的this.setState()会调用render方法,但并不会立即改变state的值,state是在render方法中赋值的.所以执行this.setState()后立即获取state的值是不变的.同样的直接赋值state并不会出发更新,因为没有调用render函数. 2.组件的生命周期componentWillMount,componentDidMount 只有在

React中jquery引用

在项目中使用了table元素,但点击tr元素时要添加click事件,同时table的行元素会在react中获取到数据时动态渲染,此时想到之前在jQuery用使用on来绑定事件 例如jQuery中绑定的方式: //订单列表table点击时切换行的样式$(".classname table").on("click", 'tr', function () { var $select = $(this); .....}); 于是在react中引用jQuery,使用npm i

react中使用canvas播放视频

最近做个移动端视频需求,要求隐藏播放控件,并且可以自动播放而且隐藏播放控件(不太人性化),最后要有个定制的结束遮罩层用来人机交互.尝试直接用video标签做,但是各种坑啊,video永远是在页面的最顶层,所以播放控件的自定义化就凉凉了,怎么办呢?受以前做的一个利用canvas做视频直播的项目启发,尝试下canvas做视频播放,于是我抱着试一试的心态去查阅了相关资料,尼玛,还真的可以,而且原理很简单! 首先要解决在react中操作canvas的问题,众所周知,react和vue都是生成的虚拟dom