1. 组件化封装的结构

  • 1.1. 定义一个类(组件名必须是大写,小写会被认为是html元素), 继续自React.Component
  • 1.2. 实现当前组件的render函数
    • render当中返回的jsx内容,就是之后React会帮助我们渲染的内容
  • 1.3. 结构图如下:
      data 方法render() // 具体渲染的内容
    

2. 组件化-数据依赖

组件化问题:数据在那里定义

  • 2.1. 在组件中的数据,可以分成两类:
    • 参与界面更新的数据:当数据变化时,需要更新组件渲染的内容
    • 不参与界面更新的数据:当数据变化时,不需要更新组件渲染的内容
  • 2.2. 参与姐妹更新的数据又称为参与数据流,这个数据定义在当前对象的state
    • 在构造函数中this.state = { 定义的数据 }
    • 当数据发生变化时,可以调用this.setState({更新的数据})来更新数据,并且通知React进行update操作
      • 在进行update操作时,就会重新调用render函数,并且使用最新的数据,来渲染界面。

3. 组件化-事件绑定

  • 3.1. 组件化问题二: ·事件绑定中的this·
    • 类中直接定义一个函数,并且将这个函数绑定到元素的onClick事件上,当前这个函数的this指向是undefined
  • 3.2. 默认情况下是undefined:(因为在babel转化成严格模式或者ES6语法中类是严格模式严格模式下,this指向undefined)
    • 很奇怪,居然是undefined
    • 因为在正常的DOM操作中,监听点击,监听函数中的this指向其实节点对象(比如说button对象)
    • 这次因为React并不是直接渲染成真实的DOM编写的button只是一个语法糖,它的本质是React的Element对象
    • 那么在这里发生监听时,react在执行函数时并没有绑定this, 默认情况下就是一个undefined
  • 3.3. 在绑定的函数中,可能想要使用当前对象,比如执行this.setState函数,就必须拿到当前对象的this
    • 就需要在传入函数时,给这个函数绑定this
    • 类似于
      constructor(props) {super()this.state = {message: 'hello World'}// 对需要绑定的方法,提前绑定好thisthis.btnClick = this.btnClick.bind(this)}{/* 写法一:bind(this) */}{/* <button onClick={this.btnClick.bind(this)}>修改文本</button> */}{/* 写法二:统一在构造函数中绑定this, 函数调用的时候不用bind(this) */} <button onClick={this.btnClick}>修改文本</button>
      

4. React数据事件处理

  • 4.1. 如果原生DOM有一个监听事件,我们可以如何操作
    • 方式一:获取DOM原生,添加监听事件
    • 方式二:在HTML原生中,直接绑定onclick;
  • 4.2. 在React中是如何操作呢?React的事件监听,主要有两点不同:
    • React事件的命名采用小驼峰式(camelCase), 而不是纯小写
    • 需要通过{}传入一个事件处理函数,这个函数会在事件发生时被执行;

5. React组件的分类重构代码

  • 5.1. 组件分为:类组件和函数组件
    • 类组件: class App extends React.Component

      •       class App extends React.Component {constructor () {super()this.state = {message: 'hello world',counter: 100}}render () {const  { message } = this.statereturn  (<div><h2>{ message }</h2></div>)}}```
    • 函数组件:

      •   function App() {return (<div className="App"><header className="App-header"><img src={logo} className="App-logo" alt="logo" /><p>Edit <code>src/App.js</code> and save to reload.</p><aclassName="App-link"href="https://reactjs.org"target="_blank"rel="noopener noreferrer">Learn React</a></header></div>);}export default App;  
        

5. 编写Hello_React案例

  • 5.1. 第一步:在界面上通过React显示一个Hello World
    • 注意:编写React的script代码中,必须添加type="text/babel", 作用是可以让babel解析jsx的语法
    • 完整代码如下:
      <script type="text/babel">const root = ReactDOM.createRoot(document.querySelector('#root'))// 将文本定义成变量let message = 'hello World'const root = ReactDOM.createRoot(document.querySelector('#root'))root.render(<h2>{message}/h2>)</script>
    
    • 5.2. ReactDOM.createRoot函数:用于创建一个React根,之后的渲染的内容会包含在这个根中。

      • 参数:将渲染的内容,挂载到哪个HTML元素上
        • 根元素id为root的元素
    • 5.3. root.render()

      • 参数:要渲染的根组件
    • 5.4. 完整代码:

        <!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title></head><body><div id="root"></div><!-- 1. CDN引入 --><script crossorigin src="https://unpkg.com/react@18/umd/react.development.js"></script><script crossorigin src="https://unpkg.com/react-dom@18/umd/react-dom.development.js"></script><script src="https://unpkg.com/babel-standalone@6/babel.min.js"></script><!-- 2. 编写React代码 --><script type="text/babel">const root = ReactDOM.createRoot(document.querySelector('#root'))// 将文本定义成变量let message = 'hello World'// 监听按钮的点击function btnClick () {  // 1.1 修改数据message = '你好啊 李银河'// 1.2. 重新渲染界面(原因:React默认情况下不会重新执行渲染界面的, React是没有黑魔法的,黑魔法:所有东西都是可见的)rootRender()}// 3. 封装一个渲染函数function rootRender () {// 使用()把所有的html括号包裹起来,代表的是一个整体root.render((<div><h1>{message}</h1><button onClick={btnClick}>修改文本</button>  </div>))}rootRender()</script></body></html>
      

6. 使用组件重构代码

  • 6.1 完整代码如下:
  •   <!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title></head><body><div id="root"></div><script src="../lib/react.js"></script><script src="../lib/react-dom.js"></script><script src="../lib/babel.js"></script><script type="text/babel">// 1.定义App根组件class App extends React.Component {constructor () {super()this.state = {message: 'hello world',counter: 100}}render () {const  { message } = this.statereturn  (<div><h2>{ message }</h2></div>)}}// 2. 创建root并且渲染App组件const root = ReactDOM.createRoot(document.querySelector('#root'))root.render(<App/>)</script></body></html>  
    

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

嵌入式仿真教学的革新力量:深圳航天科技创新研究院引领高效学习新时代

嵌入式系统作为现代信息技术的核心基石&#xff0c;已深度融入工业控制、物联网、智能终端等关键领域。高校肩负着培养嵌入式技术人才的重任&#xff0c;但传统教学方式正面临严峻挑战&#xff1a;硬件实验设备投入巨大、更新滞后、维护繁琐、时空限制严格&#xff0c;难以满足…

六、Linux核心服务与包管理

作者&#xff1a;IvanCodes 日期&#xff1a;2025年8月3日 专栏&#xff1a;Linux教程 要保证一个Linux系统稳定、安全、功能完备&#xff0c;有效管理其后台服务和软件包是至关重要的。本文将深入介绍现代Linux系统中四个核心的管理工具&#xff1a;systemctl (服务管理)&…

【数据结构】哈希表实现

目录 1. 哈希概念 2 哈希冲突和哈希函数 3. 负载因子 4. 将关键字转为整数 5. 哈希函数 5.1直接定址法 5.2 除法散列法/除留余数法 5.3 乘法散列法&#xff08;了解&#xff09; 5.4 全域散列法&#xff08;了解&#xff09; 5.5 其他方法&#xff08;了解&#xff09…

PostgreSQL面试题及详细答案120道(21-40)

《前后端面试题》专栏集合了前后端各个知识模块的面试题&#xff0c;包括html&#xff0c;javascript&#xff0c;css&#xff0c;vue&#xff0c;react&#xff0c;java&#xff0c;Openlayers&#xff0c;leaflet&#xff0c;cesium&#xff0c;mapboxGL&#xff0c;threejs&…

数据建模及基本数据分析

目录 &#xff08;一&#xff09;数据建模 1.以数据预测为核心的建模 2.以数据聚类为核心的建模 &#xff08;二&#xff09;基本数据分析 1.Numpy 2. Pandas 3.实例 4.Matplotlib 资料自取&#xff1a; 链接: https://pan.baidu.com/s/1PROmz-2hR3VCTd6Eei6lFQ?pwdy8…

电动汽车DCDC转换器的用途及工作原理

在电动汽车的电气架构中&#xff0c;DCDC转换器&#xff08;直流-直流转换器&#xff09;是一个至关重要的部件&#xff0c;负责协调高压动力电池&#xff08;通常300V~800V&#xff09;与低压电气系统&#xff08;12V/24V&#xff09;之间的能量流动。它的性能直接影响整车的能…

PyTorch 应用于3D 点云数据处理汇总和点云配准示例演示

PyTorch 已广泛应用于 3D 点云数据处理&#xff0c;特别是在深度学习驱动的任务中如&#xff1a; 分类、分割、配准、重建、姿态估计、SLAM、目标检测 等。 传统 3D 点云处理以 PCL、Open3D 为主&#xff0c;深度学习方法中&#xff0c;PyTorch 是构建神经网络处理点云的核心框…

ABP VNext + Quartz.NET vs Hangfire:灵活调度与任务管理

ABP VNext Quartz.NET vs Hangfire&#xff1a;灵活调度与任务管理 &#x1f680; &#x1f4da; 目录ABP VNext Quartz.NET vs Hangfire&#xff1a;灵活调度与任务管理 &#x1f680;✨ TL;DR&#x1f6e0; 环境与依赖&#x1f527; Quartz.NET 在 ABP 中接入1. 安装与模块…

[硬件电路-148]:数字电路 - 什么是CMOS电平、TTL电平?还有哪些其他电平标准?发展历史?

1. CMOS电平定义&#xff1a; CMOS&#xff08;Complementary Metal-Oxide-Semiconductor&#xff09;电平基于互补金属氧化物半导体工艺&#xff0c;由PMOS和NMOS晶体管组成。其核心特点是低功耗、高抗干扰性和宽电源电压范围&#xff08;通常为3V~18V&#xff09;。关键参数&…

0基礎網站開發技術教學(二) --(前端篇 2)--

書接上回說到的前端3種主語言以及其用法&#xff0c;這期我們再來探討一下javascript的一些編碼技術。 一) 自定義函數 假如你要使用一個功能&#xff0c;正常來說直接敲出來便可。可如果這個功能你要用不止一次呢?難道你每次都敲出來嗎?這個時侯&#xff0c;就要用到我們的自…

前端 拼多多4399笔试题目

拼多多 3 选择题 opacity|visibity|display区别 在CSS中&#xff0c;opacity: 0 和 visibility: hidden 都可以让元素不可见&#xff0c;但它们的行为不同&#xff1a; ✅ opacity: 0&#xff08;透明度为0&#xff09; 元素仍然占据空间&#xff08;不移除文档流&#xff0…

数琨创享:全球汽车高端制造企业 QMS质量管理平台案例

01.行业领军者的质量升级使命在全球汽车产业链加速升级的浪潮中&#xff0c;质量管控能力已成为企业核心竞争力的关键。作为工信部认证的制造业单项冠军示范企业&#xff0c;万向集团始终以“全球制造、全球市场、做行业领跑者”为战略愿景。面对奔驰、宝马、大众等“9N”高端客…

GaussDB 约束的使用举例

1 not null 约束not null 约束强制列不接受 null 值。not null 约束强制字段始终包含值。这意味着&#xff0c;如果不向字段添加值&#xff0c;就无法插入新记录或者更新记录。GaussDB使用pg_get_tabledef()函数获取customers表结构&#xff0c;如&#xff1a;csdn> set sea…

自动驾驶中的传感器技术13——Camera(4)

1、自驾Camera开发的方案是否归一化对于OEM&#xff0c;或者自驾方案商如Mobileye如果进行Camera的开发&#xff0c;一般建议采用Tesla的系统化最优方案&#xff0c;所有Camera统一某个或者某两个MP设计&#xff08;增加CIS议价权&#xff0c;减少Camera PCBA的设计维护数量&am…

开源利器:glTF Compressor——高效优化3D模型的终极工具

在3D图形开发领域,glTF(GL Transmission Format)已成为Web和移动端3D内容的通用标准。然而,3D模型的文件体积和纹理质量往往面临权衡难题。Shopify最新开源的glTF Compressor工具,为开发者提供了一套精细化、自动化的解决方案,让3D模型优化既高效又精准。本文将深入解析这…

LeetCode Hot 100,快速学习,不断更

工作做多了有时候需要回归本心&#xff0c;认真刷题记忆一下算法。那就用我这练习时长两年半的代码农民工来尝试着快速解析LeetCode 100吧 快速解析 哈希 1. 两数之和 - 力扣&#xff08;LeetCode&#xff09; 这题很简单啊&#xff0c;思路也很多 1. 暴力搜索&#xff0c;…

MySQL的子查询:

目录 子查询的相关概念&#xff1a; 子查询的分类&#xff1a; 角度1&#xff1a; 单行子查询&#xff1a; 单行比较操作符&#xff1a; 子查询的空值情况&#xff1a; 多行子查询&#xff1a; 多行比较操作符&#xff1a; ANY和ALL的区别&#xff1a; 子查询为空值的…

Python批处理深度解析:构建高效大规模数据处理系统

引言&#xff1a;批处理的现代价值在大数据时代&#xff0c;批处理&#xff08;Batch Processing&#xff09; 作为数据处理的核心范式&#xff0c;正经历着复兴。尽管实时流处理备受关注&#xff0c;但批处理在数据仓库构建、历史数据分析、报表生成等场景中仍不可替代。Pytho…

是德科技的BenchVue和纳米软件的ATECLOUD有哪些区别?

是德科技的BenchVue和纳米软件的ATECLOUD虽然都是针对仪器仪表测试的软件&#xff0c;但是在功能设计、测试场景、技术架构等方面有着明显的差异。BenchVue&#xff08;是德科技&#xff09;由全球领先的测试测量设备供应商开发&#xff0c;专注于高端仪器控制与数据分析&#…

线上redis的使用

一.String1.缓存玩家单个数据&#xff0c;但是我觉得还是用hash好2.结合过期时间&#xff0c;比如:某个东西结算了&#xff0c;redis记录一下&#xff0c;并设置过期时间3.分布式锁二.Hash1.缓存一个单位的数据&#xff0c;比如&#xff1a;联盟信息2.被封禁的列表&#xff0c;…