【React】脚手架,组件化开发,类组件/函数式组件,声明周期,组件的嵌套,子父传递,插槽,Context,事件总线,setState原理

news2024/11/22 11:19:58

❤️ Author: 老九
☕️ 个人博客:老九的CSDN博客
🙏 个人名言:不可控之事 乐观面对
😍 系列专栏:

文章目录

  • 脚手架
    • 目录结构
    • 组件化开发
      • 类组件
      • 函数式组件
  • 声明周期
  • 组件的嵌套
    • 组件之间的通信
    • 插槽
  • Context
  • 事件总线

脚手架

项目名字不能有大写字母
在这里插入图片描述

目录结构

在这里插入图片描述

组件化开发

  • 根据组件的定义方式:分为函数组件和类组件
  • 函数组件主要关注UI的展示,类组件主要关注数据逻辑

类组件

  • 组件的名称是大写字符开头的,类组件需要继承自React.Component,类组件必须实现render函数
  • 在脚手架中用rec直接创建模板,当调用render函数,他会检查this.state的变化并返回以下类型:1.返回React元素(也就是标签模板,通过JSX创建的)2.返回一个数组或者fragments3.返回Portals4.字符串或数值类型
    在这里插入图片描述

函数式组件

  • 函数式组件没有生命周期,没有this指向组件实例,没有内部状态(state)
    在这里插入图片描述

声明周期

  • 最重要的就是componentDidMount,通常在这里可以进行DOM操作,或者在这里发送网络请求,可以添加一些订阅(在willUnmount取消订阅)
    在这里插入图片描述
import React, { Component } from 'react'
import HelloWorld from './HelloWorld'

export class App extends Component {
  constructor() {
    super()
    this.state = {
      isShowHW : true
    }
  }
  switchHWShow() {
    this.setState({ isShowHW : !this.state.isShowHW })
  }
  render() {
    const { isShowHW } = this.state
    return (
      <div>
        <h2>ahhaha</h2>
        <button onClick={e=>this.switchHWShow()}>切换</button>
        {isShowHW && <HelloWorld />}
      </div>
    )
  }
}

export default App

 import React, { Component } from 'react'

export class HelloWorld extends Component {
  constructor() {
    console.log('constructor');
    super()
    this.state = {
      message:'hello world',
    }
  }
  changeText(e) {
    this.setState({ message: 'hello world1' })
  }

  render() {
    const { message } = this.state
    console.log('render');
    return (
      <div>
        <div>{message}</div>
        <button onClick={e => this.changeText(e)}>修改</button>
      </div>
    )
  }

  componentDidMount() {
    console.log('componentDidMount');
  }
  componentDidUpdate() {
    console.log('componentDidUpdate');
  }

  //组件从DOM中卸载掉:从DOM中移除调
  componentWillUnmount() {
    console.log('componentWillUnmount');
  }
}

export default HelloWorld

组件的嵌套

  • 是否显示可以用这种方法
    在这里插入图片描述

组件之间的通信

  • 父组件通过属性 = 值的形式来传递给子组件数据
  • 子组件通过props参数获取父组件传递过来的数据;
  • 父传子:直接就保存在子组件constructors的this.props中了,如果想对类型进行限制,通过propTypes库
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  • 子传父,通过props传递消息,只是让父组件给子组件传递一个回调函数,在子组件中调用这个函数即可。
    父组件
    在这里插入图片描述
    子组件
    在这里插入图片描述

插槽

  • 插槽可以用两种方案实现,1.组件的children子元素2.props属性传递React元素
  • 如果放多个,children就是一个数组,如果放一个,就是children
    在这里插入图片描述
    在这里插入图片描述
    如果想让插槽里面就有一个元素,就通过propTypes实现
    在这里插入图片描述
  • 第二种通过传递props的方法
    在这里插入图片描述
    在这里插入图片描述

Context

  • 在开发中,如果有一些数据需要在多个组件中进行共享,这样一层一层传递下去,会有冗余操作
  • 补充一个语法,如果想传一个对象,可以通过…传递,一层一层传递的话这个语法会方便一些
    在这里插入图片描述
  • 但是,React的API提供了一个Context,在组件之间共享此类值的方式,而不必显示的通过组件树的逐层传递props,实际就是共享了那些对于一个组件树而言是全局的属性
    第一步创建Context,通过createContext创建context实例,括号里传的是默认数据,当我们的子组件不被provider嵌套的时候,但是我们还是引用了ThemeContext的话,就会使用默认数据了
    在这里插入图片描述

