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控制表格隔行变色
Jun 26 Javascript
JS类的封装及实现代码
Dec 02 Javascript
js数组Array sort方法使用深入分析
Feb 21 Javascript
jquery必须知道的一些常用特效方法及使用示例(整理)
Jun 24 Javascript
javascript 实现字符串反转的三种方法
Nov 23 Javascript
javascript生成随机数的方法
May 16 Javascript
手机端网页点击链接触发自动拨打或保存电话的示例代码
Aug 15 Javascript
学习使用bootstrap3栅格系统
Apr 12 Javascript
BootStrap fileinput.js文件上传组件实例代码
Feb 20 Javascript
jQuery插件之validation插件
Mar 29 jQuery
微信小程序实现单选功能
Oct 30 Javascript
JavaScript 替换所有匹配内容及正则替换方法
Feb 12 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
PHP4实际应用经验篇(6)
2006/10/09 PHP
一步一步学习PHP(8) php 数组
2010/03/05 PHP
PHP企业级应用之常见缓存技术篇
2011/01/27 PHP
php内核解析:PHP中的哈希表
2014/01/30 PHP
php将图片保存入mysql数据库失败的解决方法
2014/12/27 PHP
关于扩展 Laravel 默认 Session 中间件导致的 Session 写入失效问题分析
2016/01/08 PHP
php显示页码分页类的封装
2017/06/08 PHP
JavaScript 事件系统
2010/07/22 Javascript
基于BootStrap Metronic开发框架经验小结【七】数据的导入、导出及附件的查看处理
2016/05/12 Javascript
js获取上传文件的绝对路径实现方法
2016/08/02 Javascript
Bootstrap对话框使用实例讲解
2016/09/24 Javascript
Bootstrap基本组件学习笔记之下拉菜单(7)
2016/12/07 Javascript
微信小程序 WebSocket详解及应用
2017/01/21 Javascript
JQuery元素快速查找与操作
2018/04/22 jQuery
vue element动态渲染、移除表单并添加验证的实现
2019/01/16 Javascript
JavaScript ES6常用基础知识总结
2019/02/09 Javascript
使用Bootstrap做一个朝代历史表
2019/12/10 Javascript
python实现Floyd算法
2018/01/03 Python
python 哈希表实现简单python字典代码实例
2019/09/27 Python
图解python全局变量与局部变量相关知识
2019/11/02 Python
Python远程开发环境部署与调试过程图解
2019/12/09 Python
Opencv python 图片生成视频的方法示例
2020/11/18 Python
html5录音功能实战示例
2019/03/25 HTML / CSS
Ryderwear美国官网:澳大利亚高端健身训练装备品牌
2018/04/24 全球购物
瑞士图书网站:Weltbild.ch
2019/09/17 全球购物
数据库面试要点基本概念
2013/10/31 面试题
高分子材料与工程专业推荐信
2013/12/01 职场文书
教育课题研究自我鉴定范文
2013/12/28 职场文书
学校党员个人问题整改措施思想汇报
2014/10/08 职场文书
党员贯彻十八大精神思想汇报范文
2014/10/25 职场文书
大学生就业推荐表自我评价
2015/03/02 职场文书
银行保安拾金不昧表扬稿
2015/05/05 职场文书
团拜会主持词
2015/07/04 职场文书
运动会班级前导词
2015/07/20 职场文书
yyds什么意思?90后已经听不懂00后讲话了……
2022/02/03 杂记
项目中Nginx多级代理是如何获取客户端的真实IP地址
2022/05/30 Servers