react组件之间传递信息/react组件之间值的传递

首先咱们先来了解一下,数据是怎么进行相互间传递的;
api和组件的区别:一个是逻辑层的方法函数,一个是表现层的组件(方法函数)。
api是一组预先定义好的函数,调用其实是调用其中的函数方法。
组件调用是直接表现在页面上。
SDK 就是 Software Development Kit 的缩写,中文意思就是“软件开发工具包”
什么是SDK?
SDK相当于开发集成工具环境,API就是数据接口。在SDK环境下调用API数据,实际上SDK包含了API的定义,API定义了一种能力,一种接口的规范,而SDK可以包含这种能力、包含这种规范。但是SDK又不完完全全只包含API以及API的实现,它是一个软件工具包,它还有很多其他辅助性的功能。
接下来说一说API和SDK之间的区别
API
API是前端调用后端数据的一个通道,就是我们俗说的接口,通过这个接口,可以访问到后端的数据,但是又无需调用源代码。
SDK
SDK是工程师为辅助开发某类软件的相关文档、范例和工具的集合,使用SDK可以提高开发效率,更简单的接入某个功能。
举例说明:一个产品想实现某个功能,可以找到相关的SDK,工程师直接接入SDK,就不用再重新开发了。

**1.组件 API中有以下7个方法:**
设置状态:setState
替换状态:replaceState
设置属性:setProps
替换属性:replaceProps
强制更新:forceUpdate
获取DOM节点:findDOMNode
判断组件挂载状态:isMounted

设置状态:setState: setState(object nextState[, function callback])
参数说明:nextState:将要设置的新状态,该状态会和当前的state合并。
callback:可选参数(可选的,不常用),回调函数,该函数会在state设置成功且组件重新渲染后调用
注意:不能在组件内部通过this.state修改状态,因为该状态会在调用setState()后被替换,setState()总是会触发一次组件重绘。

组件之间传递信息方式,总体可分为以下5种:

react重要的思想就是组件化思想
它将可以重用的部分进行组件化开发,形成一个个相对独立的组件,那么组件化后,各个组件间需要通信,组件可以将UI切分成一些独立的、可复用的部件,这样你就只需专注于构建每一个单独的部件。
组件从概念上看就像是函数,它可以接收任意的输入值(称之为“props”),并返回一个需要在页面上展示的React元素
1.(父组件)向(子组件)传递信息
2.(父组件)向更深层的(子组件) 进行传递信息 >>利用(context)
3.(子组件)向(父组件)传递信息
4.没有任何嵌套关系的组件之间传值(比如:兄弟组件之间传值)
5.利用react-redux进行组件之间的状态信息共享(这个放在下次讲,太多了)

一.(父组件)向(子组件)传递信息 >>>主要是通过 prop进行传值

.

//父组件
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>);}
});

以上这个例子,子组件通过 prop拿到了text值以及checked的属性值;那么当子组件要拿到祖父级组件的信息,也是可以通过prop进行逐层的获取。来看下下面的例子。

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>;}
});

以上的例子中第一层组件(MessageList)想要将color值传递到第三层组件(Button),通过第二层组件(Message)进行了传递。进而实现了第一层往第三层传递。但是这种方式,并不是很优雅,如果传递的层级更多时,中间的层级都需要来传递,数据的传递变的更加繁琐。所以我们就会想到,是否可以"越级"获取数据。这时候就需要使用context。能帮你 “越级” 传递数据到组件中你想传递到的深层次组件中。

二.(父组件)向更深层的(子组件) 进行传递信息

利用(context)进行更深层次的传递。

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>;}
});

以上代码中通过添加 childContextTypes 和 getChildContext() 到 第一层组件MessageList ( context 的提供者),React 自动向下传递数据然后在组件中的任意组件(也就是说任意子组件,在此示例代码中也就是 Button )都能通过定义 contextTypes(必须指定context的数据类型) 访问 context 中的数据。这样就不需要通过第二层组件进行传递了。
指定数据并要将数据传递下去的父组件要定义 childContextTypes 和 getChildContext() ;想要接收到数据的子组件必须定义 contextTypes 来使用传递过来的 context 。