第二步,在父组件中通过ThemeContext中的Provider中的value属性为后代提供数据。如果要传递多个数据,采用嵌套的方式传递即可
在这里插入图片描述
在这里插入图片描述

第三步,在子组件中设置context的类型,如果要获取多个数据,其他的用consumer
在这里插入图片描述
在这里插入图片描述

如果是function组件的话,用Consumer,里面有一个回调函数通过value获取值
在这里插入图片描述

事件总线

  • 通过eventBus.emit方法,将要监听的事件放在事件总线中
    在这里插入图片描述
  • 然后在其他组件通过eventBus.on方法监听事件总线中的事件,注意在react中需要绑定this
    在这里插入图片描述
  • 注意当销毁组件的时候,记得销毁事件总线中的事件
    在这里插入图片描述

————————————————————————
♥♥♥码字不易,大家的支持就是我坚持下去的动力♥♥♥
版权声明:本文为CSDN博主「亚太地区百大最帅面孔第101名」的原创文章

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/618667.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vscode实现代码片段快捷输入设置

1.编写想要的代码片段 <template> <div>AppContent</div> </template> <script> export default { } </script> <style scoped> </style> 2.打开网站:snippet generator 如下图添加描述,快捷键和代码片段.右边会有生成内容 …

93.构建样品餐部分第一节

之前我们实现得页面是这个样子的 现在让我们来完成剩下的样品餐部分吧&#xff01; ● 大致实现的页面是这样的 ● 让我们先简单的生成这些框架 <section class"section-meals"><div class"container"><span class"subheading&qu…

SpringCloud Alibaba Seata配置到Nacos

SpringCloud Alibaba Seata 1 Seata 简介 单体应用被拆分成微服务应用&#xff0c;原来的三个模块被拆分成三个独立的应用&#xff0c;分别使用 三个独立的数据源业务操作需要调用三个服务来完成。此时每个服务内部的数据一致性由本地事务来保 证但是全局的数据—致性问题没法…

H5嵌入原生开发小结----兼容安卓与ios的填坑之路

一开始听说开发H5&#xff0c;以为就是做适配现代浏览器的移动网页&#xff0c;心想不用管IE了&#xff0c;欧也。到今天&#xff0c;发现当初too young too simple&#xff0c;兼容IE和兼容安卓与IOS&#xff0c;后者让你更抓狂。接下来数一下踩过的坑。主要分UI展示&#xff…

如何借助AI,产品文案语音配图片一键生成视频

const name "AI生成视频";console.log(name); 以前我们做视频都是要找素材、剪辑、配音&#xff0c;太费时间了&#x1f629;&#xff0c;现在只需要通过AI&#xff0c;输入文字&#xff0c;它就能自动帮我们生成一段有声有色的视频。 我们来看看文本生成的视频效…

案例35:基于Springboot图书商城管理系统开题报告设计

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

面向流媒体的确定时延传输:从QUIC出发,走向未来

QUIC&#xff08;Quick UDP Internet Connections&#xff09;是Google设计的一套可靠UDP传输协议&#xff0c;旨在为HTTP提供一个安全、可靠、高效和低延时的通信基础。QUIC协议已被IETF采纳为标准&#xff0c;并且HTTP/3已选择使用QUIC来代替TCP作为其传输层协议。LiveVideoS…

python怎么退出执行/退出程序语句

python怎么退出执行/退出程序语句 文章目录 python怎么退出执行/退出程序语句sys.exit()函数 raise SystemExit()异常os._exit()函数CtrlC中断程序执行具体情况具体处理参考资料 在Python中&#xff0c;退出执行是一个常见的操作。退出方法介绍&#xff1a; sys.exit()函数 sy…

最近几年,国内好多家实体企业都开始用上低代码了,它有什么好?

前言&#xff1a; 裹挟大数据、云计算、人工智能等数字技术的第四次工业革命浪潮正加速来袭&#xff0c;全球经济已行至历史的十字路口。 站上技术浪潮潮头者澎湃生长&#xff0c;错过技术浪潮者黯然败退。那么&#xff0c;对于中国的普通制造企业来说&#xff0c;如何抓住向…

【媒体广告】的现状与未来发展趋势!

