关于React动态修改元素样式的三种方式

目录
  • React动态修改元素样式
    • 1.借助ref动态修改样式
    • 2.通过动态控制状态的变化修改元素的样式(两种方式)
    • 3.通过在DOM中使用JS代码(三元运算符)
  • React样式冲突问题
    • css-样式私有化
    • cssModules-维持类名
    • css modules-最佳实践

React动态修改元素样式

React动态修改元素样式常用的方式有两种:借助ref和通过动态控制状态的变化修改元素的样式

1.借助ref动态修改样式

在需要修改样式的元素上添加ref

<div className='scroll-title clear-fix' ref={ this.manage }>

在constructor中添加React.createRef()

this.manage = React.createRef()

在逻辑代码中使用

this.manage.current.style.display = 'block'

如果代码中识别不出this的话需要通过let that = this 改变this的指向

that.manage.current.style.display = 'block'

2.通过动态控制状态的变化修改元素的样式(两种方式)

方式一

逻辑代码中设置一个标志位display默认为true,通过对应的条件改变display的值为true或者false,进而将对应的样式名赋值给DOM的className属性,样式写在对应的style当中

例如:

 constructor() {
        super()
        this.state = {
            display: true
        }
    }   
    componentDidMount() {
        window.onscroll = function(event) {
                if (divTop < -12) {
                     that.setState({
                         display: false
                     })
                    that.manage.current.style.display = 'block'
                } else {
                     that.setState({
                         display: true
                     })
                }
        }
    }
