一、React数据的传输

1、属性和状态是react中数据传递的载体

2、属性是声明以后不允许被修改的东西

3、属性只能在组件初始化的时候声明并传入组件内部,并且在组件内部通过this.props获取

4、组件内部可以通过getDefaultProps声明默认属性

下面来说一下属性传值的两种方式:1.key-value形式 2.展开式

首先来看一下第一种传值方式:

var Demo = React.createClass({
render:function(){
var sty={width:'500px',height:'200px',border:'1px solid red',margin:'0 auto'}
console.log(this.props)
return(
<div>
<h1>属性字符串:{this.props.name}</h1>
<h1>属性数组:{this.props.aa[2]}</h1>
<div style={sty}>{this.props.bb.age}<br/>{this.props.bb.age1}<br/>{this.props.bb.age2}</div>
</div>
)
}
})
var str="hello react";
var arr=['你好',2222,'hi'];
var obj={
age:'白雪公主',
age1:'七个小矮人',
age2:'毒苹果'
}
ReactDOM.render(<Demo name={str} aa={arr} bb={obj} cc={arrx} dd={arry}/>,document.getElementById("out"))
/*
1/key-value形式 正常数据传值,组件内部this。props获取(对象)
2/{...}展开式传值 传输数据对对象形式,内部获取直接获取该对象的key名
*/

然后我们再看一下第二种展开式的传值方式:

注:展开式传值不能传字符串!非对象的形式不要用展开式传值!

ReactDOM.render(<Demo1 {...obj}/>,document.getElementById('out'))

组合数据:

var Demo = React.createClass({
render:function(){
var sty={width:'500px',height:'200px',border:'1px solid red',margin:'0 auto'}
console.log(this.props)
return(
<div>
<h2>组合数据数组:{this.props.cc[1][0]}{this.props.cc[2].age}</h2>
<h2>组合数据对象:{this.props.dd.name2.age} <br/> {this.props.dd.name3[0]}</h2>
</div>
)
}
})
var arrx=[
'hello react',
['你好',2222,'hi'],
{
age:'白雪公主',
age1:'七个小矮人',
age2:'毒苹果'
}
]
var arry = {
name:'hello react',
name2:{
age:'白雪公主',
age1:'七个小矮人',
age2:'毒苹果'
},
name3:['你好',2222,'hi'] }
ReactDOM.render(<Demo name={str} aa={arr} bb={obj} cc={arrx} dd={arry}/>,document.getElementById("out"))

 通过演示这两种传值方式我们可以看到,属性需要在ReactDOM.render 组件名后面加如此多自定义属性这样书写代码是不优雅的,看着很不舒服,那么如何优雅呢?上面我们也提到可以通过React生命周期的一个函数来声明组件内的默认属性,来看一下是不是优雅多了:

var Demo = React.createClass({
getDefaultProps:function(){
return{
res:'hi react',
res1:[1,2,3],
res2:{name:'小明'}
}
},
render:function(){
console.log(this.props)
return(
<div>
<h1>组件内部私有属性:{this.props.res}{this.props.res1[1]}{this.props.res2.name}</h1>
</div>
)
}
})
ReactDOM.render(<Demo/>,document.getElementById("out"))

状态传值

var Demo = React.createClass({
getDefaultProps:function(){
return{
res:'hi react'
}
},
getInitialState:function(){
return{
res:'hello state'
}
},
tap:function(){
this.setState({res:'修改状态值'})
},
render:function(){
console.log(this.props)
console.log(this.state)
return(
<div>
<h1>组件内部状态值:{this.state.res}</h1>
<button onClick={this.tap}>修改数据</button>
</div>
)
}
})
ReactDOM.render(<Demo/>,document.getElementById("out"))

属性和状态都可以传值,不同的是属性设置后在传输中不能修改,状态传值可以通过this.setState修改,但需要注意的是不能让它无触发修改,这样会造成二次渲染,浏览器会崩溃,需把这个触发放到事件函数中。

那么通过改变状态我们可以应用在页面登陆时修改密码是否可视,下面写个小的Demo:

var Demo=React.createClass({
getInitialState:function(){
return{
res:'text',
txt:'明文框'
}
},
tap:function(){
if(this.state.res=='text'){
this.setState({res:'password',txt:'密码框'})
}else{
this.setState({res:'text',txt:'明文框'})
} },
render:function(){
return(
<div>
<input type={this.state.res} />
<button onClick={this.tap}>{this.state.txt}</button>
</div>
)
}
})
ReactDOM.render(<Demo/>,document.getElementById('out'))

