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中遭遇级联表达式陷阱
Mar 08 Javascript
javascript父、子页面交互技巧总结
Aug 08 Javascript
用javascript实现自动输出网页文本
Jul 30 Javascript
jQuery 移动端artEditor富文本编辑器
Jan 11 Javascript
学习JavaScript设计模式之中介者模式
Jan 14 Javascript
Bootstrap每天必学之响应式导航、轮播图
Apr 25 Javascript
微信小程序 向左滑动删除功能的实现
Mar 10 Javascript
基于substring()和substr()的使用以及区别(实例讲解)
Dec 28 Javascript
解决Vue不能检测数组或对象变动的问题
Feb 24 Javascript
Vue单页应用引用单独的样式文件的两种方式
Mar 30 Javascript
微信小程序在ios下Echarts图表不能滑动的问题解决
Jul 10 Javascript
webpack的pitching loader详解
Sep 23 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获取网页内容方法总结
2008/12/04 PHP
PHP中imagick函数的中文解释
2015/01/21 PHP
php+ajax无刷新分页实例详解
2015/12/07 PHP
php常用字符串查找函数strstr()与strpos()实例分析
2019/06/21 PHP
PHP基于进程控制函数实现多线程
2020/12/09 PHP
BOM与DOM的区别分析
2010/10/26 Javascript
ASP.NET MVC中EasyUI的datagrid跨域调用实现代码
2012/03/14 Javascript
JavaScript中使用Math.PI圆周率属性的方法
2015/06/14 Javascript
jquery ajax分页插件的简单实现
2016/01/27 Javascript
js基于cookie方式记住返回页面用法示例
2016/05/27 Javascript
解决微信内置浏览器返回上一页强制刷新问题方法
2017/02/05 Javascript
JS实现课堂随机点名和顺序点名
2017/03/09 Javascript
令按钮悬浮在(手机)页面底部的实现方法
2017/05/02 Javascript
详解Vue双向数据绑定原理解析
2017/09/11 Javascript
实例分析js事件循环机制
2017/12/13 Javascript
js隐式转换的知识实例讲解
2018/09/28 Javascript
Vue实现多页签组件
2021/01/14 Vue.js
[05:31]DOTA2上海特级锦标赛主赛事第三日RECAP
2016/03/05 DOTA
python使用opencv进行人脸识别
2017/04/07 Python
用python结合jieba和wordcloud实现词云效果
2017/09/05 Python
python 动态加载的实现方法
2017/12/22 Python
解决Python找不到ssl模块问题 No module named _ssl的方法
2019/04/29 Python
python实战串口助手_解决8串口多个发送的问题
2019/06/12 Python
python监控nginx端口和进程状态
2019/09/06 Python
Django Docker容器化部署之Django-Docker本地部署
2019/10/09 Python
python matplotlib折线图样式实现过程
2019/11/04 Python
Python3 元组tuple入门基础
2020/02/09 Python
Python+unittest+requests 接口自动化测试框架搭建教程
2020/10/09 Python
python压包的概念及实例详解
2021/02/17 Python
Python Selenium操作Cookie的实例方法
2021/02/28 Python
Paradox London官方网站:英国新娘鞋婚礼鞋品牌
2019/08/29 全球购物
关键字final的用法
2013/10/02 面试题
地球上的星星观后感
2015/06/02 职场文书
《从现在开始》教学反思
2016/02/16 职场文书
详解Laravel制作API接口
2021/05/31 PHP
CSS 实现磨砂玻璃(毛玻璃)效果样式
2023/05/21 HTML / CSS