React系列七:父子组件通信

虚拟货币
• 阅读 6570

前言

这节我们将介绍 React 中父子组件通信的方法,父与子通信、子与父通信的方法。

本文会向你介绍以下内容:

  • 初识组件的嵌套
  • 父组件向子组件通信
  • 子组件向父组件通信

初识组件的嵌套

让我们回顾一下在之前的学习中,我们说过:

组件允许你将 UI 拆分为独立可复用的代码片段,并对每个片段进行独立构思

为什么要进行组件嵌套呢?

如果一个应用程序的所有逻辑全存在于一个组件中,那这个组件会变的相当臃肿且让维护人员望而却步。

所以我们通常是组件化开发,而组件化开发的核心思想便在于将一个大组件拆分成许多小组件,然后再将这些组件组合嵌套在一起,形成我们的应用程序。

分析一下下面代码的嵌套逻辑

class App extends React.Component {
  render(){
    return (
        <div>
          <Comment />
          <Avatar  />
      </div>
    )
  }
}

function Comment (){
  return(
    <div>评论:你真好看</div>
  )
}

function Avatar (){
  return(
      <img src=""></img>
    <div>小明</div>
  )
}

层级是这样的

React系列七:父子组件通信

当组件仅用来展示时,这对我们开发者来说是相当友好了,可组件要相互进行通信呢?

  • 比如 App 中进行了网络请求获取了数据,现在要将数据传递下去,让 Comment 组件拿到相应数据进行渲染
  • 也可能是子组件中发生了某些事件,需要由父组件来完成某些操作,那就需要子组件向父组件传递事件

来了,来了,本章的主题来了!

父组件向子组件通信

当子组件为 Class 组件

class App extends React.Component {
  render(){
    return (
        <div>
          <Comment comment='评论:你真好看!'/>
          <Avatar  src='https://xhs-rookies.com/' name='小明'/>
      </div>
    )
  }
}

class Comment extends React.Component {
  constructor(props){
    super(props);
  }
  return(
    <div>{this.props.comment}</div>
  )
}

class Avatar extends React.Component {
  constructor(props){
    super(props);
  }
  return(
      <img src={this.props.src}></img>
    <div>{this.props.name}</div>
  )
}
注意:props 的主要作用是让使用该组件的父组件可以传入参数来配置该组件。它是外部传进来的配置参数,组件内部无法控制也无法修改。除非外部组件主动传入新的 props,否则组件的 props 永远保持不变。

所有 React 组件都必须像纯函数一样保护它们的 props 不被更改。

当子组件为 function 组件

当我们的组件为 function 时又是怎样的呢?

class App extends React.Component {
  render(){
    return (
        <div>
          <Comment comment='评论:你真好看!'/>
          <Avatar  src='https://xhs-rookies.com/' name='小明'/>
      </div>
    )
  }
}

function Comment (props){
    const {comment} = props;

  return(
    <div>{comment}</div>
  )
}

function Avatar (props){
    const {src , name} = props;

  return(
      <img src={src}></img>
    <div>{name}</div>
  )
}

function 组件相对来说比较简单,因为不需要有构造方法,也不需要有 this 的问题。

子组件向父组件通信

某些情况下,我们需要从子组件向父组件传递消息。

React 中同样是通过 props 传递消息,只是此时由父组件传递给子组件一个回调函数,在子组件中调用此函数即可。

让我们看看怎么实现这个需求呢?

  • Comment 组件中有点赞按钮
  • 当点击点赞按钮时,评论组件中需显示点赞数+1
class Comment extends React.Component {
  constructor(props){
    super(props);
    this.state = {
      counter:0
    }
  }

  changeCoutenr(count){
    this.setState({
      counter: this.state.counter + count
    })
  }

  return(
    <div>
         <div>{this.props.comment}</div>
             <p>{'当前点赞数'+this.state.counter}
      <thumsButton btnClick={e => this.changeCounter(1)}></thumsButton>
    </div>

  )
}

function thumsButton (props){
  const {btnClick} = props;
  return <button onClick={btnClick}>点赞</button>
}

下节预告

