React的基本语法和原理

3. React条件渲染

    1. 某些情况下,姐妹的内容会根据不同的情况显示不同的内容,或者决定是否渲染某部分内容:
    • 在React中,所有的条件判断和普通的JavaScript代码一致;
    1. 常见的条件渲染的方式有哪些?
    • 方式一: 条件判断语句

      • 适合逻辑较多的情况
    • 方式二: 三元运算符

      • 适合逻辑比较简单
    • 方式三: 与运算符&&

      • 适合如果条件成立,渲染某一个组件;如果条件不成立,什么内容也不渲染
    • v-show的效果

      • 主要是控制display属性是否为none
    • 示例代码如下:

      <!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',isReady: false,friend: undefined}}render () {const  { isReady, friend } = this.state// 1.条件判断方式一: 使用if进行条件判断let showElement = nullif(isReady) {showElement = <h2>准备开始比赛吧</h2>} else {showElement = <h2>请提前做好准备!</h2>}return  (<div>{ /* 1. 方式一: 根据条件给变量赋值不同的内容 */ }<div>{ showElement }</div>{ /* 2. 方式二: 三元运算符 */ }<div>{ isReady ? <button>开始战斗!</button> : <h3> 赶紧准备 </h3> }</div>{ /* 3. 方式三: && 逻辑与运算符 */ } { /* 场景: 当某一个值, 有可能为undefined时,使用&&进行条件判断 */  }{/* 转成Boolean值时不显示的 */}<div>{ friend && <div>{ friend.name + ' ' + friend.desc }</div> }</div></div>)}}// 2. 创建root并且渲染App组件const root = ReactDOM.createRoot(document.querySelector('#root'))root.render(<App/>)</script>
      </body>
      </html>

4. React列表渲染

    1. 真实开发中会从服务器请求大量的数据,数据会以列表的形式存储:
    • 比如歌曲、歌手、排行榜列表的数据;
    • 比如商品、购物车、评论列表的数据;
    • 比如好友消息、动态、联系人列表的数据;
    1. 在React中没有像Vue模板语法中的v-for指令,而是需要通过Javascript代码的方式组织数据,转成JSX;
    • 很多从Vue转到React的非常不习惯,认为Vue的方式更贱简洁明了;
    • 但是React中的JSX正式因为和Javascript无缝的衔接,让他可以更加的灵活;
    • React是真正可以提高我们编写代码能力的一种方式;
    1. 如何展示列表
    • 在React中,展示列表最多的方式就是使用数组的map方法
    1. 很多时候在展示一个数组中的数据之前,需要先对他进行一些处理;
    • 比如过滤掉一些内容:filter函数
    • 比如截取数组中的一部分内容: slice函数
    • 示例代码如下:
      <!DOCTYPE html>
      <html lang="en">
      <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><style>.item {border: 1px solid orange;margin: 10px;padding: 0 20px;}</style>
      </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 = {students: [{ id: 111, name: 'why', score: 199 },{ id: 112, name: 'kobe', score: 98 },{ id: 113, name: 'james', score: 199  },{ id: 114, name: 'curry', score: 188 }]}}render () {const  { students } = this.state// 分数大于100的学生进行展示const filterStudents = students.filter( item => item.score > 100)// 分数大于100,只展示两个人信息// slice(start, end): [start, end)const sliceStudents = students.slice(0,2)return  (<div><h2>学生列表数据</h2><div className="list">{students.filter(item => item.score> 100).slice(0, 2).map(item => {return (<div className="item"><h2>学号:{item.id}</h2>  <h3>姓名:{item.name}</h3>  <h1>分数:{item.score}</h1>  </div>  )})}</div></div>)}}// 2. 创建root并且渲染App组件const root = ReactDOM.createRoot(document.querySelector('#root'))root.render(<App/>)</script>
      </body>
      </html>
      
    1. 列表中的key
    • 在前面的代码中只要展示列表都会有报一个警告:
      • 警告:Warning: Each child in a list should have a unique “key” prop.
      • 翻译:在一个列表中每个子元素都应该有唯一的"key"属性
      • 作用:在某些情况下(例如:插入)提高diff算法的效率
      • 警告如图:外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
      • 添加key属性后警告不提示:外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
    • 这个警告是告诉需要再列表展示的jsx中添加一个key
      • key主要的作用是为了提高diff算法的效率
      • 具体内容后续再进行写笔记

5. JSX的本质

    1. 实际上,jsx仅仅只是React.createElement(component, props, …children)函数的语法糖;
    • 所有的jsx最终都会被转换成React.createElement的函数调用。
    1. createElement需要传递三个参数:
    • 参数一:type
      • 当前ReactElement的类型
      • 如果是标签元素,那么就使用字符串表示
      • 如果是组件元素,那么就直接使用组件的名称
    • 参数二:config
      • 所有jsx中的属性都在config中以对象的属性和值的形式存储
      • 比如传入className作为元素的class;
    • 参数三: children
      • 存放在标签中的内容,以children数组的方式进行存储;
      • 当然,如果是多个元素呢? React内部有对他们进行处理,处理的源码在下放
        外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
    1. babel官网查看
    • 默认jsx是通过babel帮我进行语法转换的,所以之前写的jsx代码都需要依赖babel。
    • 可以子啊babel的官网中快速查看转换的过程:https://babeljs.io/repl#?browsers=react
      外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
    1. 自己编写React.createElement代码:
    • 没有通过jsx来书写,姐妹依然是可以正常的渲染;
    • 另外,在这样的情况下,不需要babel相关的依赖
      • 所以,type="text/babel"可以删掉
      • 所以,可以删除掉了;
      • React.createElement代码如下:
          React.createElement("div",null,
      
    /#PURE/ React.createElement(
    “div”,
    {
    className: “header”
    },
    “Header”
    ),
    /#PURE/ React.createElement(
    “div”,
    {
    className: “Content”
    },
    /#PURE/ React.createElement(“div”, null, “Banner”),
    /#PURE/ React.createElement(
    “ul”,
    null,
    /#PURE/ React.createElement(
    “li”,
    null,
    “\u5217\u8868\u6570\u636E1”
    ),
    /#PURE/ React.createElement(
    “li”,
    null,
    “\u5217\u8868\u6570\u636E2”
    ),
    /#PURE/ React.createElement(
    “li”,
    null,
    “\u5217\u8868\u6570\u636E3”
    ),
    /#PURE/ React.createElement(
    “li”,
    null,
    “\u5217\u8868\u6570\u636E4”
    ),
    /#PURE/ React.createElement(“li”, null, “\u5217\u8868\u6570\u636E5”)
    )
    ),
    /#PURE/ React.createElement(
    “div”,
    {
    className: “footer”
    },
    “Footer”
    )
    );

