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 相关文章推荐
JavaScript学习笔记之获取当前目录的实现代码
Dec 14 Javascript
利用jquery的获取JS文件中的字符串内容
Feb 14 Javascript
Jvascript学习实践案例(开发常用)
Jun 25 Javascript
JavaScript实现GriwView单列全选(自写代码)
May 13 Javascript
js和jquery使按钮失效为不可用状态的方法
Jan 26 Javascript
JavaScript中合并数组的N种方法
Sep 16 Javascript
JS根据生日月份和日期计算星座的简单实现方法
Nov 24 Javascript
详解javascript立即执行函数表达式IIFE
Feb 13 Javascript
ie下js不执行的几种可能
Feb 28 Javascript
Angular2使用jQuery的方法教程
May 28 jQuery
JS获取指定月份的天数两种实现方法
Jun 22 Javascript
webpack-mvc 传统多页面组件化开发详解
May 07 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连接SQLSERVER 注意事项(附dll文件下载)
2012/06/28 PHP
PDO版本问题 Invalid parameter number: no parameters were bound
2013/01/06 PHP
PHP经典面试题集锦
2015/03/19 PHP
分享PHP计算两个日期相差天数的代码
2015/12/23 PHP
微信公众平台开发-微信服务器IP接口实例(含源码)
2017/03/05 PHP
JavaScript 常见对象类创建代码与优缺点分析
2009/12/07 Javascript
JavaScript加强之自定义event事件
2013/09/21 Javascript
使用JSLint提高JS代码质量方法分享
2013/12/16 Javascript
JavaScript数组对象实现增加一个返回随机元素的方法
2015/07/27 Javascript
javascript使用输出语句实现网页特效代码
2015/08/06 Javascript
pace.js页面加载进度条插件
2015/09/29 Javascript
js css3实现图片拖拽效果
2017/03/04 Javascript
Vue2几种常见开局方式详解
2017/09/09 Javascript
详解用webpack的CommonsChunkPlugin提取公共代码的3种方式
2017/11/09 Javascript
使用koa-log4管理nodeJs日志笔记的使用方法
2018/11/30 NodeJs
vue 内置过滤器的使用总结(附加自定义过滤器)
2018/12/11 Javascript
vue-cli3+ts+webpack实现多入口多出口功能
2019/05/30 Javascript
Layui实现带查询条件的分页
2019/07/27 Javascript
微信小程序实现滑动翻页效果(完整代码)
2019/12/06 Javascript
vue列表数据发生变化指令没有更新问题及解决方法
2020/01/16 Javascript
微信小程序全选多选效果实现代码解析
2020/01/21 Javascript
jQuery实现异步上传一个或多个文件
2020/08/17 jQuery
[46:00]Ti4 冒泡赛第二轮LGD vs C9 2
2014/07/14 DOTA
剖析Django中模版标签的解析与参数传递
2015/07/21 Python
Django后台获取前端post上传的文件方法
2018/05/28 Python
Flask框架web开发之零基础入门
2018/12/10 Python
python return逻辑判断表达式实现解析
2019/12/02 Python
浅谈Keras中shuffle和validation_split的顺序
2020/06/19 Python
python如何爬取动态网站
2020/09/09 Python
html5 学习简单的拾色器
2010/09/03 HTML / CSS
canvas生成带二维码海报的踩坑记录
2019/09/11 HTML / CSS
美国50岁以上单身人士约会平台:SilverSingles
2018/06/29 全球购物
环境科学专业求职信
2014/08/04 职场文书
保安辞职申请书应该怎么写?
2019/07/15 职场文书
MySQL 重命名表的操作方法及注意事项
2021/05/21 MySQL
Python爬取奶茶店数据分析哪家最好喝以及性价比
2022/09/23 Python