在这一节我们学习了React中父子组件通信,在下一节中,我们将给大家介绍React中非父子组件通信的功能知识,敬请期待!

点赞
收藏
评论区
推荐文章
Alex799 Alex799
4年前
vue最新面试题
最近在面试,总结几个重点的面试题:一、vue父子组件之间的传值:简单来说,子组件通过props方法接受父组件传来的值,子组件通过$emit方法来向父组件发送数据。(具体案例可以看我之前写的博客)。二、vue生命周期函数:beforeCreatecreatedbeforeMountmountedbeforeUpdateupdatedbeforeDestr
Chase620 Chase620
4年前
vue的8种通信方式
1.props/emit1.父组件向子组件传值下面通过一个例子说明父组件如何向子组件传递数据:在子组件article.vue中如何获取父组件section.vue中的数据articles:\'红楼梦','西游记','三国演义'\//section父组件<template<divclass"section"
Souleigh ✨ Souleigh ✨
4年前
React 组件间通信的10种方法
组件间通信方式总结父组件子组件:1.Props2.InstanceMethods子组件父组件:1.CallbackFunctions2.EventBubbling兄弟组件之间:1.ParentComponent不太相关的组件之间:1.Context2.Portals3.Global
浩浩 浩浩
4年前
【Flutter实战】对齐与相对定位(Align)
4.6对齐与相对定位(Align)在上一节中我们讲过通过Stack和Positioned,我们可以指定一个或多个子元素相对于父元素各个边的精确偏移,并且可以重叠。但如果我们只想简单的调整一个子元素在父元素中的位置的话,使用Align组件会更简单一些。4.6.1AlignAlign组件可以调整子组件的位置,并且可以根据子
科林-Colin 科林-Colin
4年前
Vue 组件通信方式及其应用场景总结
前言相信实际项目中用过vue的同学,一定对vue中父子组件之间的通信并不陌生,vue中采用良好的数据通讯方式,避免组件通信带来的困扰。今天笔者和大家一起分享vue父子组件之间的通信方式,优缺点,及其实际工作中的应用场景首先我们带着这些问题去思考1vue中到底有多少种父子组件通信方式?2vue中那种父子组件最佳通信方式是什么?3
爱丽丝13 爱丽丝13
4年前
React 组件通信之发布订阅模式
React通信react的数据流是单向的,react通信有以下几种方式:父向子通信:传入props子向父通信:父组件向子组件传一个函数,然后通过这个函数的回调,拿到子组件传过来的值父向孙通信:利用context传值。React.createContext()兄弟间通信:​1、找一个相同的父组件,既可以用pr
Dax Dax
4年前
Vue父子组件
几种常见的通信方式:1、prop属性父组件通过绑定属性的方式,给子组件传值,同时子组件通过设置props来接收letChildVue.extend(template:'content',props:content:type:String,default:()r
Chase620 Chase620
4年前
关于:父组件中的子组件中的子组件(孙级)添加数据后怎么样去调用父组件中的方法呢?
1、需求引入image.png这是父组件下的子组件的子组件,一个绑定子设备的弹出窗modal,那么我们怎么样在这个组件中选中子设备后点击确定时去触发父组件的父组件的table列表数据刷新呢?image.pngimage.pngimage.png组件的层级关系.png上述的图示便是部分代码的展示,一般的组件传值有父组件传子组件(
Stella981 Stella981
3年前
Flutter子组件调用父组件方法修改父组件参数
子组件调用父级组件方法的主要实现是父组件给子组件传入一个方法,然后在子组件中调用父级方法来修改父级的参数。看一下效果图!(https://img2018.cnblogs.com/blog/1038765/201907/103876520190702152130487420290106.gif)父级组件实现在父级组件中写一个
Stella981 Stella981
3年前
FLutter父子组件通信
本文介绍flutter父子组件数据传递和回调.还是以之前的代码为例Flutter\_DayByDay(https://gitee.com/Royce_he/Flutter_DayByDay)由于之前用ReactNative写项目,顺便对比一下RN父组件直接在xml标签中写属性{值/方法},子组件通过props去取属性和方法
昔不亏 昔不亏
9个月前