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 相关文章推荐
如何简单地用YUI做JavaScript动画
Mar 10 Javascript
JavaScript 精粹读书笔记(1,2)
Feb 07 Javascript
按下回车键指向下一个位置的一个函数代码
Mar 10 Javascript
判断字符串的长度(优化版)中文占两个字符
Oct 30 Javascript
JS中三目运算符和if else的区别分析与示例
Nov 21 Javascript
浅析在javascript中创建对象的各种模式
May 06 Javascript
Java框架SSH结合Easyui控件实现省市县三级联动示例解析
Jun 12 Javascript
BootStrap中jQuery插件Carousel实现轮播广告效果
Mar 27 jQuery
详解Vue的computed(计算属性)使用实例之TodoList
Aug 07 Javascript
微信小程序如何调用json数据接口并解析
Jun 29 Javascript
vue使用swiper实现中间大两边小的轮播图效果
Nov 24 Javascript
深入理解Antd-Select组件的用法
Feb 25 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
《破坏领主》销量已超100万 未来将继续开发新内容
2020/03/08 其他游戏
解析使用ThinkPHP应该掌握的调试手段
2013/06/20 PHP
PHP利用imagick生成组合缩略图
2016/02/19 PHP
有关PHP 中 config.m4 的探索
2020/08/26 PHP
javascript 对象的定义方法
2007/01/10 Javascript
Gird组件 Part-3:范例RSSFeed Viewer
2007/03/10 Javascript
jQuery关于导航条背景切换效果实现示例
2013/09/04 Javascript
jquery实现带渐变淡入淡出并向右依次展开的多级菜单效果实例
2015/08/22 Javascript
Bootstrap前端开发案例二
2016/06/17 Javascript
javascript实现瀑布流动态加载图片原理
2016/08/12 Javascript
浅谈js函数的多种定义方法与区别
2016/11/29 Javascript
element-ui 中的table的列隐藏问题解决
2018/08/24 Javascript
vuex + axios 做登录验证 并且保存登录状态的实例
2018/09/16 Javascript
微信小程序使用template标签实现五星评分功能
2018/11/03 Javascript
ionic4+angular7+cordova上传图片功能的实例代码
2019/06/19 Javascript
解决layui追加或者动态修改的表单元素“没效果”的问题
2019/09/18 Javascript
微信小程序实现列表滚动头部吸顶的示例代码
2020/07/12 Javascript
electron踩坑之dialog中的callback解决
2020/10/06 Javascript
前端 javascript 实现文件下载的示例
2020/11/24 Javascript
Python编程中字符串和列表的基本知识讲解
2015/10/14 Python
python使用matplotlib库生成随机漫步图
2018/08/27 Python
python对html过滤处理的方法
2018/10/21 Python
python 用下标截取字符串的实例
2018/12/25 Python
基于python实现自动化办公学习笔记(CSV、word、Excel、PPT)
2019/08/06 Python
Python中bisect的用法及示例详解
2020/07/20 Python
关于PyCharm安装后修改路径名称使其可重新打开的问题
2020/10/20 Python
Python requests HTTP验证登录实现流程
2020/11/05 Python
利用css3如何设置没有上下边的列表间隔线
2017/07/03 HTML / CSS
国际象棋商店:The Chess Store
2018/07/09 全球购物
Java方面的关于数组和继承的笔面试题
2015/09/18 面试题
电子技术专业中专生的自我评价
2013/12/17 职场文书
教育科研先进个人材料
2014/01/26 职场文书
感恩之星事迹材料
2014/05/03 职场文书
2014国庆节餐厅促销活动策划方案
2014/09/16 职场文书
2014党委书记四风问题对照检查材料思想汇报
2014/09/22 职场文书
学校就业保障协议书
2019/06/24 职场文书