react开发教程之React 组件之间的通信方式


Posted in Javascript onAugust 12, 2017

这两天学习了React感觉组件通信这个地方知识点挺多的,而且很重要,所以,今天添加一点小笔记。

父子组件通讯

通讯手段

这是最常见的通信方式,父组件只需要将子组件需要的props传给子组件,子组件直接通过this.props来使用。

通讯内容

更多要提的是如何合理的设置子组件的props,要想将子组件设计成一个复用性强的通用组件,需要将能够复用的部分抽象出来,抽象出来的props有两种形成,一种是简单的变量,另一种是抽象出来处理某种逻辑函数。

以Header 组件为例

react开发教程之React 组件之间的通信方式

//HeaderBar.jsx 子组件

import React, { Component } from 'react';

class Header extends Component {
  constructor() {
    super();
    this.handleClick = (e) => {
      console.log(this)
    }
  }

  renderLeftComponent() {

    let leftDOM = {};
    if (this.props.renderLeftComponent) {
      return this.props.renderLeftComponent();
    }

    if (this.props.showBack) {
      let backFunc = this.props.onBack || this.goBack;
      leftDOM = (<a onClick={backFunc.bind(this)}><i className="icon left-icon icon-left-arrow"></i></a>);
    }
    return leftDOM;
  }
  

  renderRightComponent() {
    if (this.props.renderRightComponent) {
      return this.props.renderRightComponent();
    }
  }

  goBack() {
    alert("返回上一页")
  }

  render() {
    return (
      <header className="header-bar">
        {this.renderLeftComponent()}
        <span>{this.props.title || '滴滴'}</span>
        {this.renderRightComponent()}
      </header>
    );
  }
}

export default Header;

//父亲组件部分代码App.jsx
import HeaderBar from "./components/Header";

let leftIcon = function () {
 return (
  <a><i className="icon left-icon icon-left-haha"></i>左边按钮</a>
 )
}
class App extends Component {

 render() {
  return (
   <div className="App">
    <HeaderBar title="滴滴打车" renderLeftComponent={leftIcon} />
   </div>
  );
 }
}

子父组件通讯

父-子组件通信的手段是通过子组件的props是子组件用父组件的东西,子-父组件通信,是父组件用子组件的东西,暂时了解的两种方法

利用回调函数

父组件通过props传递一个方法给子组件,子组件通过props方法将子组件数据传递给父组件

利用ref

父组件通过refs调用子组件的属性

跨级组件通信

在React中当一个属性反复使用并且存在与好几个子组件中的时候,这个时候我们如果通过props一级一级传递的话可以实现多层级访问,但是这样出现一个问题就是会使代码非常混乱,在React中国年,我们还可以使用 context 来实现跨级父子组件间的通信;

在react中context称为虫洞

// Component 父级
class parentComponent extends React.Component {
  
  // add the following property
  static childContextTypes = {
    color: React.PropTypes.string
  }
  
  // 添加下面方法
  getChildContext() {
    return {
      color: "#f00"
    }
  }
  
  render() {
    <div>
      <Child1 />
    </div>
  }
}


// Component Child1
class Child1 extends React.Component {
  // 添加下面属性
  static contextTypes = {
    color: React.PropTypes.string
  }
  
  render() {
    <div>{this.context.color}</div>
  }
}

同级组件通信

