二十、父组件向子组件传递信息

案例22:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<style>
.box{background:red;}
</style>
<meta charset="utf-8">
<script src="https://npmcdn.com/react@15.3.1/dist/react.min.js"></script>
<script src="https://npmcdn.com/react-dom@15.3.1/dist/react-dom.min.js"></script>
<script src="https://npmcdn.com/babel-core@5.8.38/browser.min.js"></script>
</head>
<body>
<div id="example"></div>
<script type="text/babel">
// 父组件
var Parent = React.createClass({
getInitialState: function () {
return {
checked: true,
class:'box'
};
},
render: function() {
return (
<Child txt="是否喜欢咖啡" class={this.state.class} checked={this.state.checked} />
);
}
}); // 子组件
var Child = React.createClass({
render: function () {
var checked = this.props.checked;
return (
<div className = {this.props.class}>
{this.props.txt}:
<input type="checkbox" checked={checked} />
</div>
);
}
}); ReactDOM.render(
<Parent />,
document.getElementById('example')
) </script>
</body>
</html>

效果图如下

分析如下

  • 父元素Parent上在getInitialState里设置了两个初始值checked和class

  • 父元素Parent的Child标签上有三个属性txt、class、checked。txt的属性值为“是否喜欢咖啡”;class的属性值是从getInitialState里获取的class的初始值,值为box;checked的属性值是从getInitialState里获取的checked的初始值,值为true。

  • 子组件Child的checked这个变量的值,是从父组件Parent传递过来的,即为父组件Parent的Child标签上checked的属性值,即为true。

  • 子组件Child的className的属性值,是从父组件Parent传递过来的,即为父组件Parent的Child标签上class的属性值,即为box。

  • 子组件this.props.txt,是从父组件Parent传递过来的,即为父组件Parent的Child标签上txt的属性值,即为“是否喜欢咖啡”。

上面这个例子是父组件里面嵌套了一个子组件,当然我们子组件里面还可以嵌套孙子组件

案例23:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<meta charset="utf-8">
<script src="https://npmcdn.com/react@15.3.1/dist/react.min.js"></script>
<script src="https://npmcdn.com/react-dom@15.3.1/dist/react-dom.min.js"></script>
<script src="https://npmcdn.com/babel-core@5.8.38/browser.min.js"></script>
</head>
<body>
<div id="example"></div>
<script type="text/babel">
// 父组件
var Parent = React.createClass({
getInitialState: function () {
return {
checked: true,
};
},
render: function() {
return (
<Child txt="是否喜欢咖啡" checked={this.state.checked} />
);
}
}); // 子组件
var Child = React.createClass({
render: function () {
return (
<div>
<Grandchild txt={this.props.txt} />
<input type="checkbox" checked={this.props.checked} />
</div>
);
}
}); // 孙子组件
var Grandchild = React.createClass({
render: function () {
return (
<label>
{this.props.txt}
</label>
);
}
});
ReactDOM.render(
<Parent />,
document.getElementById('example')
) </script>
</body>
</html>

效果如下

分析如下

从这个例子我们可以知道,信息可以从Parent一直传递到Grandchild上去,以此类推可以依次传递下去。但是,如果组件嵌套层次太深,那么从外到内组件的交流成本就变得很高,通过 props 传递值的优势就不那么明显了。

二十一、子组件向父组件传值

案例24:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<meta charset="utf-8">
<script src="https://npmcdn.com/react@15.3.1/dist/react.min.js"></script>
<script src="https://npmcdn.com/react-dom@15.3.1/dist/react-dom.min.js"></script>
<script src="https://npmcdn.com/babel-core@5.8.38/browser.min.js"></script>
</head>
<body>
<div id="example"></div>
<script type="text/babel">
// 父组件
var Parent = React.createClass({
getInitialState: function () {
return {
txt: 123
};
},
childChange: function (newState) {
this.setState({
txt: newState
});
},
render: function() {
return (
<div>
{this.state.txt}
<Child tab="输入框" txt={this.state.txt} callback={this.childChange} />
</div>
);
}
}); // 子组件
var Child = React.createClass({
getInitialState: function () {
return {
txt: this.props.txt
};
},
toChange: function (event) {
var newState = event.target.value;
this.setState({
txt: newState
});
this.props.callback(newState);
},
render: function () {
return (
<div>
<span>{this.props.tab}</span>
<input type="text" value={this.state.txt} onChange={this.toChange} />
</div>
);
}
}); ReactDOM.render(
<Parent />,
document.getElementById('example')
) </script>
</body>
</html>

