组件传值可以分成三类
1.父组件向子组件传递数据
2.子组件向父组件传递数据
3.非父子组件之间的数据传递
父传子
函数式组件
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>Hello World</title>
<script crossorigin src="https://unpkg.com/react@16/umd/react.development.js"></script>
<script crossorigin src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script>
<script crossorigin src="https://unpkg.com/babel-standalone@6.15.0/babel.min.js"></script>
</head>
<body>
<div id="root"></div>
</body>
</html>
<!--
组件:组成的部件,可以接受任何props输入,并返回元素
-->
<script type="text/babel">
// 创建一个父组件
function Parent(){
return (
<div>
<h1>这是父组件</h1>
{/*在父组件中嵌套子组件*/}
<Child name="1"></Child>
</div>
)
}
// 创建一个子组件 列表
function Child(props){
return (
<div>
<h3>这是子组件</h3>
<ul>
<li>{props.name}</li>
<li>2</li>
<li>3</li>
</ul>
</div>
)
}
// 2. 组件的使用
ReactDOM.render(
<Parent></Parent>,
document.getElementById('root')
);
</script>
类组件
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>Hello World</title>
<script crossorigin src="https://unpkg.com/react@16/umd/react.development.js"></script>
<script crossorigin src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script>
<script crossorigin src="https://unpkg.com/babel-standalone@6.15.0/babel.min.js"></script>
</head>
<body>
<div id="root"></div>
</body>
</html>
<script type="text/babel">
// 创建一个类组件 -- 父
class Parent extends React.Component{
render(){
return (
<div>
<h1>这是父组件</h1>
{/*在父组件中嵌套子组件*/}
<Child name="1"></Child>
</div>
)
}
}
// 创建一个类组件 -- 子
class Child extends React.Component{
render(){
return (
<div>
<h3>这是子组件</h3>
<ul>
<li>{this.props.name}</li>
<li>2</li>
<li>3</li>
</ul>
</div>
)
}
}
ReactDOM.render(
<Parent></Parent>,
document.getElementById('root')
);
</script>
子传父
函数式组件
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>Hello World</title>
<script crossorigin src="https://unpkg.com/react@16/umd/react.development.js"></script>
<script crossorigin src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script>
<script crossorigin src="https://unpkg.com/babel-standalone@6.15.0/babel.min.js"></script>
</head>
<body>
<div id="root"></div>
</body>
</html>
<script type="text/babel">
//子组件
function Child(props){
return (
<div>
{/*当文本框内容发生变化的时候.会执行父组件里面的事件*/}
子组件:<input onChange={props.handleEmail}/>
</div>
)
}
//父组件
function Parent() {
return (
<div>
<div id='div'>父组件:{1}</div>
<Child name="email" handleEmail={
function (event){
/*获取子组件的数据*/
console.log(event.target.value)
document.getElementById('div') = event.target.value
}
}/>
</div>
)
}
ReactDOM.render(
<Parent />,
document.getElementById('root')
);
</script>
类组件
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>Hello World</title>
<!--react的核心库-->
<script crossorigin src="https://unpkg.com/react@16/umd/react.development.js"></script>
<script crossorigin src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script>
<script crossorigin src="https://unpkg.com/babel-standalone@6.15.0/babel.min.js"></script>
</head>
<body>
<div id="root"></div>
</body>
</html>
<script type="text/babel">
//子组件
class Child extends React.Component{
render(){
return (
<div>
{/*当文本框内容发生变化的时候.会执行父组件里面的事件*/}
子组件:<input onChange={this.props.handleEmail}/>
</div>
)
}
}
//父组件
class Parent extends React.Component{
constructor(props){
super(props)
this.state = {
email:''
}
}
handleEmail(event){
this.setState({email: event.target.value});
}
render(){
return (
<div>
<div>父组件:{this.state.email}</div>
<Child name="email" handleEmail={this.handleEmail.bind(this)}/>
</div>
)
}
}
ReactDOM.render(
<Parent />,
document.getElementById('root')
);
</script>
非父子
非父子组件传值之兄弟传值
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>Hello World</title>
<script crossorigin src="https://unpkg.com/react@16/umd/react.development.js"></script>
<script crossorigin src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script>
<script crossorigin src="https://unpkg.com/babel-standalone@6.15.0/babel.min.js"></script>
</head>
<body>
<div id="root"></div>
</body>
</html>
<script type="text/babel">
class Brother1 extends React.Component{
constructor(props){
super(props);
this.state = {}
}
render(){
return (
<div>
<button onClick={this.props.refresh}>
更新兄弟组件
</button>
</div>
)
}
}
class Brother2 extends React.Component{
constructor(props){
super(props);
this.state = {}
}
render(){
return (
<div>
{this.props.text || "兄弟组件未更新"}
</div>
)
}
}
class Parent extends React.Component{
constructor(props){
super(props);
this.state = {}
}
refresh(){
return (e)=>{
this.setState({
text: "兄弟组件沟通成功",
})
}
}
render(){
return (
<div>
<h2>兄弟组件沟通</h2>
<Brother1 refresh={this.refresh()}/>
<Brother2 text={this.state.text}/>
</div>
)
}
}
ReactDOM.render(<Parent />, document.getElementById('root'));
</script>
使用jquery自定义事件完成传值
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>Hello World</title>
<script src="https://code.jquery.com/jquery.js"></script>
<script crossorigin src="https://unpkg.com/react@16/umd/react.development.js"></script>
<script crossorigin src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script>
<script crossorigin src="https://unpkg.com/babel-standalone@6.15.0/babel.min.js"></script>
</head>
<body>
<div id="root"></div>
</body>
</html>
<script type="text/babel">
class Com1 extends React.Component{
constructor(props){
super(props);
this.state = {}
}
render(){
return (
<div>
<ul>
<li>1</li>
</ul>
</div>
)
}
componentDidMount(){
$('#root').on('bus',function(e,a,b){
console.log(a,b)
})
}
}
class Com2 extends React.Component{
constructor(props){
super(props);
this.state = {}
}
render(){
return (
<div>
<ul>
<li>1</li>
</ul>
</div>
)
}
componentDidMount(){
$('#root').trigger('bus',[11,22])
}
}
ReactDOM.render(
<div>
<Com1></Com1>
<Com2></Com2>
</div>,
document.getElementById('root'));
</script>
使用原生js的方式实现组件之间的数据传递(注:只关注是否实现,不考虑兼容性问题)
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>Hello World</title>
<script src="https://code.jquery.com/jquery.js"></script>
<script crossorigin src="https://unpkg.com/react@16/umd/react.development.js"></script>
<script crossorigin src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script>
<script crossorigin src="https://unpkg.com/babel-standalone@6.15.0/babel.min.js"></script>
</head>
<body>
<div id="root"></div>
</body>
</html>
<script type="text/babel">
// 给dom元素绑定事件 ---- 作为中间人
var elem = document.getElementById('root')
var events = new Event('build');
class Com1 extends React.Component{
constructor(props){
super(props);
this.state = {}
}
render(){
return (
<div>
<ul>
<li>1</li>
</ul>
</div>
)
}
componentDidMount(){
// 给dom元素添加事件监听, 通过函数参数完成数据的接收
elem.addEventListener('build', function (event) {
console.log(event.name)
}, false);
}
}
class Com2 extends React.Component{
constructor(props){
super(props);
this.state = {
name:'我是小高'
}
}
render(){
return (
<div>
<ul>
<li>1</li>
</ul>
</div>
)
}
componentDidMount(){
events.name = this.state.name
elem.dispatchEvent(events)
}
}
ReactDOM.render(
<div>
<Com1></Com1>
<Com2></Com2>
</div>,
document.getElementById('root'));
</script>