React学习(一)父子组件通讯
React父子组件之间通讯,利用props和state完成,首先React是单向数据流,父组件可以向子组件传递props;
实现父子组件双向数据流整体的思路是:
1,父组件可以向子组件传递props,props中带有初始化子组件的数据,还有回调函数
2,子组件的state发生变化时,在子组件的事件处理函数中,手动触发父函数传递进来的回调函数,同时时将子组件的数据传递回去
图形表示的话:大概长这样

newState通过父组件的回调函数传递回去
下面是我自己写的一个便签实例:
//Note组件代码:
import React,{Component} from 'react';
import { render } from 'react-dom';
class EditPanel extends Component{ //子组件
constructor(props){
super(props);
this.state=this.props.item;//通过props初始化编辑便签子组件的state
this.handleEditFinish=this.handleEditFinish.bind(this);
}
handleEditFinish(e){
var date=new Date();
var newState={
content:e.target.previousSibling.value,
date:date.toLocaleDateString()
}
this.props.onChange(newState);//回调函数传递参数给父组件
}
render(){
return(
<div className="edit-panel" style={{display:this.props.item.edit?"block":"none"}}>//子组件的显示由父组件控制
<textarea cols="30" rows="10" defaultValue={this.state.content} />
<a href="#" onClick={this.handleEditFinish}>完成</a>
</div>
)
}
} class Note extends Component{ //父组件
constructor(props){
super(props);
this.state={
content:this.props.content,
date:this.props.date,
edit:false
}
this.handleEdit=this.handleEdit.bind(this);
this.handleDelete=this.handleDelete.bind(this);
this.handleChildChange=this.handleChildChange.bind(this); //监听子组件变化
}
handleChildChange(newState){ //处理子函数传回来的state,改变自身的state
if(newState){
this.setState(newState);
this.setState({
edit:false
})
}
}
handleEdit(e){
e.preventDefault();
this.setState({
edit:true,
})
}
handleDelete(e){
e.preventDefault();
e.target.parentNode.parentNode.removeChild(e.target.parentNode);
}
render() {
return (<div className="note-item">
<p>{this.state.content}</p>
<p>{this.state.date}</p>
<a href="#" onClick={this.handleEdit}>编辑</a>
<a href="#" onClick={this.handleDelete}>删除</a>
<EditPanel item={this.state} onChange={this.handleChildChange}/>
</div>
)
}
}
export default Note;
具体工程代码可以看github,需要注意的是this是一定要绑定的!绑定方式有两种,一种是我上面的在构造函数里面绑定一种使用箭头函数:
handleEdit=()=>{[native code...]}
React学习(一)父子组件通讯的更多相关文章
- React 学习(六) ---- 父子组件之间的通信
当有多个组件需要共享状态的时候,这就需要把状态放到这些组件共有的父组件中,相应地,这些组件就变成了子组件,从而涉及到父子组件之间的通信.父组件通过props 给子组件传递数据,子组件则是通过调用父组件 ...
- 【Vue】Vue中的父子组件通讯以及使用sync同步父子组件数据
前言: 之前写过一篇文章<在不同场景下Vue组件间的数据交流>,但现在来看,其中关于“父子组件通信”的介绍仍有诸多缺漏或者不当之处, 正好这几天学习了关于用sync修饰符做父子组件数据双向 ...
- Angular6 基础(数据绑定、生命周期、父子组件通讯、响应式编程)
Angular相比于vue来说,更像一个完整的框架,本身就集成了很多模块,如路由,HTTP,服务等,而vue是需要另外引入比如(vuex,axios等).Angular引入了依赖注入.单元测试.类等后 ...
- 【JAVASCRIPT】React学习- 数据流(组件通信)
摘要 react 学习包括几个部分: 文本渲染 JSX 语法 组件化思想 数据流 一 组件通信如何实现 父子组件之间不存在继承关系 1.1 父=>子通信 父组件可以通过 this.refs.xx ...
- React -- 3/100 】组件通讯
通讯 | props | prop-types 组件通讯 Props: 组件无论是使用函数声明还是通过 class 声明,都决不能修改自身的 props /* class */ .parent-box ...
- 深入理解Vue父子组件通讯的属性和事件
在html中使用元素,会有一些属性,如class,id,还可以绑定事件,自定义组件也是可以的.当在一个组件中,使用了其他自定义组件时,就会利用子组件的属性和事件来和父组件进行数据交流. 父子组件之间的 ...
- vue学习--父子组件通讯
this.$parent // 子组件访问父组件 this.$root // 访问根实例 this.$children // 父组件的所有子元素 *一 ...
- Angular组件——父子组件通讯
Angular组件间通讯 组件树,1号是根组件AppComponent. 组件之间松耦合,组件之间知道的越少越好. 组件4里面点击按钮,触发组件5的初始化逻辑. 传统做法:在按钮4的点击事件里调用组件 ...
- Vue中父子组件通讯——组件todolist
一.todolist功能开发 <div id="root"> <div> <input type="text" v-model=& ...
随机推荐
- Power BI Embedded 与 Bot Framework 结合的AI解决方案
最近最热门的话题莫过于AI了,之前我做过一片讲 BOTFRAMEWORK和微信 相结合的帖子 如何将 Microsoft Bot Framework 链接至微信公共号 我想今天基于这个题目扩展一下,P ...
- Vue.js 插件开发详解
前言 随着 Vue.js 越来越火,Vue.js 的相关插件也在不断的被贡献出来,数不胜数.比如官方推荐的 vue-router.vuex 等,都是非常优秀的插件.但是我们更多的人还只停留在使用的阶段 ...
- JS+CSS实现的下拉刷新/上拉加载插件
闲来无事,写了一个当下比较常见的下拉刷新/上拉加载的jquery插件,代码记录在这里,有兴趣将代码写成插件与npm包可以留言. 体验地址:http://owenliang.github.io/pull ...
- div内部元素居中
要让div内部元素垂直居中,则给div加上此css样式: .div-vertical-middle{ height:200px; width:304px; line-height:50px; ...
- Android™ 1.5 android.R.drawable Icon Resources
图标一览表: http://www.darshancomputing.com/android/1.5-drawables.html 官 方 API: http://developer.androi ...
- wampserver安装错误 应用程序无法正常启动0xc000007b解决方法
在重装系统之后发现以前安装的wampserver启动会出现错误提示"应用程序无法正常启动0xc000007b解决方法",重新安装也是一样的错误.上网找了相关信息后发现,并不是只有本 ...
- Python爬虫 正则表达式
1.正则表达式概述 正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符.及这些特定字符的组合,组成一个"规则字符串",这个"规则字符串"用来 ...
- 浅谈css中单位px和em,rem的区别-转载
px是你屏幕设备物理上能显示出的最小的一个点,这个点不是固定宽度的,不同设备上点的长宽.比例有可能会不同.假设:你现在用的显示器上1px宽=1毫米,但我用的显示器1px宽=两毫米,那么你定义一个div ...
- You-Get , A Tiny Downloader,视频下载小工具
---恢复内容开始--- You-Get You-Get is a tiny command-line utility to download media contents (videos, a ...
- 在mysql 5.6的环境下修改生产环境的表结构(在线ddl) ----工具pt-osc
随着需求的变化越来越快,在线修改表结构变得越来越需要. 在mysql5.6以前,mysql的修改表结构操作会锁表,这样就会造成开发人员或者DBA修改表结构必须要等到凌晨流量谷值或者停服修改.这样必定会 ...