6. 虚拟DOM创建的过程

    1. 通过React.createElement做种创建出来一个ReactElement对象;
    • return ReactElement(type, key, ref, self, source, ReactCurrentOwner.current, props);
    1. 这个ReactElement对象是什么作用? React为什么要创建它
    • 原因是React利用ReactElement对象组成了一个Javascript的对象树
    • Javascript的对象树就是虚拟DOM(Virtual DOM)
    1. 如何查看ReactElement对象
    • 可以将之前的jsx返回结果进行打印;
    • 注意下面代码中jsx的打印;
      外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
      外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
      外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
    1. 而ReactElement最终形成的树结构就是Virtual DOM;
    1. jsx -> 虚拟DOM -> 真实DOM
    • 编写相应的jsx代码,jsx代码转换完之后会变成对应的React.createElement()这样的一个函数调用,当函数执行完之后,会形成ReactElement对象;
      并且这个对象也会有嵌套,有自己的children, 它也会形成一个嵌套,形成嵌套的话它就形成就是一个虚拟DOM,而虚拟DOM的话再经过渲染最后就变成真实的DOM;
    • jsx代码 -> ReactElement对象 -> 真实DOM
    • div -> React.createElement('div', null, {}) -> ReactElement对象 -> 虚拟DOM -> 真实DOM
    • jsx代码外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
    • ReactElement对象外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
    • 真实DOM外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
    • 类比Vue:是template解析 -> render函数 -> h函数 -> vnode -> 虚拟dom -> 真实dom
    • 类比Vue解析,Vue解析时没有React直观的,Vue结项相对来说麻烦一点,有各种指令
    1. 虚拟DOM的作用:
      1. 在更新数据时,没有必要重新把整个一段代码给重新渲染,只需要更新数据,然后重新渲染对应的数据即可
      • 例如:当依赖一个数据message, 当message数据改变时,会重新调用render函数,一旦调用render函数就会形成一个新的结构, 重新执行时会在次调用createElement,就会形成一个新的虚拟DOM结构,然后还有一个旧的虚拟DOM结构,会在新旧虚拟DOM之间做一个diff算法,比较新旧虚拟DOM之间的不同,如果只是数据发生改变时,只需要更新数据就可以了。
      • 总结:可以在更新的时候进行diff算法,然后决定更新那里(可以在js对象里面快速进行diff算法来决定哪些东西更新,那些东西不更新)
      1. 跨平台,可以做跨平台应用程序
      1. 虚拟DOM帮助我们从命令式编程转到了声明式编程的模式;
  • 声明式编程

      1. 虚拟DOM帮助我们从命令式编程转到了声明式编程的模式;
      1. React官方的说法:Virtual DOM 是一种编程理念
      • 在这个理念中,UI以一种理想化或者虚拟化的方式保存在内存中,并且它是一个相对简单的Javascript对象;
      • 可以通过root.render()让虚拟DOM和真实ODM同步起来,这个过程叫做协调(Reconciliation)
      • 协调:div -> ReactElement对象 -> 虚拟DOM -> 真实DOM
      1. 这种编程方式赋予React声明式的API:
      • 只需要告诉React希望让UI是什么状态;
      • React来确保DOM和这些状态是匹配的;
      • 不需要直接进行DOM操作,就可以从手动更改DOM、属性操作、事件处理中解放出来;

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

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

