【React】React入门--组件间的通信

简介: 组件间的通信

🎀个人主页:努力学习前端知识的小羊

感谢你们的支持:收藏🎄 点赞🍬 加关注🪐


父子组间通信

1.父传子

props

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

//父组件
<Field label="用户名" type="text" />
//子组件
<div>
  <label>{this.props.label}</label>
  <input type={this.props.type}></input>
</div>

2.子传父

通过回调函数 callback

//子组件
<button onClick={()=>{
     console.log("子通知父,让父的isshow取反",this.props.event);
     this.props.event() 
}}>click</button>
//父组件
handleEvent=()=>{
         this.setState({
                isshow:!this.state.isshow
            })
         console.log("父组件的event函数");
    }
  render() {
    return (
      <div>
          <Navbar event={this.handleEvent}/>
      </div>
    )
  }

3.ref

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

//子组件
state={
        value:''
    }
render(){
  return <input onChange={(evt)=>{
        this.setState({
             value:evt.target.value
         })
    }}></input>
}
//父组件
username = React.createRef()
password = React.createRef()
  render() {
    return (
      <div>
      //给子组件绑定ref
          <Field label="用户名" type="text" ref={this.username}/>
          <Field label="密码" type="password" ref={this.password}/>
          <button onClick={()=>{
          //获取子组件的state.vlue
            console.log(this.username.current.state.value,
                this.password.current.state.value);
          }}>登录</button>
      </div>
    )
  }

非父子组件通信

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

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

//父组件
render() {
    return (
      <div>
        {
            this.state.filmlist.map(item =>
                <FilmItem key={item.filmId} {...item}
                onEvent={(value)=>{
                    this.setState({
                        info:value
                    })
                }}></FilmItem>
                )
        }
        <Film_detail info={this.state.info}></Film_detail>
      </div>
    )
  }
//子组件
class FilmItem extends Component{
    render(){ 
        let {name,poster,synopsis,grade} = this.props
        return <div className='filmitem' onClick={()=>{
            this.props.onEvent(synopsis)
        }}> 
            <img src={poster} alt={name}/>
            <h4>{name}</h4>
            <div>观众评分:{grade}</div>
        </div>
    }
}
class Film_detail extends Component{
    render(){
        return <div className='film_detail'>
            {this.props.info}
        </div>
    }
}

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);
})
1
2
3
4
5
6
7
8
9
10
11
12
13
14
发布消息
// 创建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)
1

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

3.context状态树传参

先创建context对象

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

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

<GlobalContext.Provider value={{
            call:"打电话",
            sms:"短信",
            info:this.state.info,
            changeInfo:(value)=>{
                this.setState({
                    info:value
                })
            }
        }}>
            <div>
                {
                    this.state.filmlist.map(item =>
                        <FilmItem key={item.filmId} {...item}
                        ></FilmItem>
                        )
                }
                <Film_detail></Film_detail>
            </div>
      </GlobalContext.Provider>

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

//组件1
<GlobalContext.Consumer>
    {
         (value)=>{
             return <div className='filmitem' onClick={()=>{
                 value.changeInfo(synopsis)
             }}> 
                 <img src={poster} alt={name}/>
                 <h4>{name}</h4>
                 <div>观众评分:{grade}</div>
             </div>
         }
     }
 </GlobalContext.Consumer>
//组件2
<GlobalContext.Consumer>
     {
         (value)=>
             <div className='film_detail'>
                 detail-{value.info}
             </div>
     }
 </GlobalContext.Consumer>

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

context优缺点:

优点:跨组件访问数据

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

React插槽

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

作用:

1.为了复用

2.一定程度减少父子通信

单个插入

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

多个插入


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

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