媒体广告是一种重要的市场推广手段&#xff0c;随着技术的不断发展和市场环境的变化&#xff0c;媒体广告也在不断地演变和发展。本文将从以下几个方面探讨媒体广告的发展趋势。 一、数字化、数据化和智能化趋势 随着互联网和移动互联网技术的发展&#xff0c;数字化、数据化…

2.1 初探MyBatis实现简单查询

一、创建数据库与表 1、创建数据库 在Navicat里创建MySQL数据库 - testdb&#xff0c;采用utf8mb4字符集 2、创建用户表 用户表 - t_user CREATE TABLE t_user (id int(11) NOT NULL AUTO_INCREMENT,name varchar(50) DEFAULT NULL,age int(11) DEFAULT NULL,address var…

LLM-Pruner: 剪枝+少量数据+少量训练 = 高效的LLM压缩

概要 大语言模型&#xff08;LLMs, Large Language Models&#xff09;在各种任务上展现出了惊人的能力&#xff0c;这些能力很大程度上来自于模型庞大的模型规模以及海量的训练语料。为了应对这些模型部署上存在的挑战&#xff0c;许多研究者开始关注大语言模型的轻量化问题。…

华为认证 | HCIE-存储 V3.0 即将发布!

华为认证HCIE-Storage V3.0&#xff08;中文版&#xff09;预计将于2023年6月30日正式对外发布。为了帮助您做好学习、培训和考试计划&#xff0c;现进行预发布通知&#xff0c;请您关注。 01 发布概述 基于“平台生态”战略&#xff0c;围绕“云-管-端”协同的新ICT技术架构&…

5周年更新 | OpenVINO™  2023.0,让AI部署和加速更容易

时光匆匆&#xff0c;岁月荏苒&#xff0c;OpenVINO™迎来了5岁生日。5岁&#xff0c;对于OpenVINO™来说还是个很年轻的年纪&#xff0c;一如正在茁壮成长的少年&#xff0c;每天都迸发着无穷的生命力。 在这5年里&#xff0c;OpenVINO™密切关注市场需求&#xff0c;着眼未来…

JavaScript拖动元素在一个范围内移动

基于 jQuery移动范围由 div 搭建(div 模仿表格)&#xff0c;卡片的移动不允许超出该范围移动卡片会有一个淡蓝色卡片的标记出将要放置的位置有禁止放置标记的位置&#xff0c;不允许卡片放置&#xff08;会放到前一个可放置的位置&#xff09;卡片放置会覆盖单元格中的文字卡片…

TSS半导体放电管八大属性总结

​之前在写关于GDT放电管与TSS放电管之间的差异时&#xff0c;其实有谈到TSS&#xff08;固体放电管&#xff09;它拥有的一些特性&#xff0c;今天优恩小编还是想重复一下&#xff0c;希望更多小伙伴能够记住。 TSS&#xff0c;有人叫它固体放电管、也有人叫它半导体放电管&am…

智能交通车路协同系统的应用场景和发展趋势

随着城市化进程的加速和汽车保有量的增加&#xff0c;城市交通拥堵、交通事故等问题日益突出。为了解决这些问题&#xff0c;智能交通车路协同系统应运而生。智能交通车路协同系统是一种基于车载终端、路侧设备和交通管理中心等多个组成部分构成的智能交通系统&#xff0c;可以…

io之netty

写在前面 netty当前是网络io框架的事实标准&#xff0c;基于nio实现&#xff0c;框架的作者是韩国一位姓李的朋友&#xff0c;开始我们这位行李的韩国朋友开发一个io框架mina&#xff0c;但后来其离职&#xff0c;mina也就和其没有关系了&#xff0c;所以后来其改进了mina的不…

Maxcompute数据上云一致性比对

我写过很多如何去对数、如何批量对数的技术文档&#xff0c;最近项目遇到这个问题&#xff0c;我才发现在官方博客上还没有发布过这个课题的文章。这就像灯下黑&#xff0c;太长用到的知识点&#xff0c;反而没有意识到其重要性。 注&#xff1a;这里对数的场景就是指在阿里云…

docker 装机/卸载 Mysql

1、首先&#xff0c;需要安装Docker。可以使用以下命令安装&#xff1a; > yum install docker 2、安装完成后&#xff0c;启动Docker服务&#xff1a; > systemctl start docker3、CentOS7环境下的Docker使用 docker快速部署mysql数据库并初始化 docker快速部署mysq…