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...]}

最新文章

  1. 【十大经典数据挖掘算法】kNN
  2. 单例模式(Java)
  3. CodeForces Round #250 Div2
  4. 安装、设置与启动MySql5.1.30绿色版的方法
  5. DOS的BAT技巧两则
  6. LINUX编程学习笔记(十四) 创建进程与 父子进程内存空间
  7. 更改EBS R12中forms的模式Servlet/Socket
  8. Day 1 上午
  9. leveldb实现原理
  10. Python(day1)
  11. jsp页面在Android系统和ISO系统的兼容性问题
  12. python 将列表(也可以是file.readlines())输出多个文件
  13. Peter's smokes -poj 2509
  14. MT【66]寻找对称中心
  15. 在web中实现当前变量和前一个的比较
  16. 【转载】jdk1.8 LongAdder源码学习
  17. Jexus 网站服务器和 ASP.NET 跨平台开发
  18. INSERT CLAUSE
  19. 通达信k线颜色设置
  20. 安装VS组件提示“所选驱动不再有效。继续安装之前,请先检查安装路径的设置。”要怎么办?

热门文章

  1. 009 Java集合浅析4
  2. LKNotification控件-通知控件
  3. 【学习笔记】TCP通信的细节及TCP连接对HTTP事务处理性能影响
  4. JavaScript 方法调用模式和函数调用模式
  5. 浅谈隐语义模型和非负矩阵分解NMF
  6. 兔子生娃问题---函数递归应用--c语言实现
  7. [UWP]涨姿势UWP源码——适配电脑和手机
  8. 简单的叙述下SQL中行列转换的小知识!
  9. es 6点滴记录
  10. POPTEST 测试开发 免费培训课程报名