【JAVASCRIPT】React学习- 数据流(组件通信)
摘要
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学习- 数据流(组件通信)的更多相关文章
- React学习笔记 - 组件&Props
React Learn Note 4 React学习笔记(四) 标签(空格分隔): React JavaScript 三.组件&Props 组件可以将UI切分成一些独立的.可复用的部件,这样你 ...
- react学习(二)之通信篇
react性能提升原理:虚拟DOM react把真是的DOM tree,转化成virtual DOM,每次数据更新后,重新计算virtual DOM并与上一次的作对比,然后对发生改变的部分进行批量更新 ...
- 浅谈vue学习之组件通信
vue用组件化简化了我们编写代码的复杂度,组件之间经常会出现数据传递的情况,那么组件之间是怎样通信的呢? 使用props传递数据 组件实例的作用域是孤立的.这意味着不能 (也不应该) 在子组件的模板内 ...
- 关于React的父子组件通信等等
//==================================================此处为父子组件通信 1.子组件调用父组件: 父组件将子组件需要调用方法存入props属性内,子组 ...
- 【Flutter学习】组件通信(父子、兄弟)
一,概述 flutter一个重要的特性就是组件化.组件分为两种状态,一种是StatefulWidget有状态组件,一种是StatelessWidget无状态组件. 无状态组件不能更新状态,有状态组件具 ...
- React学习——ListView组件
(草稿) 先把代码放上来,再补充说明 <!DOCTYPE html> <html> <head> <title>React ListView</t ...
- React 学习二 组件
React的一个最大的特点就是组件化的开发模式.今天就来试一下: <!DOCTYPE html> <html> <head> <meta charset=&q ...
- react.js父子组件通信
这里通过todolist的功能来说明 父组件: import React,{ Component,Fragment } from 'react'; import TodoItem from './To ...
- React学习——子组件给父组件传值
//子组件 var Child = React.createClass({ render: function(){ return ( <div> 请输入邮箱:<input onCha ...
随机推荐
- Unity3d—做一个年月日选择器(Scroll Rect拖动效果优化)— 无限滚动 + 锁定元素
最近..... 废话不多说上效果图 用的是UGUI 我先说思路 通过判断元素的位置信息来改变Hierarchy的顺序 实现无限滚动 改变位置的同时也要不断的调整Content的位置防止乱跳 元素锁定就 ...
- 依赖注入之Autofac使用总结
依赖倒置?控制反转(IOC)? 依赖注入(DI)? 你是否还在被这些名词所困扰,是否看了大量理论文章后还是一知半解了? 今天我想结合实际项目,和正在迷惑中的新手朋友一起来学习和总结依赖注入Autofa ...
- [编织消息框架][netty源码分析]6 ChannelPipeline 实现类DefaultChannelPipeline职责与实现
ChannelPipeline 负责channel数据进出处理,如数据编解码等.采用拦截思想设计,经过A handler处理后接着交给next handler ChannelPipeline 并不是直 ...
- drozer使用
1.启用adb 端口转发 adb forward tcp:314154 tcp:31415 2.启用drozer 3.链接drozer drozer console connect 4:如果没 ...
- 并发编程(一):从头到脚解读synchronized
一.目录 1.多线程启动方式 2.synchronized的基本用法 3.深度解析synchronized 4.同步方法与非同步方法是否能同时调用? 5.同步锁是否可重入(可重入锁)? 6.异常是否会 ...
- 【解决】安装compass失败(gem install compass)
原始日期:2016-01-25 16:26 这个问题比较常见. 很多人在安装ruby后再使用gem install compass命令安装compass,发现安装失败. [解决方法:] / ...
- docker 初识之二(简单发布ASP.NET Core 网站)
在发布ASP.NET Core网站以前,先介绍一下DaoCloud 一个免费的docker云容器服务平台.登陆官方网站,创建一台docker主机,这台主机有120分钟的使用时间,对于鄙人学习使用正好合 ...
- for循环语句
for循环格式: for(表达式1:表达式2:表达式3) { 循环语句 } 1.首先计算表达式1的值. 2.再计算表达式2 的值,若值为真(非0) ...
- Java基础(7)-异常处理
异常处理 异常继承层次 Throwable |-Error 致命的错误无法处理 |-Exception |-IOException 系统资源读取失败等错误 |-RuntimeException(未检异 ...
- 关于mysql查询数据库时间和系统时间差
1. MySQL数据库表中有两个时间的字段,需要计算他们的时间差: (1)datediff函数来表示时间差. 基本语法: DATEDIFF(datepart,startdate,enddate) 说明 ...