摘要

react 学习包括几个部分:

  • 文本渲染
  • JSX 语法
  • 组件化思想
  • 数据流

一 组件通信如何实现

父子组件之间不存在继承关系

1.1 父=》子通信

父组件可以通过 this.refs.xx 调用子组件的方法,比如 setState 等

1.2 子=》父通信

有两种方法,两个粒度:

1)利用call/apply 把父组件替换子组件方法的this对象,实现子组件调用父组件属性和方法

2)通过props 形式,把父组件方法传递给 子组件,子组件调用props 的方法,实际是 父组件在执行

1.3 子=》子通信

通过共用父组件变量的方法实现通信。

1.4 无关联组件通信

二 例子

2.1 父子通信

子组件

class childComponent extends React.Component {
onClick () {
console.log('子组件');
} render() { return (
<div>
lalala
</div>
);
}
} export default childComponent;

父组件

import ChildComponent from '../childComponent'

class FatherComponent extends React.Component {
onClick() {
console.log('父组件');
}
componentDidMount () {
this.refs.test.onClick(); // !!! 通过 refs 调用子组件的方法,比如 setState 控制子组件的更新
} render() {
return (
<div>
<ChildComponent ref="test"/>
</div>
);
}
} export default FatherComponent;

结果

打印

子组件

2.2 子父通信

子组件

class childComponent extends React.Component {
onClick () {
console.log('子组件');
this.onClick(); // 调用父组件方法
} render() {
return (
<div>
lalala
</div>
);
}
} export default childComponent;

父组件

import ChildComponent from '../childComponent'

class FatherComponent extends React.Component {
onClick() {
console.log('父组件');
}
componentDidMount () {
this.refs.test.onClick.call(this); // 传入父组件的对象
} render() {
return (
<div>
<ChildComponent ref="test"/>
</div>
);
}
} export default FatherComponent;

结果

打印

子组件

父组件

2.3 子子通信

原理就是通过共用父组件变量实现联动。

步骤如下:

1)父组件调用子组件1 方法,把 变量 a 传给 子组件1

2)子组件1 拿到变量 a 更新,调用父组件方法1

3)父组件方法1 调用子组件2 方法,把 变量 a 传给子组件2

4)子组件2 拿到变量a 更新。

子组件

class childComponent extends React.Component {
onClick () {
console.log('子组件', this.props.name);
// 2. 组件hxy 更新父组件
this.onClick();
} onClick1() {
// 4. 组件 xiaohuamao 更新
console.log('子组件', this.props.name)
} render() {
return (
<div>
{this.props.name}
</div>
);
}
} export default childComponent;

父组件

import ChildComponent from '../childComponent'

class FatherComponent extends React.Component {
onClick() {
console.log('父组件');
console.log('调用子组件test1 onClick');
// 3. 组件 xiaohuamao 更新
this.refs.test1.onClick1.call(this);
}
componentDidMount () {
console.log('调用子组件test onClick');
// 1. 父组件 调用 组件 hxy
this.refs.test.onClick.call(this);
} render() {
// 有两个子组件 hxy 和 xiaohuamao
return (
<div>
<ChildComponent ref="test" name={'hxy'}/>
<ChildComponent ref="test1" name={'xiaohuamao'}/>
</div>
);
}
} export default FatherComponent;

结果

打印

调用子组件test onClick // 调用子组件 hxy 方法

子组件 undefined // 此处 this 替换为 父组件对象

父组件 // 回到父组件

调用子组件test1 onClick // 调用子组件xiaohuamao 方法

子组件 xiaohuamao // 可更新子组件xiaohuamao 的state实现更新组件

