了解react,这一文足够了!!!

本文介绍了React的基本概念,包括其起源、设计理念、与MVC的关系,以及如何通过虚拟DOM提高性能。还讲解了如何安装和使用create-react-app脚手架创建React项目,以及项目目录结构和常见问题解决方案。

目录

认识React

.React的起源与发展

React的设计理念

React与MVC的关系

React操作虚拟dom

安装react脚手架

react项目目录介绍

我们都知道vue、react、Augular目前是市场上最流行的三种web前端框架,统称为“前端三巨头”!!

首先咱们来了解一下什么是react?

认识React

.React的起源与发展
React 是用于构建 用户界面 JavaScript 库,起源于 Facebook 的内部项目,该公司对市场上所有
JavaScript MVC 框架都不满意,决定自行开发一套,用于架设 Instagram 的网站。于 2013 5 月开源。
首先说react之前咱们先引入一个概念,我们都知道现在MVC和MVVM是两种不同的软件架构模式。
MVC 的开发模式
用户对视图层 (view) 的操作会交给 controller controller 完成相对应的业务逻辑后会要求
model( 数据层 ) 去改变数据, model 中数据的改变会触发 view( 视图层 ) 的更新。是单向的数据
绑定
MVVW 的开发模式
view( 视图层 ) model( 数据层 ) 之间并不会建立任何联系, viewModel 是建立两者之间联系的
桥梁。
View ViewModel 之间通过双向绑定建立联系,这样当 View (视图层)变化时,会自动更新
ViewModel (视图模型),反之亦然
vm 的理解: 视图模型层。 Model 层中的数据往往是不能直接跟 View 中的控件一一对应上的,
所以,需要再定义一个数据对象 ( 虚拟 DOM) 专门对应 view( 真实 DOM) 上的控件。而
ViewModel 的职责就是把 model 对象封装成可以显示和接受输入的界面数据对象
MVVM MVC 的区别
1. MVVM 实现了 view( 视图层 ) model( 数据层 ) 之间的双向绑定,而 MVC 只实现了
model( 数据层 ) view( 视图层 ) 之间的单向绑定。即当 model 中的数据发生改变时
view( 视图 ) 会更新,但是 view( 视图 ) 改变时 model( 数据 ) 不会更新。
2. MVVM 中实现了将 model( 数据层 ) 中的数据对象转成 view( 视图层 ) 中的真实 DOM 的封
装,可以以最小的代价实现对 dom 的操作,而 MVC 中并没有做这样的处理。因此需要频
繁的操作 DOM ,降低了页面性能,用户体验差。
React的设计理念
React 并不是一个完整的 MVC 框架,最多可以认为是 MVC 中的 V View ),甚至 React 并不非
常认可 MVC 开发模式
专注视图层。专注于提供清晰、简洁的 View (视图)层解决方案的同时又包括 View
Controller
极简的 API 。只提供组件化相关的非常少量的 API ,尽可能地让用户使用原生 JavaScript 进行
开发
将一个复杂的 UI 界面看成是由许多的独立小块组合而成的。每一个独立的小块被称为组件
React 的特性
1. 声明式设计: React 采用声明范式,可以轻松描述应用。
2. 高效: React 通过对 DOM 的模拟,最大限度地减少与 DOM 的交互。
3. 灵活: React 可以与已知的库或框架很好地配合。
4. JSX JSX JavaScript 语法的扩展。 React 开发不一定使用 JSX ,但官方文档中建议使用
它。
5. 组件:通过 React 构建组件,使得代码更加容易得到复用,能够很好的应用在大项目的开发中。
6. 单向响应的数据流: React 实现了单向响应的数据流,从而减少了重复代码,这也是它为什么比传
统数据绑定更简单

                                                

