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. Xcode - 添加文档注释插件

    Xcode自动添加文档注释插件: https://github.com/onevcat/VVDocumenter-Xcode 功能演示: 感谢onevcat的分享!

  2. JS中this指向问题和改变this指向

    首先必须要说的是,this的指向在函数定义的时候是确定不了的,只有函数执行的时候才能确定this到底指向谁,实际上this的最终指向的是那个调用它的对象(这句话有些问题,后面会解释为什么会有问题,虽然 ...

  3. FastJson反序列化和构造函数之间的一点小秘密

    各位看官大家下午好,FastJson想必大家都很熟悉了,很常见的Json序列化工具.今天在下要和大家分享一波FastJson反序列化和构造函数之间的一点小秘密. 下面先进入大家都深恶痛绝的做题环节.哈 ...

  4. Round 1A 2020 - Code Jam 2020

    Problem A. Pattern Matching 把每个字符串分成第一个之前,最后一个之后,中间的部分 三个部分 每个字符串的中间的部分可以直接拼接 前后两个部分需要判断下是否合法 #inclu ...

  5. LeetCode | 1013. 将数组分成和相等的三个部分

    给定一个整数数组 A,只有我们可以将其划分为三个和相等的非空部分时才返回 true,否则返回 false. 形式上,如果我们可以找出索引i+1 < j且满足(A[0] + A[1] + ... ...

  6. linux安装常用软件和查询基本信息

                                                                          linux安装常用软件和查询基本信息 1. 安装常用软件 [ ...

  7. python3的subprocess的各个方法的区别(二)

    subprocess如何避免死锁 如果交互是双工的,即涉及读取和写入,则尤其如此.这种交互可能导致死锁,因为两个进程都可能最终等待另一个进程的输出 您希望从子进程标准输出管道读取,但标准错误管道的缓冲 ...

  8. 队列的含义以及C语言实现顺序队列

    队列,和栈一样,也是一种对数据的"存"和"取"有严格要求的线性存储结构. 什么是队列 与栈结构不同的是,队列的两端都"开口",要求数据只能从 ...

  9. 合理使用CSS框架,加速UI设计进程

    转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 原文出处:https://dzone.com/articles/how-to-speed-up-your-d ...

  10. CVE-2019-0193 远程命令执行-漏洞复现

    0x01 漏洞简介 Apache Solr 是一个开源的搜索服务器.Solr 使用 Java 语言开发,主要基于 HTTP 和 Apache Lucene 实现.此次漏洞出现在Apache Solr的 ...