material UI中子组件样式修改的几种方案研究
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中子组件样式修改的几种方案研究的更多相关文章
- 解决vue中element组件样式修改无效
vue中element组件样式修改无效 <style> .detail{ .el-input__inner { height: 48px; } } </style> 直接写st ...
- angular -——组件样式修改不成功
angular组件样式修改不成功! 自己定义的css可以成功 组件的不行 style在模板字符串里 直接没有 class 是显示的 但是样式不生效 加上面 即可,为什么?我也不太清楚.有知道答案的请回 ...
- vue中子组件直接修改父组件prop属性bug
在有些时候,子组件直接修改父组件传来的 prop 对象的属性会出现不同步的问题. 比如,父组件传过来的一个对象 checkBoxObj: checkBoxObj:{ checked: false } ...
- vue组件中的样式属性:scoped,解决在父组件中无法修改子组件样式问题
Scoped CSS规范是Web组件产生不污染其他组件,也不被其他组件污染的CSS规范. vue组件中的style标签标有scoped属性时表明style里的css样式只适用于当前组件元素,它是通过使 ...
- vue+Elment-UI,修改element组件样式
在用vue开发项目过程中,我们总是避免不了的会使用到elementUI,它里面提供的一些组件都为我们的开发带来了很大的便利,但是,当有时候我们需要使用这些组件的同时又要修改下组件的UI样式的话,我们该 ...
- vue scoped 穿透_vue 修改内部组件样式问题
何为scoped? 在vue文件中的style标签上,有一个特殊的属性:scoped.当一个style标签拥有scoped属性时,它的CSS样式就只能作用于当前的组件,也就是说,该样式只能适用于当前组 ...
- sencha touch 扩展篇之使用sass自定义主题样式 (下)通过css修改官方组件样式以及自定义图标
上一讲我们讲解了如何使用官方的api来修改主题样式,这讲我们继续讲解sass的样式修改, 编译官方自带的主题包 在生成的项目以及官方sdk的目录下,自带了一些主题sass包,我们也可以通过修改sas ...
- vue中修改子组件样式
一.问题叙述 项目里需要新添加一个表单页面,里面就只是几个select,这个几个select是原本封装好的组件,有自己原本的样式,而这次的原型图却没有和之前的样式统一起来,需要微调一下,这里就涉及到父 ...
- 修改elementUI组件样式无效的问题研究
问题背景:el-tabs的选项卡默认字体是14px,大了,想改成12px,结果在style里面加样式总是不生效. 解决:样式放到app.vue里面,样式就生效了 .panel-content .el- ...
随机推荐
- HashMap源码与相关面试题
一.哈希表 哈希表是一种可以快速定位得数据结构.哈希表可以做到平均查找.插入.删除时间是O(1),当然这是指不发生Hash碰撞得情况.而哈希表最大得缺陷就是哈希值得碰撞(collision). Has ...
- ARM.SchDoc图解
1.基准电压.CR1220电池 2.LCD 3.SPI 4.外部SAM 5.实时时钟 6.EEPROM 7.JTAG 8.复位
- EEPROM存储芯片24C02
1.24C02简介 24C02是一个2Kbit的串行EEPROM存储芯片,可存储256个字节数据.工作电压范围为1.8V到6.0V,具有低功耗CMOS技术,自定时擦写周期,1000000次编程/擦除周 ...
- (C#、JavaScript)面向对象的程序设计
面向对象(OOP)的理解 喜欢程序的朋友们,大家应该都听过一句话"万物皆对象",感觉老牛X了. 面向对象的程序设计,它是围绕真实世界来设计程序的. 面向对象三要素:封装.继承.多态 ...
- git 为什么要先commit,然后pull,最后再push?而不是commit然后直接push?
情况是这样的,现在远程有一个仓库,分支就一个,是master.然后我本地的仓库是从远程的master上clone下来的.大家都是clone下来,再在自己本地改好,再commit然后pull然后push ...
- 关于git你日常工作中会用到的一些东西
前言 git是一个版本控制工具, 版本控制主要的好处有三点: 从当前版本回退到任意版本 查看历史版本 对比两个版本差异 git 相关术语 repository 仓库 branch 分支 summary ...
- 大曾Blogs使用说明书😊——Super ITZ
大曾Blogs使用说明书 先敲黑板,四句话: pipe搜索,简洁,用于跳转,博客园及csdn和github 博客园炫酷界面,用于查看主要博文 csdn所有博客汇总,查看详细信息 github项目源码汇 ...
- C/C++ 数据精确度的设置
#include<iostream>#include<iomanip> //此库为代码最后一行快捷设置数据格式需要用的的库 #include<math.h>usin ...
- 22.1 Extends 继承的 方法重写、@Override的使用、
/* * 继承中成员方法的特点 * 子类中没有这个方法,调用父类的 * 子类中重写了这个方法,调用子类的 * 方法的重写:在子父类当中,子类的方法和父类的完全一样,子类重写了父类的方法(覆盖),当子类 ...
- Exchange 2016 OWA登陆异常
今天,收到脚本的告警信息,有一台Exchange服务器OWA无法登陆! 手动进行了一下测试,发现确实存在问题,报错信息如下: 检查了一下该台服务器的日志,找到了如下信息 1.访问OWA的请求在HTTP ...