摘要

react 学习包括几个部分:

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

一 组件通信如何实现

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

1.1 父=》子通信

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

1.2 子=》父通信

有两种方法,两个粒度:

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

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

1.3 子=》子通信

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

1.4 无关联组件通信

二 例子

2.1 父子通信

子组件

  1. class childComponent extends React.Component {
  2. onClick () {
  3. console.log('子组件');
  4. }
  5. render() {
  6. return (
  7. <div>
  8. lalala
  9. </div>
  10. );
  11. }
  12. }
  13. export default childComponent;

父组件

  1. import ChildComponent from '../childComponent'
  2. class FatherComponent extends React.Component {
  3. onClick() {
  4. console.log('父组件');
  5. }
  6. componentDidMount () {
  7. this.refs.test.onClick(); // !!! 通过 refs 调用子组件的方法,比如 setState 控制子组件的更新
  8. }
  9. render() {
  10. return (
  11. <div>
  12. <ChildComponent ref="test"/>
  13. </div>
  14. );
  15. }
  16. }
  17. export default FatherComponent;

结果

打印

子组件

2.2 子父通信

子组件

  1. class childComponent extends React.Component {
  2. onClick () {
  3. console.log('子组件');
  4. this.onClick(); // 调用父组件方法
  5. }
  6. render() {
  7. return (
  8. <div>
  9. lalala
  10. </div>
  11. );
  12. }
  13. }
  14. export default childComponent;

父组件

  1. import ChildComponent from '../childComponent'
  2. class FatherComponent extends React.Component {
  3. onClick() {
  4. console.log('父组件');
  5. }
  6. componentDidMount () {
  7. this.refs.test.onClick.call(this); // 传入父组件的对象
  8. }
  9. render() {
  10. return (
  11. <div>
  12. <ChildComponent ref="test"/>
  13. </div>
  14. );
  15. }
  16. }
  17. export default FatherComponent;

结果

打印

子组件

父组件

2.3 子子通信

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

步骤如下:

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

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

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

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

子组件

  1. class childComponent extends React.Component {
  2. onClick () {
  3. console.log('子组件', this.props.name);
  4. // 2. 组件hxy 更新父组件
  5. this.onClick();
  6. }
  7. onClick1() {
  8. // 4. 组件 xiaohuamao 更新
  9. console.log('子组件', this.props.name)
  10. }
  11. render() {
  12. return (
  13. <div>
  14. {this.props.name}
  15. </div>
  16. );
  17. }
  18. }
  19. export default childComponent;

父组件

  1. import ChildComponent from '../childComponent'
  2. class FatherComponent extends React.Component {
  3. onClick() {
  4. console.log('父组件');
  5. console.log('调用子组件test1 onClick');
  6. // 3. 组件 xiaohuamao 更新
  7. this.refs.test1.onClick1.call(this);
  8. }
  9. componentDidMount () {
  10. console.log('调用子组件test onClick');
  11. // 1. 父组件 调用 组件 hxy
  12. this.refs.test.onClick.call(this);
  13. }
  14. render() {
  15. // 有两个子组件 hxy 和 xiaohuamao
  16. return (
  17. <div>
  18. <ChildComponent ref="test" name={'hxy'}/>
  19. <ChildComponent ref="test1" name={'xiaohuamao'}/>
  20. </div>
  21. );
  22. }
  23. }
  24. 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. Java模拟http请求调用远程接口工具类

    package ln; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamRea ...

  2. Eclipse导出JavaDoc中文乱码问题解决

    在Eclipse里 export 选 JavaDoc,在向导的最后一页的Extra JavaDoc Options 里填上参数即可 比如项目采用的是UTF-8的编码就填:-encoding UTF-8 ...

  3. js替换字符串中所有指定的字符

    第一次发现JavaScript中replace() 方法如果直接用str.replace("-","!") 只会替换第一个匹配的字符.  而str.replac ...

  4. Linux命令 比较文件

    cmp [功能说明] 比较文件 #cmp可以比较任何类型的文件,并在标准输出设备上显示文件的第一次不同处的行号和字节号,分别从1开始,但是一般用于比较文本文件 [语法格式] Cmp[参数][文件1][ ...

  5. elasticSearch(5.3.0)的评分机制的研究

    1.  ElasticSearch的评分 在用ElasticSearch作为搜索引擎的时候,如果采用关键字进行查询,ElasticSearch会对每个符合查询条件的文档进行评分,在5.3.0的版本中, ...

  6. Windows Server AppFabric分布式缓存研究

    分享一则先前对Windows Server AppFabric分布式缓存的技术研究. 一. AppFabric 技术架构和原理 AppFabric与Memcached类似,采用C/S的模式,在 ser ...

  7. MiniProfiler使用点滴记录-2017年6月23日11:08:23

    1.看似针对同样一段查询表ef达式,重复执行却没有被记录下来.其实这是正常情况,因为ef并没有重复去执行 相同sql查询. 2.MiniProfiler结合MVC过滤器进行 拦截记录Sql,示例代码: ...

  8. smarty模板基础知识

    1.定义 Smarty是一个使用php写出来的模板引擎,它分离了逻辑代码和外在的内容,提供了一种易于管理和使用的方法,用来将原本与html代码混杂在一起PHP代码逻辑分离. 简单的讲,目的就是要使PH ...

  9. php测试题

    1. LAMP具体结构不包含下面哪种(A) A:Windows系统 B:Apache服务器 C:MySQL数据库 D:PHP语言 2. 以下哪个SQL语句是正确的(D) A:insert into u ...

  10. php imagemagick 处理 图片剪切、压缩、合并、插入文本、背景色透明

    php有一款插件叫做imagemagick,功能很强大,提供了图片的很多操作,图片剪切.压缩.合并.插入文本.背景色透明等.并且有api方法调用和命令行操作两种方式,如果只是简单处理的话建议api方法 ...