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 相关文章推荐
仿163填写邮件地址自动显示下拉(无优化)
Nov 05 Javascript
JS实现的省份级联实例代码
Jun 24 Javascript
JavaScript中的函数的两种定义方式和函数变量赋值
May 12 Javascript
删除Javascript Object中间的key
Nov 18 Javascript
jQuery 处理页面的事件详解
Jan 20 Javascript
angularJS结合canvas画图例子
Feb 09 Javascript
apply和call方法定义及apply和call方法的区别
Nov 15 Javascript
详解windows下vue-cli及webpack 构建网站(二)导入bootstrap样式
Jun 17 Javascript
javascript实现电脑和手机版样式切换
Nov 10 Javascript
微信小程序swiper禁止用户手动滑动代码实例
Aug 23 Javascript
layer.prompt输入层的例子
Sep 24 Javascript
微信小程序使用前置摄像头拍照
Oct 22 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
PHP+FLASH实现上传文件进度条相关文件 下载
2007/07/21 PHP
基于JQuery的密码强度验证代码
2010/03/01 Javascript
jquery实现的一个导航滚动效果具体代码
2013/05/27 Javascript
JS比较两个时间大小的简单示例代码
2013/12/20 Javascript
Seajs的学习笔记
2014/03/04 Javascript
Javascript中prototype属性实现给内置对象添加新的方法
2015/05/14 Javascript
JavaScript实现Iterator模式实例分析
2015/06/09 Javascript
使用jquery如何获取时间
2016/10/13 Javascript
javascript实现一个网页加载进度loading
2017/01/04 Javascript
在使用JSON格式处理数据时应该注意的问题小结
2017/05/20 Javascript
浅谈vue中get请求解决传输数据是数组格式的问题
2020/08/03 Javascript
[03:58]兄弟们,回来开黑了!DOTA2昔日战友招募宣传视频
2016/07/17 DOTA
[49:21]完美世界DOTA2联赛循环赛 Ink Ice vs LBZS BO2第二场 11.05
2020/11/06 DOTA
python批量生成本地ip地址的方法
2015/03/23 Python
python将文本分每两行一组并保存到文件
2018/03/19 Python
python 读取目录下csv文件并绘制曲线v111的方法
2018/07/06 Python
python 3.6.2 安装配置方法图文教程
2018/09/18 Python
python进行TCP端口扫描的实现
2018/12/21 Python
python网络爬虫 CrawlSpider使用详解
2019/09/27 Python
Python实现对adb命令封装
2020/03/06 Python
Python写捕鱼达人的游戏实现
2020/03/31 Python
见习期自我鉴定
2013/11/07 职场文书
应届生法律顾问求职信
2013/11/19 职场文书
卫生系统先进事迹
2014/05/13 职场文书
医学检验专业自荐信
2014/09/18 职场文书
教师党员个人剖析材料
2014/09/29 职场文书
单位工作证明
2014/10/07 职场文书
党员查摆剖析材料
2014/10/10 职场文书
2015年采购工作总结
2015/04/10 职场文书
2015年维修工作总结
2015/04/25 职场文书
小学生家长意见
2015/06/03 职场文书
素质拓展训练感想
2015/08/07 职场文书
创业计划书之牛肉汤快餐店
2019/10/08 职场文书
springboot集成springCloud中gateway时启动报错的解决
2021/07/16 Java/Android
Python pandas求方差和标准差的方法实例
2021/08/04 Python
Spring Boot 底层原理基础深度解析
2022/04/03 Java/Android