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 相关文章推荐
extjs 学习笔记(三) 最基本的grid
Oct 15 Javascript
Javascript面向对象编程(二) 构造函数的继承
Aug 28 Javascript
JS Array.slice 截取数组的实现方法
Jan 02 Javascript
json格式数据的添加,删除及排序方法
Jan 21 Javascript
JS读取XML文件数据并以table形式显示数据的方法(兼容IE与火狐)
Jun 02 Javascript
AngularJS 入门教程之HTML DOM实例详解
Jul 28 Javascript
基于zepto.js实现手机相册功能
Jul 11 Javascript
parabola.js抛物线与加入购物车效果的示例代码
Oct 25 Javascript
angularJs提交文本框数据到后台的方法
Oct 08 Javascript
JS实现鼠标拖拽盒子移动及右键点击盒子消失效果示例
Jan 29 Javascript
使用 js 简单的实现 bind、call 、aplly代码实例
Sep 07 Javascript
vue实现禁止浏览器记住密码功能的示例代码
Feb 03 Vue.js
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
PHP实现基于文本的摩斯电码生成器
2016/01/11 PHP
php构造函数与析构函数
2016/04/23 PHP
浅谈PHP正则中的捕获组与非捕获组
2016/07/18 PHP
PHP Ajax实现无刷新附件上传
2016/08/17 PHP
PHP简单遍历对象示例
2016/09/28 PHP
php中str_pad()函数用法分析
2017/03/28 PHP
PHP生成随机数的方法总结
2018/03/01 PHP
php使用curl伪造来源ip和refer的方法示例
2018/05/08 PHP
php实现的表单验证类完整示例
2019/08/13 PHP
JQuery与Ajax常用代码实现对比
2009/10/03 Javascript
24款非常有用的 jQuery 插件分享
2011/04/06 Javascript
js中的push和join方法使用介绍
2013/10/08 Javascript
节点的插入之append()和appendTo()的用法介绍
2014/01/13 Javascript
现代 JavaScript 开发编程风格Idiomatic.js指南中文版
2014/05/28 Javascript
jQuery实现列表自动滚动循环滚动展示新闻
2014/08/22 Javascript
jQuery实现带动画效果的二级下拉导航方法
2015/03/11 Javascript
JavaScript 七大技巧(一)
2015/12/13 Javascript
三种方式实现瀑布流布局
2017/02/10 Javascript
基于Bootstrap 3 JQuery及RegExp的表单验证功能
2017/02/16 Javascript
Vue计算属性的使用
2017/08/04 Javascript
React-Native中禁用Navigator手势返回的示例代码
2017/09/09 Javascript
vuejs实现递归树型菜单组件
2018/01/13 Javascript
深入浅析Vue全局组件与局部组件的区别
2018/06/15 Javascript
如何在Vue.JS中使用图标组件
2020/08/04 Javascript
[01:23:45]DOTA2-DPC中国联赛 正赛 CDEC vs Dragon BO3 第一场 1月22日
2021/03/11 DOTA
介绍Python中的一些高级编程技巧
2015/04/02 Python
Python编程实战之Oracle数据库操作示例
2017/06/21 Python
Python模拟脉冲星伪信号频率实例代码
2018/01/03 Python
python使用dlib进行人脸检测和关键点的示例
2020/12/05 Python
html5使用canvas压缩图片的示例代码
2018/09/11 HTML / CSS
高中生校园生活自我评价
2013/09/19 职场文书
你懂得怎么写自荐信吗?
2013/12/27 职场文书
国际贸易毕业生求职信
2014/07/20 职场文书
年终工作总结范文2014
2014/11/27 职场文书
2015年服务员工作总结
2015/04/08 职场文书
利用正则表达式匹配浮点型数据
2022/05/30 Java/Android