React 核心概念与环境搭建,复习使用更加推荐
前言:
是个人根据自我的学习情况,总结过后的一些知识,自己写太麻烦了,就让ai润了下色,主要是面向加强基础理解的部分,针对面试被拷打理解的时候,所以不适合入门学习,但作为要点复习还算不错。
本文从基础开始逐步深入,聚焦 React 的核心定位、环境搭建(Create React App)、JSX 语法 这三个入门关键知识点,每个知识点均按 “概念→用法→代码示例→注意点” 的结构讲解,最后补充面试考点分析。
一、React 核心定位(为什么学 React?)
1. 概念
React 是由 Facebook(现 Meta)开发并维护的 声明式、组件化 前端 JavaScript 库,核心目标是 “高效构建用户界面(UI)”。
- 声明式:你只需描述 “UI 应该是什么样”(比如 “列表数据变了,UI 就显示新列表”),无需手动操作 DOM 实现 “怎么变”;
- 组件化:将复杂 UI 拆分为独立、可复用的 “组件”(如按钮、导航栏、商品卡片),降低开发复杂度,符合大厂 “高内聚、低耦合” 的代码规范。
2. 用法
React 不直接操作 DOM,而是通过 虚拟 DOM(Virtual DOM) 优化渲染:
- 首次渲染时,React 将组件转化为虚拟 DOM(内存中的 JavaScript 对象);
- 当数据变化时,生成新的虚拟 DOM;
- 通过 “Diff 算法” 对比新旧虚拟 DOM 的差异,只更新真实 DOM 中变化的部分,减少性能开销。
3. 代码示例(无实际输出,理解核心逻辑)
// 核心逻辑示意(无需手写,React 内部实现)
// 1. 首次渲染:虚拟 DOM -> 真实 DOM
const oldVirtualDOM = React.createElement('div', null, 'Hello React');
ReactDOM.createRoot(document.getElementById('root')).render(oldVirtualDOM);
// 2. 数据变化:生成新虚拟 DOM
const newVirtualDOM = React.createElement('div', null, 'Hello React! 数据更新了');
// 3. React 内部 Diff 对比,只更新文本内容,不重新创建 div 标签
ReactDOM.createRoot(document.getElementById('root')).render(newVirtualDOM);
4. 注意点
- React 是 “库” 不是 “框架”:它只负责 UI 层,需搭配路由(React Router)、状态管理(Redux)等库实现完整项目,而 Vue/Angular 是包含路由、状态管理的完整框架;
- 虚拟 DOM 是 “性能优化手段”,但并非所有场景都比直接操作 DOM 快(如单次大量 DOM 操作),需结合实际场景判断;
- React 18 后推荐使用
createRoot替代旧版ReactDOM.render,需注意版本差异。
二、React 环境搭建(Create React App)
1. 概念
Create React App(简称 CRA)是 React 官方提供的 零配置脚手架工具,能快速生成标准化的 React 项目结构,包含 Webpack 打包、Babel 转译、热更新等功能,无需手动配置构建工具(大厂实习中,小型项目或 Demo 常用 CRA 初始化)。
2. 用法
- 确保安装 Node.js(推荐 v14+,大厂开发环境通常统一 Node 版本);
- 打开终端,执行命令创建项目;
- 进入项目目录,启动开发服务器;
- 访问
http://localhost:3000查看默认页面。
3. 代码示例(终端命令)
# 1. 创建 React 项目(项目名:react-demo,可自定义)
npx create-react-app react-demo
# 2. 进入项目目录
cd react-demo
# 3. 启动开发服务器(热更新:修改代码后页面自动刷新)
npm start
# 4. 打包生产环境代码(部署时使用,输出到 build 文件夹)
npm run build
项目核心目录结构(大厂开发需熟悉的关键文件):
react-demo/
├── public/ # 静态资源(如 index.html、图标)
│ └── index.html # 入口 HTML,React 会将 UI 注入到 id="root" 的 div 中
├── src/ # 源码目录(核心开发区域)
│ ├── App.js # 根组件(所有页面/组件的入口)
│ ├── index.js # 入口 JS,将 App 组件渲染到 index.html 的 root 节点
│ └── App.css # App 组件的样式文件
└── package.json # 项目依赖、脚本配置(如 start/build 命令)
4. 注意点
- 避免全局安装
create-react-app:使用npx可直接调用最新版本,防止旧版本导致的兼容性问题; - 开发中不要修改
public/index.html中的root节点:React 依赖该节点注入 UI,修改可能导致渲染失败; - 若需自定义 Webpack/Babel 配置,可执行
npm run eject暴露配置文件(但不可逆,大厂中一般用craco等工具在不 eject 的情况下修改配置)。
三、JSX 语法(React 模板语法)
1. 概念
JSX(JavaScript XML)是 React 定义 UI 的 语法扩展,允许在 JavaScript 代码中直接写 HTML 风格的标签,本质是 React.createElement 函数的 “语法糖”(大厂代码中 99% 的 UI 都是用 JSX 编写,必须熟练掌握)。
2. 用法
- 在 JSX 中,HTML 标签直接写(如
<div>、<button>); - 若要嵌入 JavaScript 表达式(变量、函数调用、三元运算等),需用
{}包裹; - JSX 标签必须有一个 “根节点”(如
<div>或 React 16+ 提供的<>空片段,避免多余 DOM 节点); - 标签属性名需用驼峰式(如
className替代 HTML 的class,onClick替代onclick)。
3. 代码示例(src/App.js 改造)
import React from 'react';
import './App.css';
// 定义组件(函数组件,后续会详细讲)
function App() {
// 1. 定义 JavaScript 变量
const name = 'React 学习者';
const isShowGreeting = true;
const user = { age: 22 };
// 2. 定义函数(可在 JSX 中调用)
const getWelcomeMsg = () => {
return `欢迎 ${name},你的年龄是 ${user.age}`;
};
return (
// 根节点:用 <> 空片段避免多余 div
<>
{/* JSX 注释:必须写在 {} 中 */}
<h1 style={{ color: 'blue', fontSize: '24px' }}>
{getWelcomeMsg()} {/* 嵌入函数调用 */}
</h1>
{/* 嵌入三元运算:控制元素显示/隐藏 */}
{isShowGreeting ? <p>这是 JSX 语法示例</p> : null}
{/* 驼峰式属性:className 替代 class,onClick 替代 onclick */}
<button className="btn" onClick={() => alert('按钮被点击')}>
点击我
</button>
</>
);
}
export default App;
输出结果(浏览器页面):
- 蓝色、24px 大小的标题:“欢迎 React 学习者,你的年龄是 22”;
- 下方显示段落:“这是 JSX 语法示例”;
- 一个按钮,点击后弹出 “按钮被点击” 的提示框。
4. 注意点
- JSX 中不能直接写
if/for语句(需用三元运算、map等表达式替代); - 标签必须闭合:单标签如
<img>需写为<img />(否则报错); - 样式传递:内联样式需用
style={{ key: value }}(双层大括号,外层是 JS 表达式,内层是样式对象),且值需是字符串(如fontSize: '24px'不能写24); - 防止 XSS 攻击:React 会自动转义 JSX 中的内容,若需插入原始 HTML,需用
dangerouslySetInnerHTML={{ __html: 内容 }}(慎用,可能有安全风险,大厂中需确认内容安全后使用)。
四、实习面试考点分析
1. 问答题
考点 1:React 中虚拟 DOM 的原理是什么?为什么要用虚拟 DOM?
答案:
- 原理:虚拟 DOM 是内存中的 JavaScript 对象,对应真实 DOM 的结构;React 首次渲染时将组件转化为虚拟 DOM,数据变化时生成新虚拟 DOM,通过 Diff 算法对比新旧虚拟 DOM 的差异,最终只更新真实 DOM 中变化的部分。
- 原因:
- 减少真实 DOM 操作:真实 DOM 操作性能开销大,虚拟 DOM 只更新差异部分,提升渲染效率;
- 跨平台能力:虚拟 DOM 不依赖具体平台,可通过 React Native 等框架将虚拟 DOM 转化为原生组件(如 iOS/Android 控件),实现 “一次编写,多端运行”;
- 简化开发:开发者无需手动操作 DOM,只需关注数据和 UI 映射关系,降低开发复杂度。
考点 2:JSX 和 HTML 的区别是什么?(高频题)
答案:
- 属性名差异:JSX 用驼峰式命名(如
className、onClick),HTML 用短横线命名(如class、onclick); - 注释语法:JSX 注释需写在
{/* 注释内容 */}中,HTML 注释是<!-- 注释内容 -->; - 表达式嵌入:JSX 可通过
{}嵌入 JavaScript 表达式,HTML 无法直接嵌入 JS; - 标签闭合:JSX 要求所有标签必须闭合(如
<img />),HTML 中部分标签可省略闭合(如<img>); - 样式处理:JSX 内联样式需用
style={{ key: value }},HTML 用style="key: value;"; - 关键字冲突:JSX 避免使用 JavaScript 关键字(如
class是 JS 关键字,故用className替代)。
2. 代码题
考点:用 JSX 实现一个 “条件渲染 + 列表渲染” 的组件(字节实习常考基础题)
题目:给定数组 const users = [{ id: 1, name: '张三', isActive: true }, { id: 2, name: '李四', isActive: false }],要求:
- 渲染一个标题 “用户列表”;
- 遍历
users数组,渲染每个用户的姓名; - 若用户
isActive为true,姓名显示为绿色;否则为灰色; - 点击用户姓名,弹出该用户的
id。
答案代码:
import React from 'react';
function UserList() {
const users = [
{ id: 1, name: '张三', isActive: true },
{ id: 2, name: '李四', isActive: false }
];
return (
<div>
<h2>用户列表</h2>
{/* 列表渲染:用 map 遍历数组,必须加 key(唯一标识,提升 Diff 效率) */}
<ul>
{users.map((user) => (
<li
key={user.id} {/* key 必须唯一,优先用 id,不用 index(避免数组排序后 Diff 错误) */}
style={{ color: user.isActive ? 'green' : 'gray' }} {/* 条件样式 */}
onClick={() => alert(`用户 ID:${user.id}`)} {/* 点击事件,传递用户 id */}
>
{user.name} {/* 渲染用户名 */}
</li>
))}
</ul>
</div>
);
}
export default UserList;
代码分析(面试官关注的点):
- 列表渲染:用
map遍历数组(不能用for循环),且必须添加key属性(key是 React 识别列表项的唯一标识,避免渲染错误,大厂中若遗漏key会被指出不规范); - 条件渲染:通过三元运算控制
style.color,逻辑清晰(也可抽成函数,如getColor(user.isActive),代码更易维护); - 事件绑定:
onClick中用箭头函数传递user.id(若直接写onClick={alert(user.id)},会在组件渲染时立即执行,而非点击时执行,这是常见错误,面试官会重点考察)。
更多推荐
所有评论(0)