三.(子组件)向(父组件)传递信息

直接上代码

// 父组件
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>);}
});

以上例子中,在父组件绑定callbackParent={this.onChildChanged},在子组件利用this.props.callbackParent(newState),触发了父级的的this.onChildChanged方法,进而将子组件的数据(newState)传递到了父组件。
这样做其实是依赖 props 来传递事件的引用,并通过回调的方式来实现的。

四.兄弟组件之间传值 (组件之间没有任何嵌套关系的传值)

想一想,如果组件之间没有任何嵌套关系,组件嵌套层次比较深,我们该怎样去处理各个组件中的值的传递呢?
这就需要我们引入一个PubSubJS 库,通过这个库你可以订阅的信息,发布消息以及消息退订。
// 定义一个容器(将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>你已经选择了这个产品 : {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>;}
});

ProductSelection和Product本身是没有嵌套关系的,而是兄弟层级的关系。但通过在ProductSelection组件中订阅一个消息,在Product组件中又发布了这个消息,使得两个组件又产生了联系,进行传递的信息。

五.利用react-redux进行组件之间的状态信息共享

提到redux的话,像基本的三个元素action,reducer,store都应该是清楚他们是干嘛的。这里就不做赘述了。

这是官方给出的redux的工作流,打个比方说,我们去图书馆借书
React Component就是图书借阅者,
action就相当于于我们的图书管理员或者借书机器,
store就是图书馆或者说是图书储存室,里面存储的都是书籍
我们去借书首先会发起action咨询图书管理员,或者直接找图书管理员来确认书籍书否可借阅(比如被借走,损坏修复中等),
图书管理员会去图书室查询一下书籍是否可借阅,如果可借阅,那么他就会将书籍返给你,如果不行,那么也会通知你。
这就是一个简单的redux流程。就相当于一次借阅图书的过程。
比较大型的企业项目中基本都会会用到react-redux,这方面的资料可以参考阮一峰的网络日志。
地址:http://www.ruanyifeng.com/blog/2016/09/

每天一句中文式外语

俄语

过海关或安检的时候使用

1. Скажите‚пожалуйста‚где проходит контроль паспорта? 请问‚在那里检查护照?
(思嘎热节‚八热俄思达‚哥姐 朴拉火鸡特 嘎恩特老李 八思八了打)2. Где надо подписаться? 在那签名?(哥姐‚那答 把特笔洒擦)3. У меня нет вещей для таможенной декларации.
我没有什么要申报的东西.(屋 灭尼阿 涅特 为写以 德里呀 打毛热拿衣 接可拉腊册呀)4. Это все мои личные вещи. 这些都是随身物品.
(爱达 复写 蚂蚁 力气内业 为西)5. Я хочу связаться с консульством КНР.我想和中华人民共和国领事馆联系.(雅 哈秋 思无亚擦 思嘎恩苏里思特娃母 嘎爱勒)6. Где взять декларацию? 在哪领报关单?(哥姐 无字压气 解渴拉腊册呀)