<div className={this.state.display ? 'none' : 'scroll-title }>

方式二

方式二和方式一实现的原理是一样的,逻辑代码中设置一个标志位display默认为true,通过对应的条件改变display的值为true或者false,进而将对应的样式名赋值给DOM的className属性,样式写在对应的style当中,不同之处在于逻辑代码的判断不是在DOM中,而是在js中判断的,如下:

3.通过在DOM中使用JS代码(三元运算符)

实现不同DOM的展示与隐藏转换

方式三并不是严格意义上的改变样式,只是用来改变显示与隐藏及展示对应的组件的

小结一下:

  • 如果改变的样式比较多而杂使用 2
  • 如果改变的样式不太多使用 1和2
  • 如果仅仅是两个组件的切换(显示与隐藏)使用 3最方便

React样式冲突问题

在react脚手架中已经有了sass的配置,因此只需要安装sass的依赖包,就可以直接使用sass了

安装sass依赖包

npm i sass -D 

- 把index.css改成index.scss

- 导入index.scss文件

注意:如果使用了scss,scss中使用图片的绝对路径的时候需要加上~

background-image: url(~assets/login.png); 

css-样式私有化

css modules-基本使用

步骤

1.改样式文件名。从 xx.scss -> xx.module.scss (React脚手架中的约定,与普通 CSS 作区分)

2.引入使用。

  • 组件中导入该样式文件(注意语法)
import styles from './index.module.scss'
  • 通过 styles 对象访问对象中的样式名来设置样式
<div className={styles.css类名}></div>

css类名是index.module.scss中定义的类名。

示例

定义样式 index.module.css

.root {font-size: 100px;}

使用样式

import styles from './index.module.css'
<div className={styles.root}>div的内容</div>

原理

CSS Modules 通过自动给 CSS 类名补足类名,保证类名的唯一性,从而避免样式冲突的问题

css module的注意点 

类名最好使用驼峰命名,因为最终类名会生成styles的一个属性

cssModules-维持类名

格式

在xxx.module.scss中,如果希望维持类名,可以使用格式:

:global(.类名)

/*这样css modules就不会修改掉类名.a了。等价于写在 index.css中 */
:global(.a) {   }
 
/* 这样css modules就不会修改掉类名.a了, 但是 .aa还是会被修改 */
.aa :golbal(.a) { }

覆盖第三方组件的样式

:global(.ant-btn) {
  color: red !important;
}

css modules-最佳实践

- 每个组件的根节点使用 CSSModules 形式的类名( 根元素的类名: root )

- 其他所有的子节点,都使用普通的 CSS 类名 :global

index.module.scss中

// index.module.scss
.root {
  display: 'block';
  position: 'absolute';
  // 此处,使用 global 包裹其他子节点的类名。此时,这些类名就不会被处理,在 JSX 中使用时,就可以用字符串形式的类名
  // 如果不加 :global ,所有类名就必须添加 styles.title 才可以
  :global {
    .title {
      .text {
      }
      span {
      }
    }
    .login-form { ... }
  }
}

组件使用

import styles from './index.module.scss'
const 组件 = () => {
  return (
    {/* (1) 根节点使用 CSSModules 形式的类名( 根元素的类名: `root` )*/}
      <div className={styles.root}>
      {/* (2) 所有子节点,都使用普通的 CSS 类名*/}
        <h1 className="title">
          <span className="text">登录</span>  
          <span>登录</span>  
      </h1>
            <form className="login-form"></form>
    </div>
  )
}

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

(0)

相关推荐

  • 详解react的两种动态改变css样式的方法

    第一种:动态添加class,以点击按钮让文字显示隐藏为demo import React, { Component, Fragment } from 'react'; import './style.css'; class Demo extends Component{ constructor(props) { super(props); this.state = { display: true } this.handleshow = this.handleshow.bind(this) thi

  • React中使用外部样式的3种方式(小结)

    一.关于css-in-js的认识 1.css-in-js是一种使用 js 编写 css 样式的 css 处理方案.它的实现方案有很多,比如styled-components.polished.glamorous(paypal 开源的,不再维护).radium.emotion等等. 2.其中最成熟的便是styled-components和emotion.它们真正意义上实现了组件化style,可以说是专门为 react 打造的. 二.styled-components 简介 styled-compo

  • ReactJs设置css样式的方法

    前段时间看了React Native,但是感觉在安卓反面的开发并不成熟.有较多功能有待完善,而且自己在实际运用的过程中在一些模块上遇到了不晓得阻力,又苦于网上没有找到那么多资源.于是打算先放一段时间,还是回过头来看ReactJs吧. React颠覆了html的传统思维,代码基本都写在<script  type="text/babel"></script>标签里面.我开发的时候采用的是IDEA,当然也可以使用atom或者webstor.使用IDEA时,需要在set

  • 关于React动态修改元素样式的三种方式

    目录 React动态修改元素样式 1.借助ref动态修改样式 2.通过动态控制状态的变化修改元素的样式(两种方式) 3.通过在DOM中使用JS代码(三元运算符) React样式冲突问题 css-样式私有化 cssModules-维持类名 css modules-最佳实践 React动态修改元素样式 React动态修改元素样式常用的方式有两种:借助ref和通过动态控制状态的变化修改元素的样式 1.借助ref动态修改样式 在需要修改样式的元素上添加ref <div className='scroll

  • 详解React中共享组件逻辑的三种方式

    废话少说,这三种方式分别是:render props.高阶组件和自定义Hook.下面依次演示 假设有一个TimeOnPage组件专门用来记录用户在当前页面停留时间,像这样: const TimeOnPage = () => { const [second, setSecond] = useState(0); useEffect(() => { setTimeout(() => { setSecond(second + 1); }, 1000); }, [second]); return

  • Python Selenium 设置元素等待的三种方式

    Selenium 设置元素等待的三种方式 1. sleep 强制等待     2. implicitly_wait() 隐性等待     3. WebDriverWait()显示等待 三种方式的优缺点 1. sleep 强制等待 from selenium import webdriver from time import sleep driver = webdriver.Chrome() sleep(2) #设置等待2秒钟 driver.get('http://www.baidu.com')

  • React路由组件传参的三种方式(params、search、state)

    目录 向路由组件传递params参数 向路由组件传递search参数 向路由组件传递state参数 总结三种向路由组件传参的方式 向路由组件传递params参数 当点击消息1这个导航链接时,展示下方对应的Detail路由组件,并向这个组件传递params参数(ID,TITLE,CONTENT)信息. 向路由组件传递params参数:在路径后面跟上想要传递的值 { messageArr.map((msgObj) => { return ( <li key={msgObj.id}> <

  • Java 数组元素倒序的三种方式(小结)

    将数组元素反转有多种实现方式,这里介绍常见的三种. 直接数组元素对换 @Test public void testReverseSelf() throws Exception { System.out.println("use ReverseSelf"); String[] strings = { "ramer", "jelly", "bean", "cake" }; System.out.println(

  • JS获取和修改元素样式的实例代码

    1.获取元素样式: 可以通过元素的style属性,获取元素行内样式.style属性是一个对象,包括一系列样式属性.例如:color, backgourdColor. 上面讲的通过style属性获取元素样式,不推荐使用. 下面的一段代码,可以获取元素运行时的样式,即全局的样式.这种方式可以动态获取元素的样式,例如元素大小. // node:将要获取其计算样式的元素节点 // attr: 样式属性名称 function getCurrentStyle(node, attr) { var style

  • 如何用JavaScript实现动态修改CSS样式表

    看过我写的<用JavaScript动态建立或增加CSS样式表的实现方法>之后,你就很容易想明白如何修改CSS样式表了. 正好今天在论坛碰到一位朋友问这样的一个问题: <style> .ls{width=120px;} </style> <script> //在这里加一句来改变.ls中width的值,如何写 </script> 有的朋友回答:"如果使用.ls的对象很多的话,用JS确实不方便, jquery方便,$(".ls&qu

  • python修改list中所有元素类型的三种方法

    修改list中所有元素类型: 方法一: new = list() a = ['1', '2', '3'] for x in a: new.append(int(x)) print(new) 方法二: a = ['1', '2', '3'] b = [int(x) for x in a] print(b) 方法三: a = ['1', '2', '3'] print(map(int, a)) 以上这篇python修改list中所有元素类型的三种方法就是小编分享给大家的全部内容了,希望能给大家一个参

  • 详解三种方式解决vue中v-html元素中标签样式

    Vue为v-html中标签添加CSS样式 <template> <div class="hello"> <section> <h2 class="title">{{news.title}}</h2> <p class="news-time">{{news.datetime}}</p> <div class="con" v-html=&qu

  • ElementUI 修改默认样式的几种办法(小结)

    ElementUI 是一套ui组件库,目前最新版本 react 和 vue 等主流框架都有支持.该库默认主题色是天蓝色,若用于项目开发,难免遇到要需求修改其默认样式的情况,本文就基于 react 和 vue 框架介绍几种修改 ElementUI 默认样式的办法. ElementUI下载官网:http://element.eleme.io/#/zh-CN Vue 安装: npm i element-ui -S 使用: import Vue from 'vue'; import ElementUI

随机推荐