react学习笔记12:组件之间交互

我们创建一个新的项目, component-test 专门学习我们的组件交互。

利用create-react-app工具

create-react-app component-test
cd component-test
npm start

修正代码:

index.html:

<!doctype html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
    <meta name="theme-color" content="#000000">

    <title>组件交互</title>
  </head>
  <body>
    <div id="root"></div>
  </body>
</html>

index.js

把其他文件全部删除即可!

103959_87v2_2352644.png

import React, { Component } from 'react';
import ReactDOM from 'react-dom';

import registerServiceWorker from './registerServiceWorker';


class Test extends Component {
  render() {
    return (
		<div>
			组件交互
		</div>
    );
  }
}


ReactDOM.render(<Test />, document.getElementById('root'));
registerServiceWorker();

组件之间的关系可简单分为:

父子组件

爷孙组件

兄弟组件

当前和兄弟的子组件

当前和兄弟的孙组件

 

1.父子组件交互

1.1父组件传值给子组件

我们使用的就是this.props.xx接收和显示:

import React, { Component } from 'react';
import ReactDOM from 'react-dom';

import registerServiceWorker from './registerServiceWorker';


class Test extends Component {
	
	constructor(props) {
        super(props);
        // 设置 initial state
        this.state = {
            msg1: "1儿子你好",
			msg2: "2儿子你好"
        };

    }
		
	render() {
		return (
			<div>
				组件交互
				<p>给1儿子说的话:{this.state.msg1}</p>
				<p>给2儿子说的话:{this.state.msg2} </p>
				<div>
					我是1儿子组件:<Sub1 msg={this.state.msg1} />
				</div>
				<div>
					我是2儿子组件<Sub2 msg={this.state.msg2} />
				</div>
			</div>
		);
	}
}

class Sub1 extends Component {
  render() {
    return (
		<div>
			我是儿子1
			<div>收到爸爸的问候:{this.props.msg}</div>
		</div>
    );
  }
}

class Sub2 extends Component {
  render() {
    return (
		<div>
			我是儿子2
			<div>收到爸爸的问候:{this.props.msg}</div>
		</div>
    );
  }
}

ReactDOM.render(<Test />, document.getElementById('root'));
registerServiceWorker();

我们看到效果:

104940_A0xN_2352644.png

调用位置利用某个属性设置要传递的值,在子组件的this.props就会获取到!

 

1.2子组件传话给父组件

我们的需求是这样的,我们点击1儿子的一个按钮,通知父组件我收到了你的问候,把父组件对1儿子的问候语改为:

“谢谢1儿子的回复”

既然父组件可以把状态值传给子组件,那么我们就把父组件的一个方法传给子组件,这个父组件的方法就是改变msg1的值:

105648_bXHU_2352644.png

105703_idMY_2352644.png

全部代码:

import React, { Component } from 'react';
import ReactDOM from 'react-dom';

import registerServiceWorker from './registerServiceWorker';


class Test extends Component {
	
	constructor(props) {
        super(props);
        // 设置 initial state
        this.state = {
            msg1: "1儿子你好",
			msg2: "2儿子你好"
        };

    }
	
	setMsg1() {
		this.setState({msg1:"谢谢1儿子的回复"})
	}
		
	render() {
		return (
			<div>
				组件交互
				<p>给1儿子说的话:{this.state.msg1}</p>
				<p>给2儿子说的话:{this.state.msg2} </p>
				<div>
					我是1儿子组件:<Sub1 msg={this.state.msg1} setMsg1={this.setMsg1.bind(this)} />
				</div>
				<div>
					我是2儿子组件<Sub2 msg={this.state.msg2} />
				</div>
			</div>
		);
	}
}

class Sub1 extends Component {
  render() {
    return (
		<div>
			我是儿子1
			<div onClick={this.props.setMsg1}>收到爸爸的问候:{this.props.msg}</div>
		</div>
    );
  }
}

class Sub2 extends Component {
  render() {
    return (
		<div>
			我是儿子2
			<div>收到爸爸的问候:{this.props.msg}</div>
		</div>
    );
  }
}

ReactDOM.render(<Test />, document.getElementById('root'));
registerServiceWorker();

我们点击之后:

105737_Bkfw_2352644.png

变为:

105757_4WtK_2352644.png

 

2.爷孙组件交互

2.1爷孙传值

我们给1儿子加2个儿子,出现2孙子:

儿子1给他的儿子传值:

110346_1i9i_2352644.png