效果如下

分析如下(文字结合图片一起看)

  • 父组件Parent的Child标签上txt属性的值,是从getInitialState里设置的txt的值,即为123
  • 子组件Child的span标签里{this.props.tab},是获取的父元素Parent里传递过来的信息,即为父元素Parent的Child标签上tab属性的值,即为“输入框”。
  • 子组件Child的input标签上value的值,是从getInitialState里设置的txt的值,这个txt的值为父元素Parent的Child标签上txt属性的值,即为123。
  • 在子组件Child里,当input值发生改变的时候,就触发onChange事件,调用toChange方法。
  • 在子组件Child的toChange方法里,event.target.value是input的value值,将input的value值赋值给newState这个变量;通过setState将txt的值修改为newState的值,即为input的value值;this.props.callback,这里向父元素的callback里传递了一个newState值,即为input的value值。
  • 在父组件Parent的Child标签上,callback被触发后,会调用childChange方法,在这个方法里,通过setState将txt的值修改为子组件Child传递过来的newState值。

二十二、没有嵌套关系的组件之间传值

案例25:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<meta charset="utf-8">
<script src="https://npmcdn.com/react@15.3.1/dist/react.min.js"></script>
<script src="https://npmcdn.com/react-dom@15.3.1/dist/react-dom.min.js"></script>
<script src="https://npmcdn.com/babel-core@5.8.38/browser.min.js"></script>
</head>
<body>
<div id="example"></div>
<script type="text/babel">
var Parent = React.createClass({
getInitialState: function() {
return {
txt: '123'
};
},
childOneCb:function(newOne){
this.setState({
txt:newOne
})
},
render: function () {
return (
<div>
<ChildOne txt={this.state.txt} cbOne={this.childOneCb} />
<ChildTwo txt={this.state.txt} />
</div>
);
}
}); var ChildOne = React.createClass({
getInitialState: function() {
return {
txt: this.props.txt
};
},
inputChange:function(event){
this.setState({
txt:event.target.value
});
this.props.cbOne(event.target.value);
},
render: function() {
return (
<div>
ChildOne:<input type="text" value={this.state.txt} onChange={this.inputChange} />
</div>
);
}
}); var ChildTwo = React.createClass({
render: function () {
return (
<div>
ChildTwo:{this.props.txt}
</div>
);
}
}); ReactDOM.render(
<Parent />,
document.getElementById('example')
) </script>
</body>
</html>

效果如下

分析如下

  • 首先来看父元素Parent

  • 接下来看ChildOne

cbOne在父组件Parent上ChildOne标签上看到

  • 接下来再回到父组件Parent上

这个时候已经完成了在子组件ChildOne上修改input的value值,父组件Parent里txt的状态会随之改变

  • 下面来看ChildTwo

父组件Parent里txt值随着子组件ChildOne里input值而改变,这里的值也是获取的父组件Parent里txt的状态。因此ChildTwo里的值也会随着ChildOne里的值而改变。

