【React】React入门--组件间的通信
创始人
2024-05-29 02:33:27
0

🎀个人主页:努力学习前端知识的小羊
感谢你们的支持:收藏🎄 点赞🍬 加关注🪐

组件间通信

    • 父子组间通信
      • 1.父传子
      • 2.子传父
      • 3.ref
    • 非父子组件通信
      • 1.状态提升(中间人状态)
      • 2.发布订阅模式
      • 3.context状态树传参
    • React插槽

父子组间通信

1.父传子

props
父组件向子组件传递props,子组件通过参数接受props值

//父组件
//子组件
this.props.type}>

2.子传父

通过回调函数 callback

//子组件
//父组件
handleEvent=()=>{this.setState({isshow:!this.state.isshow})console.log("父组件的event函数");}render() {return (
this.handleEvent}/>
)}

3.ref

子组件设置ref属性,父组件通过this.ref名称.current来获取到子组件的数据来进行调用

//子组件
state={value:''}
render(){return (evt)=>{this.setState({value:evt.target.value})}}>
}//父组件
username = React.createRef()
password = React.createRef()render() {return (
//给子组件绑定refthis.username}/>this.password}/>
)}

非父子组件通信

1.状态提升(中间人状态)

React中的状态提升概括来说,就是将多个组件需要共享的状态提升到他们最近的父组件上,在父组件上改变这个状态然后通过props分发给子组件。

//父组件
render() {return (
{this.state.filmlist.map(item =>item.filmId} {...item}onEvent={(value)=>{this.setState({info:value})}}>)}this.state.info}>
)}//子组件 class FilmItem extends Component{render(){ let {name,poster,synopsis,grade} = this.propsreturn
()=>{this.props.onEvent(synopsis)}}> poster} alt={name}/>

{name}

观众评分:{grade}
} }class Film_detail extends Component{render(){return
{this.props.info}
} }

2.发布订阅模式

存在一个调度中心bus,此方法适用于任何组件之间的通信
调度中心bus

var bus = {list:[],// 订阅subscribe(callback){// console.log();this.list.push(callback)},// 发布publish(text){this.list.forEach(callback=>{callback && callback(text)})}
}

订阅消息

//创建订阅的回调函数
subscribe(callback){// console.log();this.list.push(callback)},
// 订阅者bus.subscribe((value)=>{console.log('1111',value);
})bus.subscribe((value)=>{console.log("22222",value);
})

发布消息

// 创建bus的中的发布函数publish(text){this.list.forEach(callback=>{callback && callback(text)})}// 发布者
setTimeout(()=>{bus.publish("111")
},0)
setTimeout(()=>{bus.publish("222")
},1000)
setTimeout(()=>{bus.publish("333")
},2000)

bus.publish调用时,传入参数,触发bus中publish函数并接收到数据即text,调用callback回调函数,传入text,此时调用者subscribe将收到参数为value,即将组件A数据传入组件B中

3.context状态树传参

先创建context对象

const GlobalContext = React.createContext() //创建context对象

根组件引入GlobalContext,并使用GlobalContext.Provider(生产者)

{call:"打电话",sms:"短信",info:this.state.info,changeInfo:(value)=>{this.setState({info:value})}}}>
{this.state.filmlist.map(item =>item.filmId} {...item}>)}

其他组件引入GlobalContext并调用context,使用GlobalContext.Consumer

//组件1
{(value)=>{return 
()=>{value.changeInfo(synopsis)}}> poster} alt={name}/>

{name}

观众评分:{grade}
}}
//组件2 {(value)=>
detail-{value.info}
}

注意:GlobalContext.Consumer内必须是回调函数,通过context方法改变根组件状态

context优缺点:

优点:跨组件访问数据
缺点: react组件树种某个上级组件shouldComponetUpdate返回false,当context更新时,不会引起下级组件更新

React插槽

使用props的固定属性children在Child组件中占位

作用:

1.为了复用
2.一定程度减少父子通信

单个插入

//子组件写入this.props.children,为插入部分留下位置
class Swiper extends Component{render(){return  
{this.props.children}
} }//父组件写入要插入子组件的内容
111111
222222
333333

多个插入

class Child extends Component{render(){return 
//子组件定义插入的顺序{this.props.children[0]}{this.props.children[1]}{this.props.children[2]}
} }//父组件写入要插入子组件的内容
11111111
222222
33333333
{// }

希望对大家有所帮助,期待你们的支持✨✨✨

相关内容

热门资讯

住房城乡建设部:各地不断加快城... 来源:央 记者近日从住房城乡建设部获悉,今年以来,各地不...
新疆乌鲁木齐市乌鲁木齐县发生3... 转自:上观新闻中国地震台网正式测定:7月8日04时47分,在新疆乌鲁木齐市乌鲁木齐县(北纬43.32...
消除系统壁垒 打通信息通道 近日,民政部向社会公布了《行政区划代码管理办法》,这是我国行政区划代码管理领域首个部门规章,将于9月...
青岛西海岸新区培育蓝色动能 本报青岛7月7日讯(记者刘成)近日,我国首个实现工业运行的全海水环境漂浮式光伏项目在青岛西海岸新区建...
中老铁路发送旅客突破5500万...   本报讯 记者王绍芬报道 记者从中国铁路昆明局集团有限公司获悉,中老铁路开通运营以来,截至7月7日...
治理违建不能“走过场” 近段时间,住宅区内违建问题再次引发社会关注。社区违建不仅困扰居民,削弱法律权威,也在不断侵蚀公共秩序...
绥阳24万余亩金银花迎采收 转自:贵州日报 本报讯(记者 谢国欢)仲夏时节,万物竞秀。7月2日,在遵义市绥阳县小关乡青杠林村,家...
500件白酒出口纽约 转自:贵州日报 本报讯(记者 冯倩)近日,一个满载500件白酒的20尺集装箱从仁怀市茅台镇出发,当日...
台湾花莲县发生4.0级地震 震... 中国地震台网正式测定:7月8日03时57分,在台湾花莲县(北纬23.85度,东经121.53度)发生...
罗马仕多个电商官方旗舰店关闭 ... 转自:南京晨报 充电宝品牌罗马仕正深陷由产品召回引发的信任危机。7月7日,记者查阅各大电商平...