【JAVASCRIPT】React学习- 数据流(组件通信)的更多相关文章

  1. React学习笔记 - 组件&Props

    React Learn Note 4 React学习笔记(四) 标签(空格分隔): React JavaScript 三.组件&Props 组件可以将UI切分成一些独立的.可复用的部件,这样你 ...

  2. react学习(二)之通信篇

    react性能提升原理:虚拟DOM react把真是的DOM tree,转化成virtual DOM,每次数据更新后,重新计算virtual DOM并与上一次的作对比,然后对发生改变的部分进行批量更新 ...

  3. 浅谈vue学习之组件通信

    vue用组件化简化了我们编写代码的复杂度,组件之间经常会出现数据传递的情况,那么组件之间是怎样通信的呢? 使用props传递数据 组件实例的作用域是孤立的.这意味着不能 (也不应该) 在子组件的模板内 ...

  4. 关于React的父子组件通信等等

    //==================================================此处为父子组件通信 1.子组件调用父组件: 父组件将子组件需要调用方法存入props属性内,子组 ...

  5. 【Flutter学习】组件通信(父子、兄弟)

    一,概述 flutter一个重要的特性就是组件化.组件分为两种状态,一种是StatefulWidget有状态组件,一种是StatelessWidget无状态组件. 无状态组件不能更新状态,有状态组件具 ...

  6. React学习——ListView组件

    (草稿) 先把代码放上来,再补充说明 <!DOCTYPE html> <html> <head> <title>React ListView</t ...

  7. React 学习二 组件

    React的一个最大的特点就是组件化的开发模式.今天就来试一下: <!DOCTYPE html> <html> <head> <meta charset=&q ...

  8. react.js父子组件通信

    这里通过todolist的功能来说明 父组件: import React,{ Component,Fragment } from 'react'; import TodoItem from './To ...

  9. React学习——子组件给父组件传值

    //子组件 var Child = React.createClass({ render: function(){ return ( <div> 请输入邮箱:<input onCha ...

随机推荐

  1. Unity3D 骨骼动画原理学习笔记

    最近研究了一下游戏中模型的骨骼动画的原理,做一个学习笔记,便于大家共同学习探讨. ps:最近改bug改的要死要活,博客写的吭哧吭哧的~ 首先列出学习参考的前人的文章,本文较多的参考了其中的表述: 1. ...

  2. SQL Server 实现Split函数

    添加一个表值函数. CREATE function [dbo].[fnSplit] ( ), --要分割的字符串 ) --字符串之间的分隔符 ) ,), TempName )) as begin de ...

  3. Linux编程之有限状态机FSM的理解与实现

    有限状态机(finite state machine)简称FSM,表示有限个状态及在这些状态之间的转移和动作等行为的数学模型,在计算机领域有着广泛的应用.FSM是一种逻辑单元内部的一种高效编程方法,在 ...

  4. WCF学习——构建第二个WCF应用程序(四)

    一.WCF服务端应用程序 1.创建WCF服务端应用程序项目 打开Visual Studio 2013,在菜单上点击文件->新建->项目->WCF服务应用程序.在弹出界面的" ...

  5. ubuntu 16.04.2 源码安装gitlab并且利用runner持续集成

    参考原档:https://gitlab.com/gitlab-org/gitlab-ce/blob/master/doc/install/installation.md#using-https 本章只 ...

  6. VMware中Linux系统时间与主机同步以及时区设置

    网络上有各种资料,但最简单的一种方法就是修改虚拟机的配置文件 *.vmx .修改 tools.syncTime = "FALSE" 为 tools.syncTime = " ...

  7. linux环境下创建和删除软链接

    ln -s /home/zhenwx/htccode-v1/ /home/zhenwx/htccode 建立/home/zhenwx/htccode-v1 的软连接 linux下的软链接类似于wind ...

  8. java登录时数据库验证账户密码-mysql

    一:连接数据库: package login; import java.sql.*; public class conmysql { String drivername="com.mysql ...

  9. 使用阿里百川HotFix

    前言:首先要弄懂HotFix是干嘛的,不然就别向下看了.这里仅仅根据官方文档的代码书写,亲测可用,不做理论指导. Android Studio集成: 添加maven仓库地址: repositories ...

  10. Java jvm级别native关键词、JNI详解

    1.native关键词的引入 再完美的编程语言也有自己的不足之处,当然Java也不例外,Java的不足之处除了体现在运行速度(这点往往被一些其他编程语言使用者所诟病)上要比传统的C++慢许多之外,Ja ...