react组件之间传递信息/react组件之间值的传递相关推荐

  1. React(5)React兄弟组件之间的通信

    文章目录 前言 一.兄弟组件之间的通信原理 二.三个组件的基本结构 1.子组件ColorSelector的基本结构 2.子组件ColorBoard的基本结构 3.父组件Color的基本结构 三.Col ...

  2. React(一)父子组件之间的通信

    无论是React,还是Vue,父子组件之间的通信都是组件式开发至关重要的一部分.备注一下基础要点. 1.父组件向子组件传值 父组件向子组件传值是在调用子组件的时候通过参数传递给子组件 .父组件代码 i ...

  3. React(04):React中的组件化及父子组件间的传值取值

    前言 接着前一篇继续学习React组件化 React(03):React中的JSX语法 正文 什么是组件化: 是从 UI 界面视图的角度 来进行分析的:把一些可复用的UI元素,抽离为单独的组件:便于项 ...

  4. [react] 如何给非控组件设置默认的值?

    [react] 如何给非控组件设置默认的值? 表单元素依赖于状态(state),表单元素需要默认值实时映射到状态的时候,就是受控组件 <input name="username&quo ...

  5. react中使用非受控组件获取表单元素的值

    class Hello extends React.Component{constructor(){super() 利用react提供的React.createRef()this.ref=React. ...

  6. react组件设计原则_React组件设计规则

    react的目的是将前端页面组件化,用状态机的思维模式去控制组件.组件和组件之间肯定是有关系得,通过合理得组件设计,给每一个组件划定合适得边界,可以有效降低当我们对页面进行重构时对其他组件之间得影响. ...

  7. react 组件连动效果_React组件开发中常见的陷阱

    React作为使用最广泛Web前端开发之一,在Web开发领域越来成熟和稳固.其新版本发布的Hook API/concept使得组件更加便捷易用.虽然如此,React开发中仍然有很多的陷阱值得每一位Re ...

  8. React简介、虚拟DOM、Diff算法、创建React项目、JSX语法、组件、组件声明方式、组件传值props和state、组件的生命周期

    React简介: 前面只是简单介绍移动APP开发,后面还会继续深入介绍移动app开发:其中想要用ReactNative开发出更出色的应用,那么就得学好React,下面将介绍React: React 是 ...

  9. react如何卸载组件_18道 React 面试必考题含解答面试高频

    前言 React 前端框架的受欢迎程度丝毫木有减弱的迹象,全国许多城市对开发人员仍供不应求.对于经验不足的开发人员(或那些已经失业了一段时间的开发人员),在面试阶段展示您的知识可能会令人生畏. 在本文 ...

最新文章

  1. bootstrap组件的案例代码
  2. java国际化——Locale+数字格式
  3. php导入json文件_[php]导入超大json文件
  4. shell执行docker命令卡挂住_Docker官方文档翻译4
  5. [Codeforces Round #254 div1] C.DZY Loves Colors 【线段树】
  6. 华为申请注册姚安娜商标
  7. python svm 实战_opencv-python 入门实战:传统方法Hog+svm实现目标检测
  8. base64编码格式
  9. JavaScript问题01 js代码放在header和body的区别
  10. 思维破局:真正废掉一个人的,从来都不是一份稳定的工作
  11. GNSS/INS组合导航(五):惯性导航参数建模
  12. 12面魔方公式图解法_三阶魔方公式符号图解V2.0(2017/12/15)_碧海风云
  13. 【0基础入门课程】实战入门柿饼UI,带你实现动感汽车仪表盘、APP Store等
  14. 深入探讨大数据权限管理方案-从哲学到技术
  15. 明星热图|朱一龙环保主题大片出炉;李现为您开启新一年“红运”时刻;杨采钰成林清轩产品代言人...
  16. iterator 的遍历 循环输出数字,页码
  17. 2023/1/2总结
  18. 无法清除计算机的主dns,无法清除DNS缓存的解决办法
  19. 上交计算机考研科目,2020上海交通大学计算机考研大纲
  20. 《图书管理系统——“借书还书”模块》

热门文章

  1. c语言文件加密解密单词统计,C语言文件加密解密及单词统计程序.doc
  2. 2020年最受关注的前100 家互联网公司
  3. 为什么公司要对员工的薪资保密?
  4. windows命令行启动常用工具
  5. php $rs1- gt eof,PHP_PHP速成大法,简单介绍一下PHP的语法 1、嵌 - phpStudy
  6. python画矩阵图_Python根据已知邻接矩阵绘制无向图操作示例
  7. eZ publish 3 安装指南
  8. 荷兰苹果店发生人质劫持事件:持枪者已被制服
  9. 得益于iPad 苹果二季度在平板电脑应用处理器市场份额接近60%
  10. 《消费者报告》下调特斯拉Model 3安全评级