react入门(5)的更多相关文章

  1. react入门(3)

    在第一篇文章里我们介绍了jsx.组件.css写法  点击查看react入门(1) 第二篇文章里我们介绍了事件.this.props.children.props....other.map循环  点击查 ...

  2. react入门(1)

    这篇文章也不能算教程咯,就算是自己学习整理的笔记把. 关于react一些相关的简介.优势之类的,随便百度一下一大堆,我就不多说了,可以去官网(http://reactjs.cn/)看一下. 这片主要讲 ...

  3. react入门(2)

    接着上一次的讲,如果没有看过上一篇文章的小伙伴可以先看一下http://www.cnblogs.com/sakurayeah/p/5807821.html React事件 可以先看一下官网讲解的内容h ...

  4. react入门(4)

    首先还是来回顾一下前三篇讲的内容 react入门(1): jsx,组件,css写法 react入门(2):事件,this.props.children,props,...other react入门(3 ...

  5. React 入门实例教程(转载)

    本人转载自: React 入门实例教程

  6. React 入门实例教程

    现在最热门的前端框架,毫无疑问是 React . 上周,基于 React 的 React Native 发布,结果一天之内,就获得了 5000 颗星,受瞩目程度可见一斑. React 起源于 Face ...

  7. React入门 (1)—使用指南(包括ES5和ES6对比)

    前言 本篇会简明扼要的介绍一下React的使用方法.代码会用JSX+ES5和JSX+ES6两种方式实现. React简介 React来自Facebook,于2013年开源.至今不断修改完善,现在已经到 ...

  8. React入门简单实践

    参考文献: 1.React入门示例教程——阮一峰 2.React仅仅只是你的界限 React主要的优点就是增量更新(虚拟DOM)和组件化(状态机). <!DOCTYPE html> < ...

  9. 2015年最热门前端框架React 入门实例教程

    现在最热门的前端框架,毫无疑问是 React . 上周,基于 React 的 React Native 发布,结果一天之内,就获得了 5000 颗星,受瞩目程度可见一斑. React 起源于 Face ...

  10. React入门资源整理

    另外,附上我搜集的一些比较实用的学习资料,建议先看这些撸起来,再看什么乱七八糟的awsome系列. React入门资源整理 React项目新手指南 http://www.w3ctech.com/top ...

随机推荐

  1. 如何在arcmap中调试addin或者插件

    1. 首先,在arcmap中,依次点击“自定义”->"加载项管理器",加载dll或者tlb文件 2. 其次,在vs中,依次点击“工具”->“附加到进程",在对 ...

  2. javascript中的内置对象总结

    内置对象 标准内置对象 Object Object.create Object.prototype.toString Object.prototype.hasOwnProperty Boolean S ...

  3. CYQ.Data V5 MDataTable 专属篇介绍

    前言 以前一两个月才出一篇,这三天有点变态地连续1天1篇(其实都是上周末两天写好的存货). 短期应该没有新的和此框架相关的文章要写了,这应该是最后一篇,大伙且看且珍惜. 前两篇讲数据库读写分离和分布式 ...

  4. UWP图片编辑器(涂鸦、裁剪、合成)

    一.编辑器简介 写这个控件之前总想找一找开源的,可以偷下懒省点事.可是各种地方都搜遍了也没有找到. 于是,那就做第一个吃螃蟹的人吧! 控件主要有三个功能:涂鸦.裁剪.合成. 涂鸦:主要是用到了InkT ...

  5. [.net 面向对象程序设计深入](6).NET MVC 6 —— 模型、视图、控制器、路由等的基本操作

    [.net 面向对象程序设计深入](6).NET MVC 6 —— 模型.视图.控制器.路由等的基本操作 1. 使用Visual Studio 2015创建Web App (1)文件>新建> ...

  6. 图片拾取器-PicPicker

    最近报名参加了360前端星计划,想当一名前端实习生,学习更多更流行的前端知识.然后需要完成一个作业,才能进培训,进了培训还得看运气才能留下,流程不少.书归正传,请看: 课后作业题目 请从下面两个题目中 ...

  7. vmware 安装xp 流水账

    1. 分区 PQ分区.1个区,C盘,NTFS. 2. 安装XP 进入ghost,不要选择一键. 然后fromImage, d:\xxx\GHO

  8. C语言 · 2的次幂表示

    问题描述 任何一个正整数都可以用2进制表示,例如:137的2进制表示为10001001. 将这种2进制表示写成2的次幂的和的形式,令次幂高的排在前面,可得到如下表达式:137=2^7+2^3+2^0 ...

  9. Thrift架构~目录

    回到占占推荐博客索引 概念相关 thrift是一个软件框架,用来进行可扩展且跨语言的服务的开发.它结合了功能强大的软件堆栈和代码生成引擎,以构建在 C++, Java, Python, PHP, Ru ...

  10. C#中通过反射方法获取控件类型和名称

    这个方法是简单的也是神奇的. 有木有想过,将自己项目中的所有类型,包括自定义类型的命名空间和名称全部获取出来? 有木有想过,有一种简便的方法可以自动化管理项目中的控件和窗体? 有木有想过... 首先, ...