## 三、组件之间的通信
> 组件之间的通信可以分为三种:父传子,子传父,同级组件互传
### 3.1 父传子
- 父组件通过 元素属性的方式 ( key=value )向子组件传递信息
- 子组件通过this.props.key 获取传入的props
```
class Child extends Component{
render() {
return (<h1>子组件获取到的props: {this.props.name}</h1>)
}
}
class Parent extends Component{
render() {
return (
<div>
<Child name="Jack"/>
</div>
)
}
}
```
### 3.2 子传父 事件+state
1. 父组件传入子组件的prop值为父组件的状态
2. 父组件定义 事件处理函数 来响应状态变化
3. 子组件触发事件
```
class Child extends Component{
render() {
// 点击时调用changeName事件,来向父组件传达改变状态的信息
return (<div>
<h1>子组件获取到的props: {this.props.name}</h1>
<button onClick={() => { this.props.changeName() } }>change Name</button>
</div>)
}
}
class Parent extends Component{
constructor() {
super()
// 设置初始状态
this.state = {
name:'Jack'
}
}
// 传入改变自身状态的事件
changeName() {
this.setState({
name:'Rose'
})
}
render() {
return (
<div>
<Child name={this.state.name} changeName={this.changeName.bind(this)}/>
</div>
)
}
}
```
### 3.3 同级组件之间的通信
- 以同级组件的共同父组件为中介完成通信
- 同级组件的数据统一由父组件管理,当子组件要改变时则调用父组件的事件达到改变
- 父组件 state的改变会影响其所有子组件中 属性与其state相关的值的改变
```
class Child extends Component{
render() {
return (<div>
<h1>子组件获取到的props: {this.props.num}</h1>
<button onClick={() => { this.props.add() } }>加1</button>
</div>)
}
}
class ChildOther extends Component{
render() {
return (<div>
<h1>子组件获取到的props: {this.props.num}</h1>
<button onClick={() => { this.props.minum() } }>减1</button>
</div>)
}
}
class Parent extends Component{
constructor() {
super()
this.state = {
name: 'Jack',
num:1
}
}
add() {
this.setState({
num:this.state.num+1
})
}
minum() {
this.setState({
num:this.state.num-1
})
}
render() {
return (
<div>
<Child num={this.state.num} add={this.add.bind(this)}/>
<ChildOther num={this.state.num} minum={this.minum.bind(this)}/>
</div>
)
}
}
```
### 3.4 全局事件
> 当项目比较大,组件的嵌套层次比较深时,再使用兄弟组件间的通信就会对性能造成一定程度的影响,这时就可以使用 **全局事件** 来解决这类问题
> 官网中提到可以使用全局事件来进行组件间的通信,官网推荐 **Flux**(Facebook官方出的),还有**Relay、Redux、trandux**等第三方类库。这些框架思想都一致,都是统一管理组件state变化情况,达到数据可控目的。本人使用了Redux,建议要会其中一种。对于EventEmitter或PostalJS这类的第三方库是不建议使用的,这类全局事件框架并没有统一管理组件数据变化,用多了会导致数据流不可控。
> 简单的组件交流我们可以使用上面非全局事件的简单方式,但是当项目复杂,组件间层次越来越深,上面的交流方式就不太合适(当然还是要用到的,简单的交流)。强烈建议使用Flux、Relay、Redux、trandux等类库其中一种,这些类库不只适合React,像Angular等都可以使用。
- 一、安装与使用
- 二、JSX介绍
- 三、React渲染
- 四、组件Components
- 4.1 定义组件
- 4.2 复合组件
- 4.3 React创建组件的三种方式及其区别
- 五、Props(属性)和State(状态)
- 5.1 Props属性
- 5.2 State状态
- 5.3 组件间的通信
- 5.4 单向数据流&事件
- 5.5 Refs属性
- 六、React生命周期
- 七、React组件应用场景
- 7.1 条件渲染
- 7.2 列表渲染和Key
- 7.3 表单组件
- 八、React-router初识
- 8.1 React-router主要组件
- 九、项目中的问题记录
- 9.1 antd+react项目初体验
- 9.2 fetch请求
- 9.3 简单项目的规范
- 十、redux简介&使用
- 10.1 基本概念和API
- 10.0 踩坑记录
- 10.2 react-redux