React组件通信--props

React组件通信

1、props接收数据

//index.js
import App from "./App";

ReactDOM.render(
  <App 
  name='传递数据' 
  age={19}
  color={[1,2,3]}
  fn={()=>{console.log('函数')}}
  tag={<p>段落</p>}
  />,document.getElementById("root")
);

第一种方式:函数组件props通过参数接收

//app.js
function App(props) {
  function myClick(e) {
    console.log(props);
  }
  return (
    <div className="App">
      <button onClick={myClick}>按钮</button>
    </div>
  );
}
export default App;

在这里插入图片描述

第二种方式:类组件通过this.props.直接访问

class App extends React.Component {
  render() {
    return (
      <div>
        <span>props: {this.props.name}</span>
      </div>
    );
  }
}
export default App;

特点:

  1. 可以给组件传递任意类型的数据
  2. props是只读的对象,只能读取属性的值,无法修改对象
  3. 使用类组件时,如果写了构造函数,应该将props传递给super(),否则,无法在构造函数中获取props
class Hello extends React.Component {
	constructor(props){
		super(props)
		console.log(props)
	}
	render(
		return(
			<div></div>
		)
	)
}

2、父传子

使用props:

//父组件
import Children from "./Children";

class App extends React.Component {
  state = {
    data: "父组件state数据",
  };
  render() {
    return (
      <div>
        <span>props: {this.props.age}</span>
        <div style={{ color: "red", border: "1px solid #f00" }}>
          子组件:
          <Children data={this.state.data} />
        </div>
      </div>
    );
  }
}
export default App;

//子组件
import React from "react";

class Children extends React.Component {
  render() {
    return (
      <div>
        <h3> childrens </h3>
        <p>
          数据:{this.props.data}
        </p>
      </div>
    );
  }
}

export default Children;

3、子传父

利用回调函数,父组件提供回调,子组件调用

//父组件
import Children from "./Children";
class App extends React.Component {
  state = {
    data: "父组件state数据",
    data2: "",
  };
  getChildData = (val) => {
    console.log("val", val);
    this.setState({
      data2: val,
    });
  };
  render() {
    return (
      <div>
        <span>props: {this.props.age}</span>
        <div style={{ color: "red", border: "1px solid #f00" }}>
          子组件:
          <Children data={this.state.data} getChildData={this.getChildData} />
          子组件数据:
          {this.state.data2}
        </div>
      </div>
    );
  }
}

export default App;
//子组件
class Children extends React.Component {
  sendData = () => {
    this.props.getChildData("子组件传递数据");
  };
  render() {
    return (
      <div>
        <h3> childrens </h3>
        <p onClick={this.sendData}>数据:{this.props.data}</p>
      </div>
    );
  }
}

export default Children;

4、兄弟组件传值

用父级做中间件,子传父,父再传子

//children1
import React from "react";

class Children extends React.Component {
  sendData = () => {
    this.props.getChildData("子组件传递数据");
  };
  render() {
    return (
      <div>
        <h3> childrens </h3>
        <p onClick={this.sendData}>点击children1</p>
        数据:{this.props.data}
      </div>
    );
  }
}

export default Children;
//Children2 
import React from "react";
class Children2 extends React.Component {
  render() {
    return (
      <div>
        显示兄弟children组件的数据:
        {this.props.data}
      </div>
    );
  }
}

export default Children2;

//App 父组件
import Children from "./Children";
import Children2 from "./Children2";
class App extends React.Component {
  state = {
    data: "父组件state数据",
    data2: "",
  };
  getChildData = (val) => {
    console.log("val", val);
    this.setState({
      data2: val,
    });
  };
  render() {
    return (
      <div>
        <span>props: {this.props.age}</span>
        <div style={{ color: "red", border: "1px solid #f00" }}>
          子组件:
          <Children data={this.state.data} getChildData={this.getChildData} />
          父组件显示子组件数据:
          {this.state.data2}
          子组件2<Children2 data={this.state.data2} />
        </div>
      </div>
    );
  }
}

export default App;

其实都是用了props

5.children属性

  • children属性:表示组件标签的子节点,当组件标签有子节点时,props就会有该属性。
  • 与props属性一样,值可以是任意值(文本、dom、甚至函数)
function Hello(props) {
	return {
		<div>
			组件是子节点:{props.children}
		</div>
	}
}

<Hello> 我是子节点 </Hello>

6.props深入

  1. 安装prop-type(npm i prop-types)
  2. 导入prop-type包
  3. 使用 组件名.propType = {} 来给组件的props添加校验规则
import PropTypes from 'prop-types'
function App(props){
	return {
		<h1>Hi, {props.colors}</h1>
	}
}
App.proptypes = {
	//约束colors属性为arrray类型
	colors: Proptypes.array
	//类型有: array、bool、func、number、object、string、element
}
  1. 必填:(.isRequired)
requireFunc: PropTypes.func.isRequired
  1. 指定特定结构的对象:(shape({ }))
oprionalObjectWithShape: PropType.shape({
	color: PropType.string,
	fontSize: PropsTypes.number
})
React组件通信可以通过props属性进行传递数据。子组件可以通过props接收父组件传递的数据,并进行相应的操作。在函数式组件中,可以直接通过props对象来获取父组件传递的数据。在类组件中,需要使用this.props获取父组件传递的数据。\[1\] 另外,子组件也可以通过调用父组件传递过来的函数来实现子传父的通信。子组件可以将需要传递的数据作为函数的实参传入,并在子组件内部调用该函数。这样就可以将子组件的数据传递给父组件进行处理。\[3\] 总结起来,React组件通信可以通过props属性进行父传子和子传父的数据传递和操作。父组件通过props将数据传递给子组件,子组件通过props接收父组件传递的数据。子组件可以通过调用父组件传递的函数来将子组件的数据传递给父组件进行处理。\[1\]\[3\] #### 引用[.reference_title] - *1* *3* [React组件通信](https://blog.csdn.net/weixin_52148548/article/details/125287315)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [react组件通信](https://blog.csdn.net/weixin_39818813/article/details/125737028)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值