同级组件之间的通信还是需要通过父组件作为中介,利用多次父-子组件通信,项目中将需要传递的数据放在了父组件的state中,变动时可以自动的同步传递。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
js子页面获取父页面数据示例
May 15 Javascript
javaScript中Math()函数注意事项
Jun 18 Javascript
js中 计算两个日期间的工作日的简单实例
Aug 08 Javascript
将鼠标焦点定位到文本框最后(代码分享)
Jan 11 Javascript
jQuery实现可编辑表格并生成json结果(实例代码)
Jul 19 jQuery
浅谈Vue2.0中v-for迭代语法的变化(key、index)
Mar 06 Javascript
vue 微信授权登录解决方案
Apr 10 Javascript
原生js无缝轮播插件使用详解
Mar 09 Javascript
利用原生JS实现欢乐水果机小游戏
Apr 23 Javascript
vue+canvas实现移动端手写签名
May 21 Javascript
ES6学习教程之Promise用法详解
Nov 22 Javascript
uni-app 微信小程序授权登录的实现步骤
Feb 18 Javascript
vuejs+element-ui+laravel5.4上传文件的示例代码
Aug 12 #Javascript
浅谈关于angularJs中使用$.ajax的注意点
Aug 12 #Javascript
详解Vue-Cli 异步加载数据的一些注意点
Aug 12 #Javascript
js模块加载方式浅析
Aug 12 #Javascript
浅谈angular2 组件的生命周期钩子
Aug 12 #Javascript
Node.js pipe实现源码解析
Aug 12 #Javascript
vue实现移动端图片裁剪上传功能
Aug 18 #Javascript
You might like
BBS(php &amp; mysql)完整版(五)
2006/10/09 PHP
修改php.ini以达到屏蔽错误信息并记录日志
2013/06/16 PHP
php的4种常见运行方式
2015/03/20 PHP
PHP常用字符串操作函数实例总结(trim、nl2br、addcslashes、uudecode、md5等)
2016/01/09 PHP
PHP面向对象程序设计OOP继承用法入门示例
2016/12/27 PHP
PHP实现浏览器格式化显示XML的方法示例
2019/01/22 PHP
laravel框架的安装与路由实例分析
2019/10/11 PHP
从零开始学习jQuery (十一) 实战表单验证与自动完成提示插件
2011/02/23 Javascript
Javascript操作cookie的函数代码
2012/10/03 Javascript
javascript创建createXmlHttpRequest对象示例代码
2014/02/10 Javascript
JavaScript的原型继承详解
2015/02/15 Javascript
input输入框鼠标焦点提示信息
2015/03/17 Javascript
jquery实现简单的无缝滚动
2015/04/15 Javascript
JQuery使用index方法获取Jquery对象数组下标的方法
2015/05/18 Javascript
详解Angularjs filter过滤器
2016/02/06 Javascript
数据结构中的各种排序方法小结(JS实现)
2016/07/23 Javascript
EasyUI Datebox 日期验证之开始日期小于结束时间
2017/05/19 Javascript
Node.js实现mysql连接池使用事务自动回收连接的方法示例
2018/02/03 Javascript
单线程JavaScript实现异步过程详解
2020/05/19 Javascript
Python编写检测数据库SA用户的方法
2014/07/11 Python
python如何对实例属性进行类型检查
2018/03/20 Python
python引入不同文件夹下的自定义模块方法
2018/10/27 Python
python3实现高效的端口扫描
2019/08/31 Python
Python 3.6打包成EXE可执行程序的实现
2019/10/18 Python
python+Django+pycharm+mysql 搭建首个web项目详解
2019/11/29 Python
CSS3弹性伸缩布局之box布局
2016/07/12 HTML / CSS
Marriott国际:万豪国际酒店查询预订
2017/09/25 全球购物
eBay美国官网:eBay.com
2020/10/24 全球购物
酒吧副总经理岗位职责
2013/12/10 职场文书
2014两会优秀的心得体会范文
2014/03/17 职场文书
函授本科个人自我鉴定
2014/03/25 职场文书
2014党委书记四风对照检查材料思想汇报
2014/09/21 职场文书
关于有小孩的离婚协议书
2014/10/26 职场文书
大学学生个人总结
2015/02/15 职场文书
劳务派遣管理制度(样本)
2019/08/23 职场文书
openGauss数据库JDBC环境连接配置的详细过程(Eclipse)
2022/06/01 Java/Android