相关文章

如何在 Gradle 项目中添加依赖?(以添加 AndroidX 版本的 RecyclerView 为例)

1. 确保项目已启用 AndroidX RecyclerView 的现代版本属于 AndroidX 库&#xff0c;需确保项目已启用 AndroidX&#xff1a; 在 gradle.properties 中应有以下配置&#xff08;通常新建项目默认开启&#xff09;&#xff1a;android.useAndroidXtrue android.enableJetifiert…

深度学习与图像处理 | 基于PaddlePaddle的梯度下降算法实现(线性回归投资预测)

演示基于PaddlePaddle自动求导技术实现梯度下降&#xff0c;简化求解过程。01、梯度下降法梯度下降法是机器学习领域非常重要和具有代表性的算法&#xff0c;它通过迭代计算来逐步寻找目标函数极小值。既然是一种迭代计算方法&#xff0c;那么最重要的就是往哪个方向迭代&#…

负载均衡集群HAproxy

HAProxy 简介HAProxy 是一款高性能的负载均衡器和代理服务器&#xff0c;支持 TCP 和 HTTP 应用。广泛用于高可用性集群&#xff0c;能够有效分发流量到多个后端服务器&#xff0c;确保服务的稳定性和可扩展性。HAProxy 核心功能负载均衡&#xff1a;支持轮询&#xff08;round…

重生之我在10天内卷赢C++ - DAY 1

坐稳了&#xff0c;我们的C重生之旅现在正式发车&#xff01;请系好安全带&#xff0c;前方高能&#xff0c;但绝对有趣&#xff01;&#x1f680; 重生之我在10天内卷赢C - DAY 1导师寄语&#xff1a;嘿&#xff0c;未来的编程大神&#xff01;欢迎来到C的世界。我知道&#x…

[mind-elixir]Mind-Elixir 的交互增强:单击、双击与鼠标 Hover 功能实现

[mind-elixir]Mind-Elixir 的交互增强&#xff1a;单击、双击与鼠标 Hover 功能实现 功能简述 通过防抖&#xff0c;实现单击双击区分通过mousemove事件&#xff0c;实现hover效果 实现思路 &#xff08;一&#xff09;单击与双击事件 功能描述 单击节点时&#xff0c;可以触发…

c++-迭代器类别仿函数常用算法函数

C常用算法函数 1. 前置知识 1.1 迭代器的类别 C中&#xff0c;迭代器是 STL 容器库的核心组件之一&#xff0c;具有举足轻重的作用&#xff0c;它提供了一种 统一的方式来访问和遍历容器&#xff0c;而无需关心底层数据结构的具体实现。迭代器类似指针&#xff0c;但比指针更通…

Python深度学习框架TensorFlow与Keras的实践探索

基础概念与安装配置 TensorFlow核心架构解析 TensorFlow是由Google Brain团队开发的开源深度学习框架&#xff0c;其核心架构包含数据流图&#xff08;Data Flow Graph&#xff09;和张量计算系统。数据流图通过节点表示运算操作&#xff08;如卷积、激活函数&#xff09;&…

c# net6.0+ 安装中文智能提示

https://github.com/stratosblue/IntelliSenseLocalizer 1、安装tool dotnet tool install -g islocalizer 2、 安装IntelliSense 文件&#xff0c;安装其他net版本修改下版本号 安装中文net6.0采集包 islocalizer install auto -m net6.0 -l zh-cn 安装中英文双语net6.0采集包…

【建模与仿真】二阶邻居节点信息驱动的节点重要性排序算法

导读&#xff1a; 在复杂网络中&#xff0c;挖掘重要节点对精准推荐、交通管控、谣言控制和疾病遏制等应用至关重要。为此&#xff0c;本文提出一种局部信息驱动的节点重要性排序算法Leaky Noisy Integrate-and-Fire (LNIF)。该算法通过获取节点的二阶邻居信息计算节点重要性&…

