material UI是一个流行的与React配套的前端UI框架,对于开发者而言,熟悉它的样式修改方案是必要的。但目前相关资料并不直观,并且没有总结到一起。如果对相关特性不太清楚,开发者很可能会在样式上苦恼不已,本文主要根据笔者的开发经验总结几种常见的修改子组件样式方案,有了这些方案,几乎所有的情况都能应对了。

  本文针对的是在父组件中修改子组件的样式的情况,这是因为在当前组件中修改当前组件的样式并没有什么难度,而实际开发中复杂一点的情况几乎都发生在父组件中修改子组件样式的情况。

  本文以withStyle为例,makeStyle类似。

一、子组件根元素:withStyles+className

如果要在父组件中修改子组件的根元素,那么这相当于是在当前组件中修改当前组件的样式,因为子组件根元素属于父组件中直接可见的一个标签。

直接给子组件应用className:

//父组件Parent.jsx中
<div>
<Child className={classes.child}></Child>
</div>

传递给withStyles的样式对象:

const styles = {
child: {
color: 'red'
}
}

将样式对象和父组件传递给withStyles,最后导出高阶组件:

import { withStyles } from '@material-ui/core';
function Parent({classes}){
}
export default withStyles(styles)(Parent);

二、子组件的子孙元素:withStyles+className+&

如果要在父组件中修改子组件的子孙元素的样式,那么会稍微复杂一些。事实上,只需要在样式中嵌套即可。

给子组件的根元素设置好className:

//父组件Parent.jsx中
<div>
<Child className={classes.child}></Child>
</div>

在样式对象中嵌套样式来设置子组件的子孙元素:

const styles = {
child: {
color: 'red',
"& .title":{
color: 'blue'
},
"&$center":{
color: 'gray'
}
},
center:{
textAlign: 'center'
}
}

以上案例中,&是占位符,代表当前选择器;$是变量标识,实质上是一个选择器,$center代表styles中的center编译后的类名。

现在,导出高阶组件:

import { withStyles } from '@material-ui/core';
function Parent({classes}){
}
export default withStyles(styles)(Parent);

三、子组件的子孙元素:withStyles + classes

对于提供了样式Api的子组件,也可以使用classes来直接设置,而不用像方案二那样嵌套。

直接给子组件的classes属性传入对象,注意这里是classes属性,而不是className属性:

//父组件Parent.jsx中
<div>
<Child classes={{root:classes.child,
text:classes.text}}>
</Child>
</div>

这样,样式对象child属性中的css(即下面的color: 'red')将作用于child组件的css api中的root选项,查阅material ui可知,若child组件是Button组件,那么将在.MuiButton-root元素上生效;样式对象text属性中的css(即下面的fontSize: '14px')将作用于child组件的css api中的text选项,查阅material ui可知,若child组件是Button组件,那么将在.MuiButton-text元素上生效。

样式对象:

const styles = {
child: {
color: 'red'
},
text:{
fontSize: '14px'
}
}

导出高阶组件:

import { withStyles } from '@material-ui/core';
function Parent({classes}){
}
export default withStyles(styles)(Parent);

四、方案对比

  • 方案一,适用于根元素样式的修改。
  • 方案二,具有普适性,它能够应对各种场景。&和$符号使得该方案非常全能。
  • 方案三,仅适用于框架恰好为要修改的元素提供了css api的情况,具有局限性。

