reactjs入门到实战(五)---- props详解
1》》》基础的props使用 不可修改父属性 getDefaultProps 对于外界/父组件的属性值,无法直接修改,它是只读的。
<script type="text/babel">
var Hello = React.createClass({
getDefaultProps:function(){
return{
name:'Default'
}
},
render:function(){
return (
<span>Hello {this.props.name} !</span>
);
}
});
ReactDOM.render(
<Hello />,
document.getElementById('example')
)
</script>
2》》》父子传递
<script type="text/babel">
//两层以上的传递
//1、props 属性值提倡显示的传递到下一级
//子组件
var Child = React.createClass({
render:function(){
return(
<span>Hello {this.props.fullName}</span>
);
}
}); var Parent = React.createClass({
addFamilyName:function(name){
return (name + 'chen');
},
render:function(){
return(
<div>
<Child fullName={this.addFamilyName(this.props.name)} name={this.props.name}/>
</div>
);
}
}); ReactDOM.render(
<Parent name="jin" />,document.getElementById('example')
)
</script>
》》》state和props的区别
1、state 本组件内的数据 相对封闭的单元/结构的数据 状态 组件的无状态
2、props 组件直接的数据流动 单向的 ,从owner向子组件
<script type="text/babel">
//props和state的区别
var Msg = React.createClass({
render:function(){
return(
<div>
<span style={{color:this.props.color}}>Hello {this.props.master}.IT is {this.props.time} now.the color is {this.props.color} </span>
</div> );
}
});
var Hello = React.createClass({
getInitialState:function(){
return{
time:new Date().toDateString(),
color:'red'
}
},
changeColor:function(){
this.setState({color:'green'})
},
render:function(){
return(
<div>
<span onClick={this.changeColor}>The ownerName is {this.props.name}</span>
<br/>
<Msg master={this.props.name} time={this.state.time} color={this.state.color} />
</div>
);
} }); ReactDOM.render(
<Hello name="world" />,
document.getElementById('example')
)
</script>
》》》propTypes
Prop 验证
1、React.PropTypes.string 2、React、PropTypes.bool 3、React.PropTypes.number 4、React.PropTypes.instanceOf(Message) 5、optionalUnion:React.PropTypes.oneOfType([]) 6、React.PropTypes.arrayOf(React.PropTypes.number) 7、customProp:function(props,propName,componentName)
propTypes。React.PropTypes 提供很多验证器 (validator) 来验证传入数据的有效性。当向 props 传入无效数据时,JavaScript 控制台会抛出警告。注意为了性能考虑,只在开发环境验证 propTypes。下面用例子来说明不同验证器的区别:
React.createClass({
propTypes: {
// 可以声明 prop 为指定的 JS 基本类型。默认
// 情况下,这些 prop 都是可传可不传的。
optionalArray: React.PropTypes.array,
optionalBool: React.PropTypes.bool,
optionalFunc: React.PropTypes.func,
optionalNumber: React.PropTypes.number,
optionalObject: React.PropTypes.object,
optionalString: React.PropTypes.string,
// 所有可以被渲染的对象:数字,
// 字符串,DOM 元素或包含这些类型的数组。
optionalNode: React.PropTypes.node,
// React 元素
optionalElement: React.PropTypes.element,
// 用 JS 的 instanceof 操作符声明 prop 为类的实例。
optionalMessage: React.PropTypes.instanceOf(Message),
// 用 enum 来限制 prop 只接受指定的值。
optionalEnum: React.PropTypes.oneOf(['News', 'Photos']),
// 指定的多个对象类型中的一个
optionalUnion: React.PropTypes.oneOfType([
React.PropTypes.string,
React.PropTypes.number,
React.PropTypes.instanceOf(Message)
]),
// 指定类型组成的数组
optionalArrayOf: React.PropTypes.arrayOf(React.PropTypes.number),
// 指定类型的属性构成的对象
optionalObjectOf: React.PropTypes.objectOf(React.PropTypes.number),
// 特定形状参数的对象
optionalObjectWithShape: React.PropTypes.shape({
color: React.PropTypes.string,
fontSize: React.PropTypes.number
}),
// 以后任意类型加上 `isRequired` 来使 prop 不可空。
requiredFunc: React.PropTypes.func.isRequired,
// 不可空的任意类型
requiredAny: React.PropTypes.any.isRequired,
// 自定义验证器。如果验证失败需要返回一个 Error 对象。不要直接
// 使用 `console.warn` 或抛异常,因为这样 `oneOfType` 会失效。
customProp: function(props, propName, componentName) {
if (!/matchme/.test(props[propName])) {
return new Error('Validation failed!');
}
}
},
/* ... */
});
栗子:》》》》
<script type="text/babel">
//设定props的属性
var Hello = React.createClass({
propTypes:{
//name:React.PropTypes.string
//name:React.PropTypes.oneOf(['News','world'])
//type:React.PropTypes.oneOfType([
// React.PropTypes.string,
// React.PropTypes.number,
//]),
//type:React.PropTypes.arrayOf(React.PropTypes.number),
name:function(props,propName,componentName){
if(!/^W/.test(props[propName])){
return new Error(
'Invalid prop `' + propName + '`supplied to' + '`' + componentName + '`.Validtion failed.'
);
}
}
}, render:function(){
return (
<div>
<span>Hello {this.props.name}!</span>
</div>
);
}
}); ReactDOM.render(
<Hello name='world' />,
document.getElementById('example')
);
</script>
》》》this.props.children
<script type="text/babel">
//this.props.children var Note = React.createClass({
render:function(){
return(
<li>{this.props.text}</li>
);
}
}); var NotesList = React.createClass({
render:function(){
return(
<ol>
{
this.props.children.map(function(child,index){
return <Note key={index} text={child}/>
})
}
</ol>
);
}
}); ReactDOM.render(
<NotesList>
<span>hello</span>
<span>world</span>
</NotesList>,
document.getElementById('example')
)
</script>
>>>结构赋值利用es6 ...
<script type="text/babel">
var Child = React.createClass({
render:function(){
return(
<div>
<span>
I am {this.props.name}! I am {this.props.age} years old. It is {this.props.time} now
</span>
</div>
);
}
}); var Parent = React.createClass({
getInitialState:function(){
return{
time: new Date().toDateString()
}
}, render:function(){
var {...others} = this.props;
return(
<Child {...others} time={this.state.time} />
);
}
}); ReactDOM.render(
<Parent name="chen" age="" />,
document.getElementById('example')
);
</script>
reactjs入门到实战(五)---- props详解的更多相关文章
- SVN与TortoiseSVN实战:补丁详解
硬广:<SVN与TortoiseSVN实战>系列已经写了五篇,第二篇<SVN与TortoiseSVN实战:标签与分支>和第三篇<SVN与TortoiseSVN实战:Tor ...
- SVN与TortoiseSVN实战:补丁详解(转)
硬广:<SVN与TortoiseSVN实战>系列已经写了五篇,第二篇<SVN与TortoiseSVN实战:标签与分支>和第三篇<SVN与TortoiseSVN实战:Tor ...
- Farseer.net轻量级开源框架 入门篇:添加数据详解
导航 目 录:Farseer.net轻量级开源框架 目录 上一篇:Farseer.net轻量级开源框架 入门篇: 分类逻辑层 下一篇:Farseer.net轻量级开源框架 入门篇: 修改数据详解 ...
- Java web 入门知识 及HTTP协议详解
Java web 入门知识 及HTTP协议详解 WEB入门 WEB,在英语中web即表示网页的意思,它用于表示Internet主机上供外界访问的资源. Internet上供外界访问的Web资 ...
- 【转】Zabbix 3.0 从入门到精通(zabbix使用详解)
[转]Zabbix 3.0 从入门到精通(zabbix使用详解) 第1章 zabbix监控 1.1 为什么要监控 在需要的时刻,提前提醒我们服务器出问题了 当出问题之后,可以找到问题的根源 网站/ ...
- Ubuntu14.04下Ambari安装搭建部署大数据集群(图文分五大步详解)(博主强烈推荐)
不多说,直接上干货! 写在前面的话 (1) 最近一段时间,因担任我团队实验室的大数据环境集群真实物理机器工作,至此,本人秉持负责.认真和细心的态度,先分别在虚拟机上模拟搭建ambari(基于CentO ...
- Ubuntu14.04下Cloudera安装搭建部署大数据集群(图文分五大步详解)(博主强烈推荐)(在线或离线)
第一步: Cloudera Manager安装之Cloudera Manager安装前准备(Ubuntu14.04)(一) 第二步: Cloudera Manager安装之时间服务器和时间客户端(Ub ...
- Farseer.net轻量级开源框架 入门篇:修改数据详解
导航 目 录:Farseer.net轻量级开源框架 目录 上一篇:Farseer.net轻量级开源框架 入门篇: 添加数据详解 下一篇:Farseer.net轻量级开源框架 入门篇: 删除数据详解 ...
- Farseer.net轻量级开源框架 入门篇:删除数据详解
导航 目 录:Farseer.net轻量级开源框架 目录 上一篇:Farseer.net轻量级开源框架 入门篇: 修改数据详解 下一篇:Farseer.net轻量级开源框架 入门篇: 查询数据详解 ...
- Farseer.net轻量级开源框架 入门篇:查询数据详解
导航 目 录:Farseer.net轻量级开源框架 目录 上一篇:Farseer.net轻量级开源框架 入门篇: 删除数据详解 下一篇:Farseer.net轻量级开源框架 中级篇: Where条 ...
随机推荐
- ACM/ICPC竞赛
ACM知识点分类 第一类:基础算法 (1) 基础算法:枚举,贪心,递归,分治,递推,构造,模拟 (2) 动态规划:背包问题,树形dp,状态压缩dp,单调性优化,插头dp (3) 搜索:dfs,bf ...
- oracle,sqlserver,mysql 命令行 开启、关闭所需要的服务
ORACLE需要开启的服务 需要启动的服务: 口令: 启动Oracle 11g服务: (下面的可以作为bat 脚本,直接运行便可以不用去自己去启动和关闭服务了.) @echo off @ EC ...
- C++之路进阶——bzoj1030(文本生成器)
F.A.Qs Home Discuss ProblemSet Status Ranklist Contest ModifyUser hyxzc Logout 捐赠本站 Notice:由于本OJ建立在 ...
- hdu5390 tree
先求出dfs序,然后建立线段树,线段树每个节点套一个set. 修改操作只需要改被子树区间完全覆盖的线段树节点,将其节点中set的原来的值删除,加入新值. 询问操作查询单点到根的所有节点上的set中与查 ...
- AR 应收 表
AR 应收 应收事务处理相关表 SELECT * FROM ar.ar_batches_all; --事务处理批 SELECT * FROM ar.ra_custom ...
- 夺命雷公狗---微信开发13----获取access_token
获得Access Token的方法1: 这里可以手动进行修改: https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential ...
- Verilog篇(一)
Verilog在行为级建模时常用到的一些函数,变量等. 1:$random(seed),每次根据seed的值产生一个32位的有符号数,seed的数据类型必须是寄存器(reg),整形(integer), ...
- PAT乙级 1017. A除以B (20)
1017. A除以B (20) 时间限制 100 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 本题要求计算A/B,其中A是不超过 ...
- ubuntu下配置SVN服务器
自己买的阿里云服务器.可是我老感觉没有SVN上传代码下载代码太不方便!决定配置个SVN服务器! 1.安装Subversion $ sudo apt-get install subversion $ s ...
- 《OpenGL着色语言》理解点记录三
“帧缓冲区”中的“帧”的含义? “帧”是连续图像中的一幅,3D可视化程序最终都是转化为一幅幅的图像输出在显示器上,这一幅幅的图像叫做叫“帧”. 解释“glBlendFunc(GL_SRC_AL ...