目录
相关文章
|
20天前
|
监控 前端开发 JavaScript
React 静态网站生成工具 Next.js 入门指南
【10月更文挑战第20天】Next.js 是一个基于 React 的服务器端渲染框架,由 Vercel 开发。本文从基础概念出发,逐步探讨 Next.js 的常见问题、易错点及解决方法,并通过具体代码示例进行说明,帮助开发者快速构建高性能的 Web 应用。
54 10
|
1月前
|
前端开发 JavaScript 开发者
探索现代Web前端技术:React框架入门
【10月更文挑战第9天】 探索现代Web前端技术:React框架入门
|
2月前
|
消息中间件 前端开发
React技术栈-组件间通信的2种方式
本文介绍了React技术栈中组件间通信的两种方式:通过props传递数据和使用消息发布(publish)-订阅(subscribe)机制,并通过实例代码展示了如何使用PubSubJS库实现跨组件通信。
54 11
React技术栈-组件间通信的2种方式
|
2月前
|
移动开发 前端开发 JavaScript
构建高效跨平台移动应用:React Native入门指南
【8月更文挑战第47天】在移动开发领域,React Native凭借其跨平台特性和高效的开发模式赢得了开发者的青睐。本文将通过一个简易的待办事项应用实例,带领读者快速入门React Native,并展示如何利用JavaScript和React框架构建具有原生性能的应用。我们将探讨环境配置、界面布局、状态管理和数据流,以及如何打包和发布您的应用。准备好,让我们开始React Native之旅!
70 20
|
2月前
|
前端开发 JavaScript
React技术栈-React UI之ant-design使用入门
关于React技术栈中使用ant-design库的入门教程,包括了创建React应用、搭建开发环境、配置按需加载、编写和运行代码的步骤,以及遇到错误的解决方法。
38 2
React技术栈-React UI之ant-design使用入门
|
2月前
|
XML 存储 前端开发
React 基础入门
【9月更文挑战第1天】本文详细介绍了由Facebook开发的JavaScript库React,涵盖环境搭建、基本概念、常见问题及解决方案。首先,通过安装Node.js、npm和Create React App快速搭建开发环境;接着,讲解了JSX、组件(包括函数和类组件)、state和props等核心概念;最后,针对JSX语法错误、state异步更新及props与state混淆等问题提供了具体的解决方法和示例代码,帮助读者更好地理解和应用React。
34 2
|
3月前
|
移动开发 前端开发 JavaScript
构建高效跨平台移动应用:React Native入门指南
【8月更文挑战第31天】 在移动开发领域,React Native凭借其跨平台特性和高效的开发模式赢得了开发者的青睐。本文将通过一个简易的待办事项应用实例,带领读者快速入门React Native,并展示如何利用JavaScript和React框架构建具有原生性能的应用。我们将探讨环境配置、界面布局、状态管理和数据流,以及如何打包和发布您的应用。准备好,让我们开始React Native之旅!
|
3月前
|
开发者
告别繁琐代码,JSF标签库带你走进高效开发的新时代!
【8月更文挑战第31天】JSF(JavaServer Faces)标准标签库为页面开发提供了大量组件标签,如`&lt;h:inputText&gt;`、`&lt;h:dataTable&gt;`等,简化代码、提升效率并确保稳定性。本文通过示例展示如何使用这些标签实现常见功能,如创建登录表单和展示数据列表,帮助开发者更高效地进行Web应用开发。
42 0
|
3月前
|
前端开发 JavaScript UED
🎬JSF 与 Ajax:打造瞬间响应的魔法界面!🚀 用户输入即刻,数据交互如梦幻泡影般呈现!
【8月更文挑战第31天】在现代Web应用中,异步数据交互是提升用户体验的关键。JavaServer Faces (JSF) 作为标准Java Web框架,结合Ajax技术,可轻松实现页面异步更新与数据交互。本文通过示例代码介绍如何在JSF中使用Ajax组件(如`f:ajax`)及后端处理方法实现异步功能,并结合JavaScript处理复杂交互,帮助开发者提升Web应用体验。
40 0
|
3月前
|
前端开发 JavaScript UED
JSF 携手 jQuery 上演奇幻大戏,颠覆 Web 开发世界,你敢错过吗?
【8月更文挑战第31天】在Web开发领域,JavaServer Faces(JSF)与jQuery均是不可或缺的强大工具。JSF以组件为基础进行开发,而jQuery则以高效简洁的DOM操作及丰富的插件库著称。结合两者,能为Web应用注入新活力,实现复杂交互与动态效果。通过引入jQuery库并集成至JSF应用中,可轻松实现如动画、表单验证等功能,提升用户体验。本文通过具体示例展示了如何利用jQuery增强JSF应用,包括页面元素的动态显示与隐藏等效果,使开发过程更为便捷高效,激发更多创意可能。
14 0