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. vue中的js引入图片,使用require相关问题

    vue中的js引入图片,必须require进来 或者引用网络地址 <template> <div class="home"> <img alt=&qu ...

  2. 简单记录下springboot+jms+activemq

    1. 安装ActiveMQ 到Apache官方网站下载最新的ActiveMQ的安装包,并解压到本地目录下后运行 2. pom.xml引入  springboot配置文件中填写相关配置 3.创建生产者 ...

  3. XSS之绕过WAF总结

    来源<XSS跨站脚本攻击剖析与防御>&<WEB前端技术揭秘> 一.一般测试方法 步骤: 0.总则:见框就插 1.在输入框随便输入一些简单的字符,如 aaa,方便后续查找 ...

  4. ThinkPHP6.0学习笔记-模型操作

    ThinkPHP模型 模型定义 在app目录下创建Model目录,即可创建模型文件 定义一个和数据库表相匹配的模型 use think\Model; class User extends Model ...

  5. 【高并发】什么是ForkJoin?看这一篇就够了!

    写在前面 在JDK中,提供了这样一种功能:它能够将复杂的逻辑拆分成一个个简单的逻辑来并行执行,待每个并行执行的逻辑执行完成后,再将各个结果进行汇总,得出最终的结果数据.有点像Hadoop中的MapRe ...

  6. uni_app商城项目(完成)

    总结: 1.uni-app的跨段适配性,真的特别强,完成相关代码的书写,HbuilderX编辑器提供的打包十分方便. 2.开发小程序,H5等移动端开发, 比开发电脑端简单不少,但有时候坑也挺多的. 3 ...

  7. json文件操作

    1.把字典或list转换成字符串方法 json.dumps() 2.把字符串转换成字典方法 json.loads() 3.indent 存储文件时每行加缩进数 4.ensere_asci 文件中有中文 ...

  8. Git应用详解第七讲:Git refspec与远程分支的重要操作

    前言 前情提要:Git应用详解第六讲:Git协作与Git pull常见问题 这一节来介绍本地仓库与远程仓库的分支映射关系:git refspec.彻底弄清楚本地仓库到底是如何与远程仓库进行联系的. 一 ...

  9. 数据结构和算法(Golang实现)(26)查找算法-哈希表

    哈希表:散列查找 一.线性查找 我们要通过一个键key来查找相应的值value.有一种最简单的方式,就是将键值对存放在链表里,然后遍历链表来查找是否存在key,存在则更新键对应的值,不存在则将键值对链 ...

  10. Math.max.apply()用法

    apply的一些其他巧妙用法 Math.max.apply( null, [12,23,34,45] ); //细心的人可能已经察觉到,在我调用apply方法的时候, // 第一个参数是对象(this ...