React学习小结(三)的更多相关文章

  1. react学习小结(生命周期- 实例化时期 - 存在期- 销毁时期)

    react学习小结   本文是我学习react的阶段性小结,如果看官你是react资深玩家,那么还请就此打住移步他处,如果你想给一些建议和指导,那么还请轻拍~ 目前团队内对react的使用非常普遍,之 ...

  2. React学习小结(一)

    一.React的发展 facebook在构建instagram网站的时候遇见两个问题: 1.数据绑定的时候,大量操作真实dom,性能成本太高 2.网站的数据流向太混乱,不好控制 于是facebook起 ...

  3. Maven学习小结(三 基本概念)

    1.Maven POM POM(Project Object Model)项目对象模型,是用Maven来管理项目里的一个叫做pom.xml的文件.所有的项目配置信息都被定义在这个文件中, 通过这个文件 ...

  4. React学习笔记(三) 组件传值

    组件嵌套后,父组件怎么向子组件发送数据呢? 答案是: this.props <script type="text/babel"> var MyFirst = React ...

  5. React学习小结(二)

    一.组件的嵌套 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <t ...

  6. javase学习小结三

    格式标识符: System.out.printf("%d,%f,%5d,%-9.4f,%%,%13e",67,78.9,89,78.9,567.345); 输出结果为:67,78. ...

  7. React.js学习小结

    最近一段时间都在学习React.js,感觉还不错,现在把自己的一些学习笔记记录一下,留着以后学习查看. 0.React全家桶(技术栈) 1.React主体 2.WebPack:grunt.gulp自动 ...

  8. (转)2019年 React 新手学习指南 – 从 React 学习线路图说开去

    原文:https://www.html.cn/archives/10111 注:本文根据 React 开发者学习线路图(2018) 结构编写了很多新手如何学习 React 的建议.2019 年有标题党 ...

  9. Python 学习小结

    python 学习小结 python 简明教程 1.python 文件 #!/etc/bin/python #coding=utf-8 2.main()函数 if __name__ == '__mai ...

随机推荐

  1. myeclipse2015复制项目需要修改的地方

    项目下  D:\Workspaces\MyEclipse 2015\angular001\.settings  的org.eclipse.wst.common.component文件,修改里面未原来的 ...

  2. 【one day one linux】find 用法详解小记

    find命令的功能很强大,查找文件的选项很多,所以这是一个很实用并且很常用的linux命令.但是他有个缺点就是搜索的时候比较慢的.而与之相对的有一个locate命令. find的命令格式 find   ...

  3. 【树莓派】修改树莓派盒子MAC地址

    用树莓派盒子,在某些客户方实施过程中,不同客户的网络环境对树莓派盒子的要求不同,网络管理配置要求MAC地址和IP绑定. 一种情况下,查询盒子的MAC地址,添加到网络管理的路由规则中即可: 另一种情况下 ...

  4. 需求收集实例 二 之 GF Phase 2

    GF Phase 2 做B2B的site, 需求收集过程与 需求收集过程实例之 - GF Phase 1主要的不同是在phase 1 开发在需求规格文档敲定后开始,而phase 2 把feature ...

  5. easyUI中datagrid的使用

    easyUI中的datagrid数据表格经常被用到,结合项目中的使用情况,总结一下datagrid使用中需要注意的一些问题.使用datagrid展示数据,需要在html.css.js中都要编写代码,h ...

  6. ZJOI2017 Round#2 滚粗记

    在杭州的火车站的KFC餐厅里,独自一人,闲来无事,便写写这篇博客.刚刚的一个礼拜,经历了余姚的省选和杭州的数学集训,感觉有些浪,学校里现在还在上新课,我已经落下一个礼拜的文化课了,回去估计补死:最重要 ...

  7. 使用OpenOffice实现各种文档转pdf或者html文档

    ---恢复内容开始--- 最近在做项目时需要写一个功能,将doc,ppt,xsl等文档做在线预览.网上查了很多资料,开始适用poi将文档转成pdf没成功,后来使用了OpenOffice4 + jodc ...

  8. 设计模式--MVC(C++版)

    MVC 模式代表 Model-View-Controller(模型-视图-控制器) 模式.这种模式用于应用程序的分层开发. Model(模型)-是应用程序中用于处理应用程序数据逻辑的部分.通常模型对象 ...

  9. Docker - 定制镜像

    Dockerfile Docker Hub拥有大量高质的官方镜像:可直接使用的服务类镜像.语言应用镜像.基础操作系统镜像等,满足绝大部分需求. 此外,可以通过定制镜像的方式来满足实际使用中的特定需求. ...

  10. Oracle的正则应用之匹配出手机号

    按照要求匹配出符合中国大陆手机号规则的数据 --1 表准备create table test_regexp( object varchar2(50)); --2 数据准备 insert into te ...