这是我参与8月更文挑战的第六天,活动详情查看:8月更文挑战
组件是独立且封闭的单元,默认情况下只能使用组件自己的数据。 在组件化过程中,我们将一个完整的功能拆分成多个组件,以便更好地完成整个应用的功能。但多个组件之间避免不了要共享数据,所以要打破独立封闭性,这个过程就是组件通讯。
<Hello name="jack" age={19}/>
函数组件
function Hello(props){
return (
<div>接收到数据:{props.name}</div>
)
}
类组件
class Hello extends React.Component{
render(){
return(
<div>接收到的数据:{this.props.age}</div>
)
}
}
例子1 : 函数组件 我们打印出的props是一个对象
//2 接收数据
const Hello = props =>{
console.log(props)
return(
<div>
<h1>props:{props.name}</h1>
</div>
)
}
// 1 传递数据
ReactDOM.render(<Hello name="jack" />, document.getElementById('root'))
例子2 :类组件
//2 接收数据
class Hello extends React.Component{
render(){
console.log(this.props)
return(
<div>
<h1>props:{this.props.name}</h1>
</div>
)
}
}
// 1 传递数据
ReactDOM.render(<Hello name="jack" />, document.getElementById('root'))
// 字符型
<Hello age="19"/>
// 数值型
<Hello age={10}/>
// 数组
<Hello colors=['red','green','pink']/>
// 函数
<Hello fn={()=>console.log('this is 函数')}/>
在函数组件中传递函数 是能够调用组件中传递的函数的 props.fn()
const Hello = props =>{
props.fn()
return(
<div>
<h1>props:{props.name}</h1>
</div>
)
}
// 1 传递数据
ReactDOM.render(<Hello name="jack" fn={()=>console.log('this is 函数')} />, document.getElementById('root'))
在类组件中
class Hello extends React.Component{
constructor(props){
super(props)
props.fn()
}
render(){
console.log(this.props.fn);
return(
<div>
<h1>props:{this.props.name}</h1>
</div>
)
}
}
// 1 传递数据
ReactDOM.render(<Hello name="jack" fn={()=>console.log('this is 函数')} />, document.getElementById('root'))
传递 jsx
<Hello name="jack"
tag = {<p>这是一个标签</p>}
fn={()=>console.log('this is 函数')} />, document.getElementById('root'))
const Hello = props =>{
props.fn()
props.name="sssss"
return(
<div>
<h1>props:{props.name}</h1>
{props.tag}
</div>
)
}
class Hello extends React.Component{
constructor(props){
// 推荐将props传递给父类构造函数
super(props)
//console.log(this.props)
//console.log(props)
}
render(){
console.log(this.props)
return <div>{this.props.age}</div>
}
}
class Parent extends React.Component{
state={
lastName:"wang"
}
render(){
return(
<div style={{background:"red"}}>
父组件:
<Child name={this.state.lastName}/>
</div>
)
}
}
const Child = (props)=>{
console.log(props)
return(
<div style={{background:"skyblue"}}>
<p>子组件:{props.name}</p>
</div>
)
}
// 1 传递数据
ReactDOM.render(<Parent/>, document.getElementById('root'))
思路:利用回调函数,父组件提供回调,子组件调用,将要传递的数据作为回调函数的参数
/**
- 父组件
*/
class Parent extends React.Component{
state ={
parentMsg : ''
}
// 提供回调函数 接收数据
getData = (data)=>{
console.log("接受的数据",data)
this.setState({parentMsg:data})
}
render(){
return(
<div style={{background:"red"}}>
父组件:{this.state.parentMsg}
<Child getData={this.getData}/>
</div>
)
}
}
/**
- 子组件
*/
class Child extends React.Component{
state ={
childMsg :'react'
}
handelClick = ()=>{
this.props.getData(this.state.childMsg)
}
render(){
return(
<div style={{background:"skyblue"}}>
<button onClick={this.handelClick}>按钮</button>
</div>
)
}
}
class Counter extends React.Component {
// 提供共享状态
state ={
count:0
}
// 提供修改状态的方法
Add = ()=>{
this.setState({
count:this.state.count+1
})
}
render() {
return (
<div>
<Child1 count={this.state.count}/>
<Child2 Add={this.Add}/>
</div>
)
}
}
const Child1 = (props) => {
return <h1>计数器:{props.count}</h1>
}
const Child2 = (props) => {
return <button onClick={()=>{props.Add()}}>+1</button>
}
ReactDOM.render(<Counter />, document.getElementById('root'))