React组件间信息传递方式
组件之间传递信息方式,总体可分为以下5种:
1.(父组件)向(子组件)传递信息
2.(父组件)向更深层的(子组件) 进行传递信息 >>利用(context)
3.(子组件)向(父组件)传递信息
4.没有任何嵌套关系的组件之间传值(比如:兄弟组件之间传值)
5.利用react-redux进行组件之间的状态信息共享
一.(父组件)向(子组件)传递信息 >>>主要是通过 prop进行传值
来看下面的例子
- <span style="font-size:18px;">//父组件
- var MyContainer = React.createClass({
- getInitialState: function () {
- return {
- checked: false
- };
- },
- render: function() {
- return (
- <ToggleButton text="Toggle me" checked={this.state.checked} />
- );
- }
- });
- // 子组件
- var ToggleButton = React.createClass({
- render: function () {
- // 从(父组件)获取的值
- var checked = this.props.checked,
- text = this.props.text;
- return (
- <label>{text}: <input type="checkbox" checked={checked} /></label>
- );
- }
- });</span>
以上这个例子,子组件通过 prop拿到了text值以及checked的属性值;那么当子组件要拿到祖父级组件的信息,也是可以通过prop进行逐层的获取。来看下下面的例子。
官方文档的示例代码如下:
- <span style="font-size:18px;">var Button = React.createClass({
- render: function() {
- return (
- <button style={{background: this.props.color}}>
- {this.props.children}
- </button>
- );
- }
- });
- var Message = React.createClass({
- render: function() {
- return (
- <div>
- {this.props.text} <Button color={this.props.color}>Delete</Button>
- </div>
- );
- }
- });
- var MessageList = React.createClass({
- render: function() {
- var color = "purple";
- var children = this.props.messages.map(function(message) {
- return <Message text={message.text} color={color} />;
- });
- return <div>{children}</div>;
- }
- });</span>
以上的例子中第一层组件(MessageList)想要将color值传递到第三层组件(Button),通过第二层组件(Message)进行了传递。进而实现了。但是这种方式,并不是很优雅,如果传递的层级更多时,中间的层级都需要来传递,数据的传递变的更加繁琐。所以我们就会想到,是否可以"越级"获取数据。这时候就需要使用context。能帮你 "越级" 传递数据到组件中你想传递到的深层次组件中。
二.(父组件)向更深层的(子组件) 进行传递信息 >>利用(context)
利用context,改进后的代码如下:
- <span style="font-size:18px;">var Button = React.createClass({
- // 必须指定context的数据类型
- contextTypes: {
- color: React.PropTypes.string
- },
- render: function() {
- return (
- <button style={{background: this.context.color}}>
- {this.props.children}
- </button>
- );
- }
- });
- var Message = React.createClass({
- render: function() {
- return (
- <div>
- {this.props.text} <Button>Delete</Button>
- </div>
- );
- }
- });
- var MessageList = React.createClass({
- //父组件要定义 childContextTypes 和 getChildContext()
- childContextTypes: {
- color: React.PropTypes.string
- },
- getChildContext: function() {
- return {color: "purple"};
- },
- render: function() {
- var children = this.props.messages.map(function(message) {
- return <Message text={message.text} />;
- });
- return <div>{children}</div>;
- }
- });</span>
以上代码中通过添加 childContextTypes 和 getChildContext() 到 第一层组件MessageList ( context 的提供者),React 自动向下传递数据然后在组件中的任意组件(也就是说任意子组件,在此示例代码中也就是 Button )都能通过定义 contextTypes(必须指定context的数据类型) 访问 context 中的数据。这样就不需要通过第二层组件进行传递了。
指定数据并要将数据传递下去的父组件要定义 childContextTypes 和 getChildContext() ;想要接收到数据的子组件 必须定义 contextTypes 来使用传递过来的 context 。
三.(子组件)向(父组件)传递信息
来看下面的例子
- <span style="font-size:18px;">// 父组件
- var MyContainer = React.createClass({
- getInitialState: function () {
- return {
- checked: false
- };
- },
- onChildChanged: function (newState) {
- this.setState({
- checked: newState
- });
- },
- render: function() {
- var isChecked = this.state.checked ? 'yes' : 'no';
- return (
- <div>
- <div>Are you checked: {isChecked}</div>
- <ToggleButton text="Toggle me"
- initialChecked={this.state.checked}
- callbackParent={this.onChildChanged}
- />
- </div>
- );
- }
- });
- // 子组件
- var ToggleButton = React.createClass({
- getInitialState: function () {
- return {
- checked: this.props.initialChecked
- };
- },
- onTextChange: function () {
- var newState = !this.state.checked;
- this.setState({
- checked: newState
- });
- //这里将子组件的信息传递给了父组件
- this.props.callbackParent(newState);
- },
- render: function () {
- // 从(父组件)获取的值
- var text = this.props.text;
- // 组件自身的状态数据
- var checked = this.state.checked;
- //onchange 事件用于单选框与复选框改变后触发的事件。
- return (
- <label>{text}: <input type="checkbox" checked={checked} onChange={this.onTextChange} /></label>
- );
- }
- });</span>
以上例子中,在父组件绑定callbackParent={this.onChildChanged},在子组件利用this.props.callbackParent(newState),触发了父级的的this.onChildChanged方法,进而将子组件的数据(newState)传递到了父组件。
这样做其实是依赖 props 来传递事件的引用,并通过回调的方式来实现的。
四.没有任何嵌套关系的组件之间传值(比如:兄弟组件之间传值)
如果组件之间没有任何嵌套关系,组件嵌套层次比较深,我们该怎样去传递信息呢?
下面来看一个例子
这个例子需要引入一个PubSubJS 库,通过这个库你可以订阅的信息,发布消息以及消息退订。
PubSubJS 具体可参考下面的内容http://blog.csdn.net/u011439689/article/details/51955991
- <span style="font-size:18px;">// 定义一个容器(将ProductSelection和Product组件放在一个容器中)
- var ProductList = React.createClass({
- render: function () {
- return (
- <div>
- <ProductSelection />
- <Product name="product 1" />
- <Product name="product 2" />
- <Product name="product 3" />
- </div>
- );
- }
- });
- // 用于展示点击的产品信息容器
- var ProductSelection = React.createClass({
- getInitialState: function() {
- return {
- selection: 'none'
- };
- },
- componentDidMount: function () {
- //通过PubSub库订阅一个信息
- this.pubsub_token = PubSub.subscribe('products', function (topic, product) {
- this.setState({
- selection: product
- });
- }.bind(this));
- },
- componentWillUnmount: function () {
- //当组件将要卸载的时候,退订信息
- PubSub.unsubscribe(this.pubsub_token);
- },
- render: function () {
- return (
- <p>You have selected the product : {this.state.selection}</p>
- );
- }
- });
- var Product = React.createClass({
- onclick: function () {
- //通过PubSub库发布信息
- PubSub.publish('products', this.props.name);
- },
- render: function() {
- return <div onClick={this.onclick}>{this.props.name}</div>;
- }
- });</span>
ProductSelection和Product本身是没有嵌套关系的,而是兄弟层级的关系。但通过在ProductSelection组件中订阅一个消息,在Product组件中又发布了这个消息,使得两个组件又产生了联系,进行传递的信息。所以根据我个人的理解,当两个组件没有嵌套关系的时候,也要通过全局的一些事件等,让他们联系到一起,进而达到传递信息的目的。
五.利用react-redux进行组件之间的状态信息共享
如果是比较大型的项目,可以使用react-redux,这方面的资料可以参考阮一峰的网络日志。
地址:http://www.ruanyifeng.com/blog/2016/09/redux_tutorial_part_three_react-redux.
React组件间信息传递方式的更多相关文章
- React 组件间通讯
React 组件间通讯 说 React 组件间通讯之前,我们先来讨论一下 React 组件究竟有多少种层级间的关系.假设我们开发的项目是一个纯 React 的项目,那我们项目应该有如下类似的关系: 父 ...
- React 组件间通信介绍
React 组件间通信方式简介 React 组件间通信主要分为以下四种情况: 父组件向子组件通信 子组件向父组件通信 跨级组件之间通信 非嵌套组件间通信 下面对这四种情况分别进行介绍: 父组件向子 ...
- vue 和 react 组件间通信方法对比
vue 和 react 组件间通信方法对比: 通信路径 vue的方法 react的方法 父组件 => 子组件 props(推荐).slot(推荐).this.$refs.this.$childr ...
- react组件间的传值方法
关于react的几个网站: http://react.css88.com/ 小书:http://huziketang.mangojuice.top/books/react/ http://www.re ...
- React组件间的通讯
组件化开发应该是React核心功能之一,组件之间的通讯也是我们做React开发必要掌握的技能.接下来我们将从组件之间的关系来分解组件间如何传递数据. 1.父组件向子组件传递数据 通讯是单向的,数据必须 ...
- React组件间通信-sub/pub机制
React生命周期第二个demo演示了兄弟组件的通信,需要通过父组件,比较麻烦:下面介绍sub/pub机制来事项组件间通信. 1.导包 npm i pubsub-js 2.UserSearch.jsx ...
- React 组件间通信 总结
组件间通信 5.1.1. 方式一: 通过props传递 1) 共同的数据放在父组件上, 特有的数据放在自己组件内部(state) 2) 通过props可以传递一般数据和 ...
- react组件间传值详解
一.父子组件间传值 <1>父传子 父组件:
- React 组件间传值
壹 .了解React传值的数据 一. 创建组件的方法 一 . 1 通过function声明的组件特点是: 1)function创建的组件是没有state属性,而state属性决定它是不是有生命周期 ...
随机推荐
- DOM2级事件处理程序
DOM2级时间定义了两个方法:addEventListener() 和removeEventListener() 他们都接受3个参数:1)要处理的事件名 2)作为事件处理程序的函数 3)一个布尔值 ...
- Android 贝塞尔曲线解析
相信很多同学都知道"贝塞尔曲线"这个词,我们在很多地方都能经常看到.利用"贝塞尔曲线"可以做出很多好看的UI效果,本篇博客就让我们一起学习"贝塞尔曲线 ...
- android Camera模块分析
Android Camera Module Architecture and Bottom layer communication mechanism ----------- ...
- PHP 获取中英文混合字符串长度
通常情况下要想掌握一个字符串变量的长度[一般掌握其字数],自然想到 strlen |-- $str = 'string'; echo strlen($str); //6 .csharpcode, ...
- JAVA多线程----用--取钱问题2
在该示例代码中,TestAccount类是测试类,主要实现创建帐户Account类的对象,以及启动学生线程StudentThread和启动家长线程GenearchThread.在StudentThre ...
- jQuery轮播插件SuperSlide【2016-10-14】
[一.页面实现轮播效果] (1)效果下图可以自动轮播 (2)代码 autoPlay控制是否轮播 //banner轮播 $(".banner").slide({mainCell:& ...
- SpringMvc和servlet简单对比介绍
原文链接:http://www.cnblogs.com/haolnu/p/7294533.html 一.servlet实现登录. 咱们先来看一下servlet实现注册登录. <servlet&g ...
- BZOJ3924 ZJOI2015 幻想乡战略游戏 【动态点分治】
BZOJ3924 ZJOI2015 幻想乡战略游戏 Description 傲娇少女幽香正在玩一个非常有趣的战略类游戏,本来这个游戏的地图其实还不算太大,幽香还能管得过来,但是不知道为什么现在的网游厂 ...
- EXCEL某列长度超过255个字符导入SQL SERVER2005的处理方法
将注册表中 Jet引擎. HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Jet/4.0/Engines/Excel 如果是:ACE引擎. HKEY_LOCAL_MACHI ...
- 重温CLR(十六) CLR寄宿和AppDomain
寄宿(hosting)使任何应用程序都能利用clr的功能.特别要指出的是,它使现有应用程序至少能部分使用托管代码编写.另外,寄宿还为应用程序提供了通过编程来进行自定义和扩展的能力. 允许可扩展性意味着 ...