React高级特性
目录:
- 容器组件
- JSX可展开属性
- 动画 : CSS3 Transition
- 默认属性
- 复用代码:mixin
容器组件
React元素也可以包含其他的子元素,这意味着响应的React组件是一个 容器组件。比如:
//JSX
<ezpanel title="title">
<p>this is demo content</p>
</ezpanel>
上例中的EzPanel声明了一个面板组件,而面板的内容在定义组件时是不可知的, 这些内容需要被加入到EzPanel渲染后的DOM元素中。
在React中,使用this.props.children就可以访问React子元素,这样我们 就可以轻松地将未知的React子元素包含到容器中:
var EzPanel = React.createClass({
render : function(){
return <div class="ez-panel">
{this.props.children}
</div>;
}
});
JSX可展开属性
在JSX中,有时一个React元素的属性很多,比如在示例代码中设置音量推子组件 的属性:
//JSX
<div classname="ez-slider" onmousedown="{this.onMouseDown}" onmousemove="{this.onMouseMove}" onmouseup="{this.onMouseUp}"></div>
JSX有一个很好的特性让我们可以给React元素设置一个JSON对象作为属性包,这个属性 包将按照字段展开为分立的React元素的属性,被称为可展开属性。使用如下 方式在React元素上声明一个可展开属性,其中propbag是一个JSON对象:
<any {...propbag}=""></any>
比如,前面的示例使用可展开属性的方式改写为:
//定义属性包
var props = {
className : "ez-slider",
onMouseDown : this.onMouseDown,
onMouseUp : this.onMouseUp,
onMouseMove : this.onMouseMove
}; //传入属性包
var rel = <div {...props}=""></div>;
动画 : CSS3 Transition
在React中可以使用CSS3 Transition为组件增加过渡效果。不过,由于 CSS3 Transition需要DOM属性的变化才能触发,所以我们需要将属性改变后的React 元素重新渲染到真实DOM上,才可以触发过渡效果。
大致来讲,在React中使用CSS3 Transition有以下步骤:
- 为元素声明transition样式
- 设置属性初始值,第一次渲染元素
- 设置属性目标值,第二次渲染元素
在示例代码中,为了实现过渡效果,我们使用了一个内部状态mounted 来实现第二次渲染:当初次渲染完成功后,通过setState()方法我们触发 了再次渲染。第二次渲染时,我们重新设置了样式,以便激活过渡过程。
需要注意的一点是window.getComputedStyle()方法的应用,调用 这个方法的目的是刷新DOM的样式,以便确保之前设置的样式已经被应用到DOM 上了。
默认属性
对于一个组件来讲,通常应该有一些默认的属性值,这样即使调用者没有 显示的指定某个属性值,依然可以通过this.props获得该值。这简化了属性值 缺失引起的错误检查。
在React中定义组件时,使用getDefaultProps()方法声明默认属性:
var EzDemoComp = React.createClass({
//设置默认属性值
getDefaultProps:function(){
return {
value : 0
}
},
render: function(){
//使用this.props.value访问属性,如果用户没有设置,则该值为默认值
return <div classname="ez-demo">{this.props.value}</div>;
}
});
//创建React元素时没有指定属性值
React.render(<ezdemocomp></ezdemocomp>,
document.querySelector("#content"));
复用代码:mixin
如果多个组件的实现代码中有一些公共的部分,那么可以使用React的mixin特性 将这部分代码提出来公用。mixin是掺合,混合,糅合的意思,即可以将一个对象的属性 拷贝到另一个对象上。
在React中,使用mixin有两个步骤:
- 定义一个mixin对象
mixin对象是一个JavaScript对象,这个对象的属性将被拷贝到React组件类的原型对象上:
var EzLoggerMixin = {
log:function(){
//sth. happened here.
}
};
- 在定义组件时使用这个mixin对象
在使用React.createClass()定义组件时,给传入的原型对象设置mixins属性:
React.createClass({
mixins:[EzLoggerMixin],
render:function(){
//your render stuff.
}
});
mixins属性是一个数组,这意味着可以指定多个mixin对象,但记住这些 mixin对象、以及在createClass()中传入的原型对象,它们的属性不能同名。
React高级特性的更多相关文章
- ActiveMQ中的Destination高级特性(一)
---------------------------------------------------------------------------------------- Destination ...
- Python3学习(二)-递归函数、高级特性、切片
##import sys ##sys.setrecursionlimit(1000) ###关键字参数(**关键字参数名) ###与可变参数不同的是,关键字参数可以在调用函数时,传入带有参数名的参数, ...
- 云端卫士实战录 | Java高级特性之多线程
<实战录>导语 一转眼作为一名Java开发者已经四年多时间了,说长不长说短不短,对于java的感情还是比较深的,主要嘛毕竟它给了我饭吃.哈哈,开个玩笑.今天我想借此机会来和大家聊聊Java ...
- javascript高级特性
01_javascript相关内容02_函数_Arguments对象03_函数_变量的作用域04_函数_特殊函数05_闭包_作用域链&闭包06_闭包_循环中的闭包07_对象_定义普通对象08_ ...
- Visual Studio 2015 速递(4)——高级特性之移动开发
系列文章 Visual Studio 2015速递(1)——C#6.0新特性怎么用 Visual Studio 2015速递(2)——提升效率和质量(VS2015核心竞争力) Visual Studi ...
- Android TextView高级特性使用
TextView一般都是用来显示一段文本,这里说的高级特性主要是一些我们平常不太常用的属性.包括文字阴影.自定义字体.html嵌入多格式.字体加粗.插入图片.这些特性平时开发APP的时候,可能一般使用 ...
- Python的高级特性8:你真的了解类,对象,实例,方法吗
Python的高级特性1-7系列是本人从Python2过渡3时写下的一些个人见解(不敢说一定对),接下来的系列主要会以类级为主. 类,对象,实例,方法是几个面向对象的几个基本概念,其实我觉得很多人并不 ...
- Python的高级特性7:闭包和装饰器
本节跟第三节关系密切,最好放在一起来看:python的高级特性3:神奇的__call__与返回函数 一.闭包:闭包不好解释,只能先看下面这个例子: In [23]: def outer(part1): ...
- VQuery高级特性
VQuery高级特性 css方法 同时设置多个--for in 链式操作 链式操作 函数,链式操作 css 方法链式操作 json的使用 阻止冒泡,默认事件 VQuery插件 插件机制 可以扩展库的功 ...
随机推荐
- 关于C# winform中使用pictureBox显示大红叉的原因
pictureBox的关于image的属性有三 个,InitalImage,Image,ErrorImage分别表示picturebox的默认初始图片,当前可以设置的图片和出错之后默认显示的图 片,而 ...
- 创建 maven 本地仓库
在 pom.xml 添加依赖包的时候,有时候会提示无法从 http://repo1.maven.org/maven2/ 获取的情况,这时可配置个本地仓库: 从网上下载 maven 仓库网站源码包 Ne ...
- JAVA List<> 合并去重
List<A>和List<B>,A/B中均没有重复的,现在保证A/B合并为C,且C中没有重复的. 参考http://blog.csdn.net/secondjanuary/ar ...
- 读《深入php面向对象、模式与实践》有感(一)
什么样的代码需要改进?书中给出了四个标准(我个人比较认可这四个标准,实际开发中也的确时常遇到): 一.代码重复 用书中的原话讲:“如果你在写代码的时候,总是感觉似曾相识,很可能你的代码已经重复了”. ...
- jq最新前三篇文章高亮显示
/*---------最新前三篇文章高亮显示-------------*/ function latest(){ var color_arr=new Array( "blue", ...
- hibernate 中如何用注解映射定长字符类型char(2)
如果是用xml的方式配置映射,可以在<column>标签的sql-type属性中设置char(2),比如: <property name="age" type=& ...
- 使用logrotate来进行轮换mysql的慢日志
#!/bin/bash SLOWCFG=/etc/my.cnf DATADIR=`awk /^datadir/ $SLOWCFG|awk -F"=" '{print $2}'` S ...
- html第一天
html为超文本标记语言, html下的内容不去分大小写: 标签必须要有开始和结束,<br>和<hr>特殊,在标签内结束<br/>,<hr/>:下划线 ...
- PHP如何通过SQL语句将数据写入MySQL数据库呢?
1,php和MySQL建立连接关系 2,打开 3,接受页面数据,PHP录入到指定的表中 1.2两步可直接使用一个数据库链接文件即可:conn.php <?phpmysql_connect(&qu ...
- numpy使用
计算矩阵的一些用法: http://www.360doc.com/content/13/1104/17/9934052_326603249.shtml