【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
{// }

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

相关内容

热门资讯

Python|位运算|数组|动... 目录 1、只出现一次的数字(位运算,数组) 示例 选项代...
张岱的人物生平 张岱的人物生平张岱(414年-484年),字景山,吴郡吴县(今江苏苏州)人。南朝齐大臣。祖父张敞,东...
西游西后传演员女人物 西游西后传演员女人物西游西后传演员女人物 孙悟空 六小龄童 唐僧 徐少华 ...
名人故事中贾岛作诗内容简介 名人故事中贾岛作诗内容简介有一次,贾岛骑驴闯了官道.他正琢磨着一句诗,名叫《题李凝幽居》全诗如下:闲...
和男朋友一起优秀的文案? 和男朋友一起优秀的文案?1.希望是惟一所有的人都共同享有的好处;一无所有的人,仍拥有希望。2.生活,...
戴玉手镯的好处 戴玉手镯好还是... 戴玉手镯的好处 戴玉手镯好还是碧玺好 女人戴玉?戴玉好还是碧玺好点佩戴手镯,以和田玉手镯为佳!相嫌滑...
依然什么意思? 依然什么意思?依然(汉语词语)依然,汉语词汇。拼音:yī    rán基本解释:副词,指照往常、依旧...
高尔基的散文诗 高尔基的散文诗《海燕》、《大学》、《母亲》、《童年》这些都是比较出名的一些代表作。
心在飞扬作者简介 心在飞扬作者简介心在飞扬作者简介如下。根据相关公开资料查询,心在飞扬是一位优秀的小说作者,他的小说作...
卡什坦卡的故事赏析? 卡什坦卡的故事赏析?讲了一只小狗的故事, 我也是近来才读到这篇小说. 作家对动物的拟人描写真是惟妙...
林绍涛为简艾拿绿豆糕是哪一集 林绍涛为简艾拿绿豆糕是哪一集第三十二集。 贾宽认为是阎帅间接导致刘映霞住了院,第二天上班,他按捺不...
小爱同学是女生吗小安同学什么意... 小爱同学是女生吗小安同学什么意思 小爱同学,小安同学说你是女生。小安是男的。
内分泌失调导致脸上长斑,怎么调... 内分泌失调导致脸上长斑,怎么调理内分泌失调导致脸上长斑,怎么调理先调理内分泌,去看中医吧,另外用好的...
《魔幻仙境》刺客,骑士人物属性... 《魔幻仙境》刺客,骑士人物属性加点魔幻仙境骑士2功1体质
很喜欢她,该怎么办? 很喜欢她,该怎么办?太冷静了!! 太理智了!爱情是需要冲劲的~不要考虑着考虑那~否则缘...
言情小说作家 言情小说作家我比较喜欢匪我思存的,很虐,很悲,还有梅子黄时雨,笙离,叶萱,还有安宁的《温暖的玄》 小...
两个以名人的名字命名的风景名胜... 两个以名人的名字命名的风景名胜?快太白楼,李白。尚志公园,赵尚志。
幼儿教育的代表人物及其著作 幼儿教育的代表人物及其著作卡尔威特的《卡尔威特的教育》,小卡尔威特,他儿子成了天才后写的《小卡尔威特...
海贼王中为什么说路飞打凯多靠霸... 海贼王中为什么说路飞打凯多靠霸气升级?凯多是靠霸气升级吗?因为之前刚到时确实打不过人家因为路飞的实力...
运气不好拜财神有用吗运气不好拜... 运气不好拜财神有用吗运气不好拜财神有没有用1、运气不好拜财神有用。2、拜财神上香前先点蜡烛,照亮人神...