2个孙子:

110406_S8Oz_2352644.png

全部代码:

import React, { Component } from 'react';
import ReactDOM from 'react-dom';

import registerServiceWorker from './registerServiceWorker';


class Test extends Component {
	
	constructor(props) {
        super(props);
        // 设置 initial state
        this.state = {
            msg1: "1儿子你好",
			msg2: "2儿子你好"
        };

    }
	
	setMsg1() {
		this.setState({msg1:"谢谢1儿子的回复"})
	}
		
	render() {
		return (
			<div>
				组件交互
				<p>给1儿子说的话:{this.state.msg1}</p>
				<p>给2儿子说的话:{this.state.msg2} </p>
				<div>
					我是1儿子组件:<Sub1 msg={this.state.msg1} setMsg1={this.setMsg1.bind(this)} />
				</div>
				<div>
					我是2儿子组件<Sub2 msg={this.state.msg2} />
				</div>
			</div>
		);
	}
}

class Sub1 extends Component {
  render() {
    return (
		<div>
			我是儿子1
			<div onClick={this.props.setMsg1}>收到爸爸的问候:{this.props.msg}</div>
			我的儿子1:<Three1 msg={this.props.msg} />
			我的儿子2<Three2 msg={this.props.msg} />
		</div>
    );
  }
}

class Three1 extends Component {
  render() {
    return (
		<div>
			我是孙子1(爸爸是1儿子)
			<div>收到爷爷的问候:{this.props.msg}</div>
		</div>
    );
  }
}
class Three2 extends Component {
  render() {
    return (
		<div>
			我是孙子2(爸爸是1儿子)
			<div>收到爷爷的问候:{this.props.msg}</div>
		</div>
    );
  }
}

class Sub2 extends Component {
  render() {
    return (
		<div>
			我是儿子2
			<div>收到爸爸的问候:{this.props.msg}</div>
		</div>
    );
  }
}

ReactDOM.render(<Test />, document.getElementById('root'));
registerServiceWorker();

同理,非常简的处理,就是不断传递

 

2.2孙子传话给爷爷

其实同上面的原理,我们直接修改代码:

110655_kLTZ_2352644.png

点击修改:

110713_dR7T_2352644.png

全部代码:

import React, { Component } from 'react';
import ReactDOM from 'react-dom';

import registerServiceWorker from './registerServiceWorker';


class Test extends Component {
	
	constructor(props) {
        super(props);
        // 设置 initial state
        this.state = {
            msg1: "1儿子你好",
			msg2: "2儿子你好"
        };

    }
	
	setMsg1() {
		this.setState({msg1:"谢谢1儿子的回复"})
	}
		
	render() {
		return (
			<div>
				组件交互
				<p>给1儿子说的话:{this.state.msg1}</p>
				<p>给2儿子说的话:{this.state.msg2} </p>
				<div>
					我是1儿子组件:<Sub1 msg={this.state.msg1} setMsg1={this.setMsg1.bind(this)} />
				</div>
				<div>
					我是2儿子组件<Sub2 msg={this.state.msg2} />
				</div>
			</div>
		);
	}
}

class Sub1 extends Component {
  render() {
    return (
		<div>
			我是儿子1
			<div onClick={this.props.setMsg1}>收到爸爸的问候:{this.props.msg}</div>
			我的儿子1:<Three1 msg={this.props.msg}  setMsg1={this.props.setMsg1} />
			我的儿子2<Three2 msg={this.props.msg} />
		</div>
    );
  }
}

class Three1 extends Component {
  render() {
    return (
		<div>
			我是孙子1(爸爸是1儿子)
			<div onClick={this.props.setMsg1}>收到爷爷的问候:{this.props.msg}</div>
		</div>
    );
  }
}
class Three2 extends Component {
  render() {
    return (
		<div>
			我是孙子2(爸爸是1儿子)
			<div>收到爷爷的问候:{this.props.msg}</div>
		</div>
    );
  }
}

class Sub2 extends Component {
  render() {
    return (
		<div>
			我是儿子2
			<div>收到爸爸的问候:{this.props.msg}</div>
		</div>
    );
  }
}

ReactDOM.render(<Test />, document.getElementById('root'));
registerServiceWorker();

 

3.兄弟组件交互

这个我们就不多说了,其实都是子组件传话给父组件的原理,要通过兄弟之间的父组件作为交互桥梁

转载于:https://my.oschina.net/tbd/blog/1545313

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值