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 相关文章推荐
jQuery使用$.ajax进行异步刷新的方法(附demo下载)
Dec 04 Javascript
jQuery原理系列-常用Dom操作详解
Jun 07 Javascript
JavaScript中匿名函数的递归调用
Jan 22 Javascript
微信小程序实现图片自适应(支持多图)
Jan 25 Javascript
鼠标拖动改变DIV等网页元素的大小的实现方法
Jul 06 Javascript
vue.js的手脚架vue-cli项目搭建的步骤
Aug 30 Javascript
使用vue-route 的 beforeEach 实现导航守卫(路由跳转前验证登录)功能
Mar 22 Javascript
Vue中的异步组件函数实现代码
Jul 20 Javascript
Node 搭建一个静态资源服务器的实现
May 20 Javascript
微信小程序和H5页面间相互跳转代码实例
Sep 19 Javascript
jquery实现有过渡效果的tab切换
Jul 17 jQuery
微信小程序换肤功能实现代码(思路详解)
Aug 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
PHP 服务器配置(使用Apache及IIS两种方法)
2009/06/01 PHP
一篇有意思的技术文章php介绍篇
2010/10/26 PHP
分享一个超好用的php header下载函数
2014/01/31 PHP
thinkphp使用phpmailer发送邮件的方法
2014/11/24 PHP
php实现字符串翻转的方法
2015/03/27 PHP
100个不能错过的实用JS自定义函数
2014/03/05 Javascript
jquery ajax请求方式与提示用户正在处理请稍等
2014/09/01 Javascript
jQuery实现统计输入文字个数的方法
2015/03/11 Javascript
javascript实现的固定位置悬浮窗口实例
2015/04/30 Javascript
JavaScript如何动态创建table表格
2020/08/02 Javascript
javascript判断元素存在和判断元素存在于实时的dom中的方法
2017/01/17 Javascript
Vue和Bootstrap的整合思路详解
2017/06/30 Javascript
详解Webstorm 新建.vue文件支持高亮vue语法和es6语法
2017/10/26 Javascript
webpack 样式加载的实现原理
2018/06/12 Javascript
微信小程序MUI导航栏透明渐变功能示例(通过改变opacity实现)
2019/01/24 Javascript
bootstrap中的导航条实例代码详解
2019/05/20 Javascript
解决vue 子组件修改父组件传来的props值报错问题
2019/11/09 Javascript
原生js实现ajax请求和JSONP跨域请求操作示例
2020/03/14 Javascript
vue使用keep-alive实现组件切换时保存原组件数据方法
2020/10/30 Javascript
vscode自定义vue模板的实现
2021/01/27 Vue.js
[01:03:51]2018DOTA2亚洲邀请赛 4.7 淘汰赛 VP vs LGD 第三场
2018/04/09 DOTA
使用相同的Apache实例来运行Django和Media文件
2015/07/22 Python
django基于cors解决跨域请求问题详解
2019/08/06 Python
python时间日期操作方法实例小结
2020/02/06 Python
Python 中如何使用 virtualenv 管理虚拟环境
2021/01/21 Python
Perfume’s Club中文官网:西班牙美妆在线零售品牌
2020/08/24 全球购物
教师演讲稿范文
2014/01/08 职场文书
租房协议书范本
2014/04/09 职场文书
小学生演讲稿大全
2014/04/25 职场文书
2014法院四风问题对照检查材料思想汇报
2014/10/04 职场文书
2014年小学图书室工作总结
2014/12/09 职场文书
大学生个人简历自我评价
2015/03/11 职场文书
篮球比赛通讯稿
2015/07/18 职场文书
安全生产隐患排查制度
2015/08/05 职场文书
python3.9之你应该知道的新特性详解
2021/04/29 Python
Windows 64位 安装 mysql 8.0.28 图文教程
2022/04/19 MySQL