material UI中子组件样式修改的几种方案研究的更多相关文章

  1. 解决vue中element组件样式修改无效

    vue中element组件样式修改无效 <style> .detail{ .el-input__inner { height: 48px; } } </style> 直接写st ...

  2. angular -——组件样式修改不成功

    angular组件样式修改不成功! 自己定义的css可以成功 组件的不行 style在模板字符串里 直接没有 class 是显示的 但是样式不生效 加上面 即可,为什么?我也不太清楚.有知道答案的请回 ...

  3. vue中子组件直接修改父组件prop属性bug

    在有些时候,子组件直接修改父组件传来的 prop 对象的属性会出现不同步的问题. 比如,父组件传过来的一个对象 checkBoxObj: checkBoxObj:{ checked: false } ...

  4. vue组件中的样式属性:scoped,解决在父组件中无法修改子组件样式问题

    Scoped CSS规范是Web组件产生不污染其他组件,也不被其他组件污染的CSS规范. vue组件中的style标签标有scoped属性时表明style里的css样式只适用于当前组件元素,它是通过使 ...

  5. vue+Elment-UI,修改element组件样式

    在用vue开发项目过程中,我们总是避免不了的会使用到elementUI,它里面提供的一些组件都为我们的开发带来了很大的便利,但是,当有时候我们需要使用这些组件的同时又要修改下组件的UI样式的话,我们该 ...

  6. vue scoped 穿透_vue 修改内部组件样式问题

    何为scoped? 在vue文件中的style标签上,有一个特殊的属性:scoped.当一个style标签拥有scoped属性时,它的CSS样式就只能作用于当前的组件,也就是说,该样式只能适用于当前组 ...

  7. sencha touch 扩展篇之使用sass自定义主题样式 (下)通过css修改官方组件样式以及自定义图标

    上一讲我们讲解了如何使用官方的api来修改主题样式,这讲我们继续讲解sass的样式修改, 编译官方自带的主题包  在生成的项目以及官方sdk的目录下,自带了一些主题sass包,我们也可以通过修改sas ...

  8. vue中修改子组件样式

    一.问题叙述 项目里需要新添加一个表单页面,里面就只是几个select,这个几个select是原本封装好的组件,有自己原本的样式,而这次的原型图却没有和之前的样式统一起来,需要微调一下,这里就涉及到父 ...

  9. 修改elementUI组件样式无效的问题研究

    问题背景:el-tabs的选项卡默认字体是14px,大了,想改成12px,结果在style里面加样式总是不生效. 解决:样式放到app.vue里面,样式就生效了 .panel-content .el- ...

随机推荐

  1. Vim中实现PHP函数tags跳转

    编译安装ctags 下载地址:http://ctags.sourceforge.net/ 下载文件:ctags-5.8.tar.gz 解压ctags:tar -zxcf ctags-5.8.tar.g ...

  2. es--es分词的一些分析技巧

    查看某个字段的分词结果 POST /index/tyhpe/id/_termvectors?fields=fields_name 例如:http://localhost:9200/prod_membe ...

  3. java中查询某个类已经创建了多少个对象了

    这个代码主要是使用类的静态字段和构造函数,可以跟踪某个类所创建对象的个数.请写一个类,在任何时候都可以向它查询“你已经创建了多少个对象? 主要是在构造函数中用到了静态数据,进行显示已经构造了多少个类对 ...

  4. Flask 入门(八)

    flask操作数据库:操作数据: 承接上文: 修改main.py中的代码如下: #encoding:utf-8 from flask_sqlalchemy import SQLAlchemy from ...

  5. SQL基础系列(1)-基本语法--转载w3school

    1.    建原始表 USE [Northwind] GO /****** Object:  Table [dbo].[Persons]    Script Date: 2016/6/8 7:31:5 ...

  6. 四、华为VRP平台介绍和常用配置

    一.华为VRP平台 华为现用的平台是VRP(Versatile Routing Platform)是华为公司数据通信产品的通用操作系统平台. 包含华为产品中的路由.交换.安全.无线等等 二.华为设备管 ...

  7. 10-jmeter 测试soap协议v1.2版本请求

    1.因为jmeter安装了第三方插件jmeter-plugins-manager.jar之后(具体安装看之前文章),此时就可简单直接测试soap协议1.2版本的请求了 2. 3.进行运行线程就可实现了 ...

  8. 漏洞复现环境集锦-Vulhub

    0x01 Vulhub简介 Vulhub是一个面向大众的开源漏洞靶场,无需docker知识,简单执行两条命令即可编译.运行一个完整的漏洞靶场镜像. 0x02 安装 # 安装pip curl -s ht ...

  9. windows VMware 安装mac 系统

    0x00 下载链接 首先肯定要有镜像: 链接:https://pan.baidu.com/s/190NBRBwNXVOYRxb6nodHeA 提取码:ahq5 然后还得有这个插件: 链接:https: ...

  10. Persona & User Scenario

    Persona: Tom:男,21岁,大学生,周末经常和同学们一起出去吃饭.唱歌.打球.郊游,期间会时不时拍一些照片以作纪念,长期积累的照片数量较多且内容繁杂,很少对照片进行整理: Alisa:女,2 ...