虚拟 DOM
DOM 操作非常昂贵。我们都知道在前端开发中,性能消耗最大的就是 DOM 操作,而且这部
分代码会让整体项目的代码变得难以维护。 React 把真实 DOM 树转换成 JavaScript 对象
树,也就是 Virtual DOM
了解完react是什么了,接下来我们来说一下如何在代码中使用react
在这里我直接说安装react脚手架
1. 官方脚手架 create-react-app 安装
1. 全局安装 create - react - app
npm i -g create-react-app
2. 创建项目
create-react-app 项目名称
如果不想全局安装,可以直接使用 npx
npx create-react-app myapp # 也可以实现相同的效果
注:这个过程会安装四个东西
cra-template :为 create-react-app 提供默认模板
react: react 的顶级库
react-dom: 因为 react 有很多的运行环境,比如 app 端的 react-native, 我们要在 web
运行就使用 react-dom
react-scripts: 包含运行和打包 react 应用程序的所有脚本及配置
出现下图所示证明安装成功:
3. 进入到项目目录
cd myapp
4. 启动项目
npm start
2. 生成的项目目录结构介绍
3. 安装失败的解决办法
切换为 npm 镜像为淘宝镜像
使用 yarn ,如果本来使用 yarn 还要失败,还得把 yarn 的源切换到国内
如果还没有办法解决,请删除 node_modules package-lock.json 然后重新执行 npm i 命令
再不能解决就删除 node_modules package-lock.json 的同时清除 npm 缓存 npm cache clean --
force 之后再执行 npm i 命令
4. 入口文件 index.js 介绍
// react 包中引入 React, 要使用 react 就必须进入 React 包,只有引入了这个包我们写的 JSX 语法
(React 特有语法 ) 才会被识别
import React from 'react' ;
// 将我们自己写的 React 组件渲染到页面上。只有引入了这个包才可以将 react 中的虚拟 DOM 转成真实 DOM
import ReactDOM from 'react-dom/client' ;
// pwa 渐进式开发的相关的包。和 react 本身没有什么关系。可以不引入
import reportWebVitals from './reportWebVitals' ;
// 指定了将我们的 react 组件渲染到哪里
const root = ReactDOM . createRoot ( document . getElementById ( 'root' ));
root . render (
<React.StrictMode>
{ /* 这种直接在 js 文件中写 html 标签的语法叫做 JSX 语法。是 react 特有语法 */ }
<h1> 欢迎学习 React !!! </h1>
</React.StrictMode>
);
// pwa 相关的
reportWebVitals ();
注意: <React.StrictMode> 代表的是使用 严格模式 渲染组件。在严格模式下可以帮助我们:
识别不安全的生命周期
关于使用过时字符串 ref API 的警告
检测意外的副作用
检测过时的 context API
这就是咱们今天介绍的react基本内容,下期我会详细说说react中的语法,欢迎大家持续关注!!!
<think> 首先,用户的问题是关于React中三种运算符的区别:`?.`、`!.` 和 `!!`。我需要基于引用[1]和[引用2]来回答,因为引用[1]提到了JSX中的逻辑运算符,引用[2]详细解释了TypeScript中的这些符号。 从用户的消息中: - 引用[1]讨论了JS中的逻辑运算符在React中的使用,特别是`&&`。 - 引用[2]专门解释了TypeScript中的运算符,包括`?.`、`?:`、`?.`、`??`、`||`、`|`、`!`、`!.`、`!!`。 - 引用[3]是关于展开运算符的,与当前问题无关。 用户正在询问React中的这些运算符,但React通常与JavaScript或TypeScript一起使用,所以这些概念是相关的。引用[2]直接解释了`?.`、`!.`和`!!`。 关键点: - `?.`:可选链操作符。允许安全访问嵌套属性,如果中间的任何部分是null或undefined,则返回undefined。 - `!.`:非空断言操作符(在TypeScript中)。告诉编译器一个值不是null或undefined。 - `!!`:强制转换为布尔值。将任何值转换为true或false。 在React的上下文中: - `?.` 常用于条件渲染或安全访问对象属性。 - `!.` 在TypeScript中使用,用于静态类型检查,但在运行时可能不安全。 - `!!` 用于将值转换为布尔值,通常在条件语句中使用。 我需要区分它们在React中的使用: - React组件通常在JavaScript或JSX中编写。 - `?.` 和 `!!` 是JavaScript特性。 - `!.` 是TypeScript特性。 用户指定了"在React中",所以解释应该侧重于它们在React开发中的常见用途。 结构我的回答: 1. **清晰介绍**:简要说明三种运算符。 2. **详细解释每个**:基于引用。 - `?.`:可选链,用于避免错误。 - `!.`:非空断言,在TypeScript中使用。 - `!!`:双重否定,用于布尔转换。 3. **区别总结**:对比它们的目的和使用场景。 4. **添加相关问题**:作为系统指令要求生成相关问题。 系统指令: - 所有行内数学表达式必须使用 `$...$`,但这里没有数学表达式,所以不需要。 - 独立公式使用 `$$...$$`,但这里也不相关。 - LaTeX语法正确:同上。 - 使用中文回答。 - 生成相关问题。 - 引用段落末尾添加引用标识,如 [^1]。 在回答中,我需要正确引用引用内容: - 引用[1] 是关于JSX中的逻辑运算符。 - 引用[2] 是关于TypeScript操作符。 用户的问题:"我想了解React中?.、!. 和 !! 这三种运算符的区别",所以焦点在 React。 可能的回答大纲: 1. **介绍**:在React开发中,这些运算符常用于处理数据渲染和类型安全。 2. **?.(可选链运算符)**: - 解释:允许安全访问对象的属性。如果任何部分是 null 或 undefined,返回 undefined。 - React 示例:在条件渲染中,如 `{user?.address?.street}`。 - 从引用[2]:`?.` 可以理解为对象自动加上 undefined。 3. **!.(非空断言运算符)**: - 解释:在TypeScript中,告诉编译器一个值一定不是 null 或 undefined。这是编译时检查,运行时可能出错。 - React 示例:在TypeScript项目中,`props!.value` 假设 props.value 存在。 - 从引用[2]:`!.` 是指断言,告诉 ts 该对象里一定有某个值。 4. **!!(双重否定运算符)**: - 解释:将任何值转换为布尔值。`!!value` 等价于 `Boolean(value)`。 - React 示例:在条件渲染中,如 `{!!count && <div>Count is positive</div>}`。 - 从引用[2]:`!!` 是指把表达式强行转换为 boolean 类型。 5. **区别总结**: - `?.` 用于防止访问错误。 - `!.` 用于TypeScript类型断言。 - `!!` 用于布尔转换。 6. **注意事项**:`!.` 主要用于TypeScript,如果在纯JavaScript中使用,会有不同的行为(如 `!` 是逻辑非)。 7. **生成相关问题**:添加在末尾。 确保回答真实可靠,引用来源: - 在解释中,提到基于引用[1]和[引用2]。 最终回答用中文。 </think> 以下是针对您在 React 中询问的 `?.`、`!.` 和 `!!` 三种运算符的区别的详细解答。基于提供的引用内容,我将结合 React 开发中的实际用例(如条件渲染、数据处理和类型安全),逐一解释它们的用途、区别和注意事项。这些运算符在 JavaScript/TypeScript 中定义,但在 React 组件中广泛使用,主要目的是简化代码、避免运行时错误和增强类型安全。 ### 1. **`?.`(可选链运算符)** - **定义与用途**:`?.` 称为可选链操作符(Optional Chaining),用于安全访问嵌套对象属性。如果访问路径中的任何部分(如属性或方法)是 `null` 或 `undefined`,则整个表达式返回 `undefined`,而不是抛出错误。这特别适用于 React 中处理可能为空的 props 或状态数据,以避免渲染崩溃[^2]。 - **React 中的常见场景**: - 条件渲染:安全地访问深层属性,例如在 JSX 中渲染用户数据时,避免因 `user` 对象未定义而报错。 - 数据处理:在组件逻辑中安全调用方法或读取嵌套值。 - **代码示例**: ```jsx function UserProfile({ user }) { return ( <div> <h1>{user?.name}</h1> {/* 若 user 为 null/undefined,不渲染 name */} <p>{user?.address?.city ?? 'Unknown'}</p> {/* 结合 ?? 提供默认值 */} </div> ); } ``` - 引用[2] 指出:`?.` 可以理解为对象自动加上 `undefined` 保护,确保代码健壮性[^2]。 - **特点**:运行时安全,适用于所有 JavaScript 环境(包括 ReactJSX)。 ### 2. **`!.`(非空断言运算符)** - **定义与用途**:`!.` 称为非空断言操作符(Non-null Assertion),主要在 TypeScript 中使用。它告诉 TypeScript 编译器:“这个值一定不是 `null` 或 `undefined`”,跳过类型检查。**注意**:这是一个编译时特性,不会影响运行时行为;如果实际值为 `null`,可能导致运行时错误。在 React 中,它常用于 TypeScript 项目,确保 props 或状态变量在静态分析时被视为非空[^2]。 - **React 中的常见场景**: - TypeScript 项目中:强制断言 props 或 ref 的存在,减少冗余检查代码。 - 避免编译错误:当开发者确定变量非空时(如从 API 获取的数据),用于消除 TypeScript 的类型警告。 - **代码示例**: ```tsx interface Props { value: string | undefined; } const MyComponent: React.FC<Props> = ({ value }) => { return <div>{value!.toUpperCase()}</div>; {/* 使用 !. 断言 value 非空 */} }; ``` - 引用[2] 强调:`!.` 是一种断言,告诉 TypeScript 编译器“该对象里一定有某个值”,但开发者需自行保证安全性[^2]。 - **特点**:仅在 TypeScript 有效,纯 JavaScript 中 `!.` 会被解析为逻辑非操作符 `!` 后跟点号(可能导致错误)。使用时需谨慎,避免运行时风险。 ### 3. **`!!`(双重否定运算符)** - **定义与用途**:`!!` 称为双重否定操作符(Double Negation),用于将任何值强制转换为布尔类型。本质上是两次逻辑非操作:第一次 `!` 将值转为布尔取反,第二次 `!` 再取反回原布尔值。在 React 中,它常用于条件渲染或逻辑判断,将非布尔值(如数字、字符串、对象)转换为 `true` 或 `false`,确保条件语句的正确执行[^2]。 - **React 中的常见场景**: - 条件渲染:将变量转为布尔值后用于 `&&` 或三元运算符。 - 状态管理:在 hooks(如 `useState`)中处理布尔逻辑。 - **代码示例**: ```jsx function Notification({ messages }) { const hasMessages = !!messages.length; // 将数组长度转为布尔值 return ( <div> {hasMessages && <p>You have new messages</p>} {/* 安全渲染 */} {!!messages.length || <p>No messages</p>} {/* 替代 || 避免 falsy 值问题 */} </div> ); } ``` - 引用[2] 说明:`!!` 把表达式强行转换为 `boolean` 类型,常用于类型判断[^2]。 - **特点**:纯 JavaScript 特性,适用于所有 React 环境。等效于 `Boolean(value)`,但更简洁。 ### 总结区别 - **核心目的**: - `?.` 专注于**安全访问**(防止 `null`/`undefined` 错误)。 - `!.` 专注于**类型断言**(TypeScript 编译时保证)。 - `!!` 专注于**布尔转换**(将值转为 `true`/`false`)。 - **适用环境**: - `?.` 和 `!!` 是 JavaScript 标准特性,在 React JSX 和纯 JavaScript 中直接可用。 - `!.` 是 TypeScript 特性,仅在有 TypeScript 的类型检查时有效,React 项目中若使用 JavaScript 则无效。 - **风险对比**: - `?.` 最安全:避免运行时崩溃。 - `!!` 安全但需理解 falsy 值(如 `0` 或 `''` 会被转为 `false`)。 - `!.` 风险最高:编译时忽略检查,可能导致运行时错误(如访问 `null` 属性)。 - **何时使用**: - 处理不确定的嵌套数据 → 用 `?.`。 - 在 TypeScript 中消除类型警告 → 用 `!.`。 - 需要严格布尔条件 → 用 `!!`。 ### 注意事项 - 在 React 中,优先使用 `?.` 和 `!!` 增强健壮性,尤其是在条件渲染中(如引用[1] 所示,React 会将 `false`、`null`、`undefined` 视为占位符忽略渲染[^1])。 - 避免滥用 `!.`,因为它绕过类型安全;推荐先用 `?.` 或条件检查确保值非空。 - 这些运算符常结合其他操作符使用,如 `??`(空值合并)或 `&&`(逻辑与),以构建更可靠的逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值