react入门到进阶(三)
一、react样式
1、内联样式
在以前写html+css的时候,引入css的时候有一种方法就是内联,而在react中又有些不一样,样式是用变量的形式,如下
const styleComponentHeader ={
header: {
backgroundColor:'#333333',
color:'#ffffff',
'padding-top':'15px',
paddingBottom:'15px',
fontSize:'15px'
}
//还可以定义其他样式
}
<h1 style={styleComponentHeader.header}>yondu is a good father</h1>
我们用参照json的方式定义了一个样式,这个只能定义在render里面,然后直接使用它,当然header后面还可以继续定义其他样式,而且和css写法不同的是,名字要用驼峰命名法,或者你就用引号把名字包起来,而后面的值则必须要用引号包起来。这种方式最后呈现的状态是把样式直接写入了标签里面,这样定义的东西不会影响全局,只对自己负责不会污染其他的。
另一种方法是我们直接创立一个css文件,这种就直接像以前那种写法了,只不过你在标签里面加类名的时候,要用className,例如<h1 className="smallFontSize">yondu is a good father</h1>,这种方式由于是全局的,所以有时候容易造成污染,你都不知道怎么回事,样式就冲突了,慎用。
总结几点:
- css命名规范 模块__属性名字--样式设定
- 定义只能在
render里面 - 注意样式的驼峰命名
- 类名要用
className - 动画,伪类不能使用
- react-native就是用这种方法
2、内联样式中的表达式
当我们有时候,想要动态的去改变样式的时候,会用到js,但在react中,我们也可以,这就要用到前面所提到的三元表达式了。
constructor(){
super();
this.state = {
miniH : false
};
}
changeHeader(){
this.setState({
miniH : !this.state.miniH
});
}
render(){
const styleHello = {
header: {
backgroundColor:'#333333',
color:'#ffffff',
paddingTop:(this.state.miniH) ? '3px' : '15px',
paddingBottom:(this.state.miniH) ? '3px' : '15px',
}
}
return(
<div>
<h1 style={styleHello.header} onClick={this.changeHeader.bind(this)} >hello world</h1>
<p>子页面输入<input type="text" onChange={this.props.childchange} /></p>
//当子组件输入框发生变化时,给在父组件的属性childchange传递了一个参数
</div>
)
}
我们首先给我们要改变的元素给了一个点击事件,这个事件只改变一个变量的布尔值,但是我们正是通过这个布尔值,就可以在样式里面使用三元表达式从而到达改变样式值的效果,而且这种改变,仅仅是state的改变,不会刷新整个页面,很高效。
3、CSS模块化
下面,我们来说说react样式里面极为重要的一点,就是css的模块化。为了保证一个模块的样式不影响其他模块,也就是不造成全局的污染,而且能使css按需加载的话,我们就要用到css的模块化。
首先,我们先装2个插件来处理模块化
"style-loader": "^0.13.1",
"css-loader": "^0.25.0"
然后在webpack.config.js文件里面配置一些东西,这是一种命名算法,会给你要引用这个css的类给予特殊的类名,这样就不会导致命名混乱的问题。
{
test: /\.css$/,
loader: 'style-loader!css-loader?modules&importLoaders=1&localIdentName=[name]__[local]___[hash:base64:5]'
},
接着,我们创立一个css文件,随便命名为block.js吧,然后在里面写一些样式
.style {
background-color:#333333;
color:#ffffff;
padding-top:15px;
padding-bottom:15px;
fontSize:15px;
}
我们还要在需要这个css文件的js文件里面,把它引用进来
var blockCss = require("../../css/block.css");
这样,我们就可以直接使用这个css了
<p className={blockCss.style}>
这样使用,就可以确保你在css里面的东西不会污染全局,它只对引用自己的元素负责。而且,这样写的模块css是能够共享的,也省略了很多代码。下面,我们总结一下css模块化的东西
- 所有样式都是local 的,解决了命名冲突和全局污染
- 类名都是由算法生成的,可以来压缩类名
- 只需引用组件的
js,就可以搞定组件所有的js和css - 仍然是用
css的写法,没有任何负担
顺便说一下,有时候你如果不太关注与美工,想要把主要精力全部集中于逻辑层的处理,但是你做的东西又不能太难看,所以你就需要一些样式框架,例如bootstrap、ant design之类的,可以直接加载它写好的样式。
react入门到进阶(三)的更多相关文章
- react 入门与进阶教程
react 入门与进阶教程 前端学习对于我们来说越来越不友好,特别是随着这几年的发展,入门门槛越来越高,连进阶道路都变成了一场马拉松.在学习过程中,我们面临很多选择,vue与react便是一个两难的选 ...
- react入门到进阶(一)
一.何为react Facebook在F8会议上首次提出这个概念,一套全新的框架就此诞生. React 不是一个完整的 MVC.MVVM 框架,其只负责 View 层 React 跟 Web Comp ...
- react入门到进阶(二)
一.react属性与事件 1.State属性 State,翻译过来是状态的意思,所以它就代表着组件的状态.React把用户界面(UI)当做是状态机,想象它有不同的状态然后渲染这些状态,可以轻松让用户界 ...
- nodeJS从入门到进阶三(MongoDB数据库)
一.MongoDB数据库 1.概念 数据库(DataBase)是一个按照数据结构进行数据的组织,管理,存放数据的仓库. 2.关系型数据库 按照关系模型存储的数据库,数据与数据之间的关系非常密切,可以实 ...
- React创建组件的三种方式比较和入门实例
推荐文章: https://www.cnblogs.com/wonyun/p/5930333.html 创建组件的方式主要有: 1.function 方式 2.class App extends Re ...
- Weex入门与进阶指南
Weex入门与进阶指南 标签: WeexiOSNative 2016-07-08 18:22 59586人阅读 评论(8) 收藏 举报 本文章已收录于: iOS知识库 分类: iOS(87) 职 ...
- react入门(3)
在第一篇文章里我们介绍了jsx.组件.css写法 点击查看react入门(1) 第二篇文章里我们介绍了事件.this.props.children.props....other.map循环 点击查 ...
- react入门(1)
这篇文章也不能算教程咯,就算是自己学习整理的笔记把. 关于react一些相关的简介.优势之类的,随便百度一下一大堆,我就不多说了,可以去官网(http://reactjs.cn/)看一下. 这片主要讲 ...
- react入门(2)
接着上一次的讲,如果没有看过上一篇文章的小伙伴可以先看一下http://www.cnblogs.com/sakurayeah/p/5807821.html React事件 可以先看一下官网讲解的内容h ...
随机推荐
- 大话JPA
JPA 是什么 Java Persistence API:用于对象持久化的 API Java EE 5.0 平台标准的 ORM 规范,使得应用程序以统一的方式访问持久层: 首先看一下传统方式访问数据库 ...
- Nodejs.安装.非源码方式安装Node.js (Centos)
已验证的适用环境: Centos6.x 树莓派官方ROM(Raspbian) 先去官网下载已编译好的安装包 https://nodejs.org/en/download/current/ 以Cent ...
- Azure环境中Nginx高可用性和部署架构设计
前几篇文章介绍了Nginx的应用.动态路由.配置.在实际生产环境部署时,我们需要同时考虑Nginx的高可用性和部署架构. Nginx自身不支持集群以保证自身的高可用性,商业版本的Nginx+推荐: T ...
- 在CentOS 7.3 中安装 NVIDIA GT730 显卡驱动
主机: Dell OptiPlex 390 MT (i5) 系列: 显卡: 技嘉(GIGABYTE) GV-N730D5-2GI 902MHz/5000MHz 2GB/64bit GDDR5 显卡 ( ...
- 最全的命令行(gradle)打包安卓apk
最近研究安卓方面的打包,因为是React Native,不能使用Android studio打包.找了半天资料,发现没有一个全面的.下面,我来讲解自己下打包时自己遇到的各种坑. 1.首先,需要在项目顶 ...
- fiddler学习资源
小坦克 fiddler教程:http://www.cnblogs.com/TankXiao/archive/2012/04/25/2349049.htmlps:另外博主其他测试文章也值得一看 涂根 ...
- 聊聊java基础,int值强制类型转换成byte
聊聊java基础,int值强制类型转换成byte 知识点:byte.short.char在表达式中会自动提升为int 之前做一个应用时,打印IP地址,因为是用4个byte存储的,所以打印的时候值范围是 ...
- Python 抽象篇:面向对象之类的方法与属性
概览:类成员之字段:-普通字段,保存在对象中,执行职能通过对象访问-静态字段,保存在类中,执行可以通过对象访问,也可以通过类访问类成员之方法:-普通方法,保存在类中,由对象来调用,self->对 ...
- 入我新美大的Java后台开发面试题总结
静儿最近在总结一些面试题,那是因为做什么事情都要认真.面试也一样,静儿作为新美大金融部门的面试官,负责任的告诉大家,下面的问题回答不上来,面试是过不了的.不过以下绝不是原题,你会发现自己实力不过硬,最 ...
- HTML5 input事件检测输入框变化[转载]
原文:http://www.linuxidc.com/Linux/2015-07/119984.htm 之前一直用change事件来监听输入框内容是否发生变化,只有当输入框失去焦点时才会触发,没想到h ...