指令微调Qwen3实现文本分类任务

参考文档&#xff1a; SwanLab入门深度学习&#xff1a;Qwen3大模型指令微调 - 肖祥 - 博客园 vLLM&#xff1a;让大语言模型推理更高效的新一代引擎 —— 原理详解一_vllm 原理-CSDN博客 概述 为了实现对100个标签的多标签文本分类任务&#xff0c;前期调用gpt-4o进行prom…

【机器学习-3】 | 决策树与鸢尾花分类实践篇

0 序言 本文将深入探讨决策树算法&#xff0c;先回顾下前边的知识&#xff0c;从其基本概念、构建过程讲起&#xff0c;带你理解信息熵、信息增益等核心要点。 接着在引入新知识点&#xff0c;介绍Scikit - learn 库中决策树的实现与应用&#xff0c;再通过一个具体项目的方式来…

【数字投影】折幕影院都是沉浸式吗?

折幕影院作为一种现代化的展示形式&#xff0c;其核心特点在于通过多块屏幕拼接和投影融合技术&#xff0c;打造更具包围感的视觉体验。折幕影院设计通常采用多折幕结构&#xff0c;如三折幕、五折幕等&#xff0c;利用多台投影机的协同工作&#xff0c;呈现无缝衔接的超大画面…

数据结构——图(三、图的 广度/深度 优先搜索)

一、广度优先搜索(BFS)①找到与一个顶点相邻的所有顶点 ②标记哪些顶点被访问过 ③需要一个辅助队列#define MaxVertexNum 100 bool visited[MaxVertexNum]; //访问标记数组 void BFSTraverse(Graph G){ //对图进行广度优先遍历&#xff0c;处理非连通图的函数 for(int i0;i…

直击WAIC | 百度袁佛玉:加速具身智能技术及产品研发,助力场景应用多样化落地

7月26日&#xff0c;2025世界人工智能大会暨人工智能全球治理高级别会议&#xff08;WAIC&#xff09;在上海开幕。同期&#xff0c;由国家地方共建人形机器人创新中心&#xff08;以下简称“国地中心”&#xff09;与中国电子学会联合承办&#xff0c;百度智能云、中国联通上海…

2025年人形机器人动捕技术研讨会将在本周四召开

2025年7月31日爱迪斯通所主办的【2025人形机器动作捕捉技术研讨会】是携手北京天树探界公司线下活动结合线上直播的形式&#xff0c;会议将聚焦在“动作捕捉软硬件协同&#xff0c;加速人形机器人训练”&#xff0c;将深度讲解多项核心技术&#xff0c;包含全球知名的惯性动捕大…

Apple基础(Xcode①-项目结构解析)

要运行设备之前先选择好设备Product---->Destination---->选择设备首次运行手机提示如出现 “未受信任的企业级开发者” → 手机打开 设置 ▸ 通用 ▸ VPN与设备管理 → 信任你的 Apple ID 即可ContentView 是 SwiftUI 项目里 最顶层、最主界面 的那个“页面”&#xff0…

微服务 02

一、网关路由网关就是网络的关口。数据在网络间传输&#xff0c;从一个网络传输到另一网络时就需要经过网关来做数据的路由和转发以及数据安全的校验。路由是网关的核心功能之一&#xff0c;决定如何将客户端请求映射到后端服务。1、快速入门创建新模块&#xff0c;引入网关依赖…

04动手学深度学习笔记(上)

04数据操作 import torch(1)张量表示一个数据组成的数组&#xff0c;这个数组可能有多个维度。 xtorch.arange(12) xtensor([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])(2)通过shape来访问张量的形状和张量中元素的总数 x.shapetorch.Size([12])(3)number of elements表…

MCU中的RTC(Real-Time Clock,实时时钟)是什么?

MCU中的RTC(Real-Time Clock,实时时钟)是什么? 在MCU(微控制器单元)中,RTC(Real-Time Clock,实时时钟) 是一个独立计时模块,用于在系统断电或低功耗状态下持续记录时间和日期。以下是关于RTC的详细说明: 1. RTC的核心功能 精准计时:提供年、月、日、时、分、秒、…

Linux 进程调度管理

进程调度器可粗略分为两类&#xff1a;实时调度器(kernel)&#xff0c;系统中重要的进程由实时调度器调度&#xff0c;获得CPU能力强。非实时调度器(user)&#xff0c;系统中大部分进程由非实时调度器调度&#xff0c;获得CPU能力弱。实时调度器实时调度器支持的调度策略&#…