Web开发 05

1 React库(人话详解版)

别慌,React 刚接触时是会有点懵,咱们用 "人话 + 类比" 一步步拆:

核心概念先抓牢

  1. 组件(Component)

    把它想成 "乐高积木",比如做个社交 App,顶部导航是一块积木(Navbar 组件)、发的帖子是另一块(Post 组件)。整个 App 就是这些积木拼起来的,每个组件单独存一个文件,好管理。

  2. 属性(Props)

    这是组件的 "配置参数"。比如你做个按钮组件 <Button text="点击我" />text 就是 props,父组件传给子组件用的,子组件只能读、不能改(像游戏里固定的初始装备)。

  3. 状态(State)

    组件自己的 "可变数据"。比如点赞按钮,点一下数字 + 1,这个点赞数就是 state,组件内部能改(用 useState 声明,像 const [count, setCount] = useState(0)count 是当前数,setCount 用来改它)。

  4. 副作用(useEffect)

    处理 "组件渲染之外的事儿",比如加载数据、订阅事件。比如组件一加载,就去服务器拿用户信息,用 useEffect 写:

jsx

javascript 复制代码
useEffect(() => {
  fetch('/api/user')
    .then(res => res.json())
    .then(data => setUser(data))
}, []) // 空数组意思是 "只在组件第一次渲染时执行"

举个小例子串起来

假设做个 "点赞卡片" 组件:

jsx

javascript 复制代码
import React, { useState } from 'react';

// 子组件:点赞按钮(用 props 接收父组件的初始点赞数)
const LikeButton = ({ initialCount }) => {
  // 用 state 存实时点赞数
  const [count, setCount] = useState(initialCount);
  
  // 点击事件:改 state
  const handleLike = () => {
    setCount(count + 1);
  };

  return (
    <button onClick={handleLike}>
      点赞啦!当前 {count} 个赞
    </button>
  );
};

// 父组件:卡片(给子组件传 props)
const PostCard = () => {
  return (
    <div>
      <h2>今日分享</h2>
      <p>React 其实很好玩~</p>
      {/* 把初始点赞数 0 传给子组件 */}
      <LikeButton initialCount={0} />
    </div>
  );
};

export default PostCard;

这里:

  • PostCard 是父组件,LikeButton 是子组件;
  • initialCount={0} 是父传子的 props;
  • LikeButton 里的 count 是自己的 state,点击能变。

router(路由)简单理解

就是 "网址对应哪个组件"。比如:

  • 访问 / → 显示首页组件(Home)
  • 访问 /profile → 显示个人主页组件(Profile)
    react-router 写大概这样:

jsx

javascript 复制代码
import { BrowserRouter as Router, Routes, Route } from 'react-router-dom';
import Home from './Home';
import Profile from './Profile';

function App() {
  return (
    <Router>
      <Routes>
        <Route path="/" element={<Home />} />
        <Route path="/profile" element={<Profile />} />
      </Routes>
    </Router>
  );
}

这样网址变了,页面自动切换对应的组件。

为啥觉得难?试试这些

  1. 先跑通小 Demo:找个简单需求(比如做个 todo 列表),用 React 实现,把组件、state、props 练一遍。
  2. 看官方文档 + 拆例子 :官方文档的 "入门教程" 很直观,跟着做一遍;也可以把别人的小项目(比如 GitHub 搜 react demo)下载下来,拆组件、看 props/state 怎么传的。
  3. 别怕重复查: useState、useEffect 这些 Hook 记不住很正常,用多了自然熟,遇到不懂就翻文档或搜 "React xxx 怎么用",慢慢就顺了~

React 核心就是 "组件化 + 状态管理",把这俩吃透,再复杂的项目也能拆成小积木慢慢拼!要是卡在哪一步(比如 useEffect 总写不对、组件传值混乱),直接说,咱们针对性拆 。

2 再梳理 React 知识点文档

一、React 是啥?

简单说,React 就是个帮你做网页前端的 JavaScript 库 ,核心思路是 "组件化" 。你可以把整个网页拆成一个一个小 "组件"(比如 Instagram 页面里的导航栏、帖子卡片、侧边栏这些独立的 "块"),然后像搭积木一样,用这些组件拼出整个 App 。

二、核心概念拆解(结合文档里的例子和类比)

1. 组件(Components)
  • 是什么 :你自定义的 "HTML 标签" ,比如 <Navbar />(导航栏组件 )、<PostCard />(帖子卡片组件 ),每个组件通常对应一个单独的 JavaScript 文件。
  • 怎么用 :大组件里套小组件,像整个 App 是 <App /> 组件,它里面又能拆成 <Header /><MainContent /><Footer /> 这些子组件,子组件还能继续拆,形成 "组件树"(参考文档最后那个 App 组件树图 )。
2. 属性(Props)
  • 是什么 :组件的 "输入参数" ,用来给子组件传数据,子组件只能读,不能改 。比如父组件给子组件传标题:

    jsx

    javascript 复制代码
    // 父组件里用子组件,传 props
    <ChildComponent title="这是帖子标题" likes={100} /> 

    子组件里就能拿到 props.title(值是 "这是帖子标题" )、props.likes(值是 100 )用。

3. 状态(State)
  • 是什么 :组件自己的 "内部变量" ,能改,改了会让组件重新渲染更新 。用 useState 声明,比如:

    jsx

    javascript 复制代码
    // 声明状态:count 是当前值,setCount 是用来改 count 的函数,初始值 0
    const [count, setCount] = useState(0); 

    点个赞、输个搜索关键词,这些会变化的 "动态数据" ,就存在 state 里。

4. 路由(Router)
  • 是什么 :帮你管理 "不同网址对应哪个组件" ,让单页应用能像多页网站一样切换页面。比如:
    • 访问 https://xxx.com/ → 显示 <Feed /> 组件(首页)
    • 访问 https://xxx.com/profile → 显示 <Profile /> 组件(个人页)
      用代码写就是文档里那样,把路径和组件对应起来。
5. 副作用(useEffect)
  • 是啥场景 :组件渲染完后,想做些 "额外的事儿" ,比如 请求接口拿数据、订阅事件、设置定时器 。因为 React 组件更新时会重新执行代码,直接写在组件里的逻辑可能重复执行,useEffect 能控制这些逻辑 啥时候执行
  • 怎么用 :看依赖数组(第二个参数):
    • useEffect(() => { ... }, []) :空数组,组件 只在第一次渲染完执行一次 (比如初始化时拿用户信息)。
    • useEffect(() => { ... }, [title, count]) :依赖 titlecount这俩变了就执行 (比如标题变了,重新请求对应数据)。
6. .then() 是啥(文档里单独讲的)
  • 本质 :JavaScript 里处理 "异步操作" 的,比如用 fetch 调接口,接口请求得等一会儿才返回结果,.then() 就是 等异步操作做完,再执行后面的逻辑

  • 例子

    jsx

    javascript 复制代码
    // 调接口,等返回结果后,把数据存到 state 里
    fetch('/api/posts')
      .then(response => response.json()) 
      .then(data => setPosts(data)); 

    这样就能保证拿到接口数据后,再更新组件状态。

三、文档里的代码例子(Example.js) 快速理解

文档里的 Example.js 把上面的概念串起来了,拆解一下:

jsx

javascript 复制代码
// 1. 引入 React 核心和需要的 Hook(useState、useEffect)
import React, { useState, useEffect } from "react"; 
// 引入样式和子组件
import "./Example.css"; 
import ExampleChildComponent from "./ExampleChildComponent.js"

// 2. 定义组件(函数组件),可以接收父组件传的 props
const Example = (props) => { 
  // 3. 声明 state:
  // exampleState1 初始值 "dummy message",setExampleState1 用来改它
  const [exampleState1, setExampleState1] = useState("dummy message") 
  // exampleState2 初始值 0,setExampleState2 用来改它
  const [exampleState2, setExampleState2] = useState(0) 

  // 4. useEffect 做副作用:这里调接口,拿到数据后改 exampleState1
  useEffect(() => { 
    // 调接口(异步),.then() 等接口返回后执行
    get("/api/anEndpoint", { param1: "value" }).then((serverResponse) => { 
      setExampleState1(serverResponse) // 把接口数据存到 state
    })
  }, []) // 空数组,只执行一次

  // 5. 定义一个函数,用来改 state(点按钮时会触发)
  const addOneToState2 = () => { 
    setExampleState2(exampleState2 + 1)
  }

  // 6. 返回组件的 HTML 结构(JSX)
  return ( 
    <div>
      {/* 用 props 里的 title */}
      <h1 className="headerStyle1">{props.title}</h1> 
      {/* 渲染子组件,传 props:固定值 10、和 state 关联的 exampleState2 */}
      <ExampleChildComponent 
        exampleProp1={10} 
        exampleProp2={exampleState2} 
      />
      {/* 点击按钮,执行 addOneToState2 改 state */}
      <button onClick={addOneToState2} /> 
    </div>
  );
}

// 7. 导出组件,让其他组件能引入使用
export default Example; 

这里用到了 组件、props(父传子)、state(组件内部状态)、useEffect(调接口) ,把核心流程走了一遍。

四、FAQ 里的关键问答(帮你区分易混点)

  • State 和 Props 有啥区别?

    • Props 是 父组件传的、只读 ,像 "配置参数" ,子组件不能自己改;
    • State 是 组件自己的、可修改 ,改了会触发组件重新渲染,像 "动态数据" 。
      类比:Props 是父母给孩子的 "零花钱(固定数,孩子不能自己改数)" ;State 是孩子自己的 "储蓄罐(想存想取自己定)" 。
  • 文件太多咋管理?

    记住 "组件树" !整个 App 是根组件,往下拆成各种子组件,每个组件对应一个文件。心里有这个树状结构,就知道哪个文件是干啥的、数据咋传的了(参考文档最后那个 App 组件树图 )。

五、总结一下学习路径

  1. 先抓核心概念:组件、Props、State 是基础,把这仨吃透,React 就入门了。
  2. 练小例子:从做个按钮点击计数、调接口渲染列表开始,把概念用起来。
  3. 看文档 + 模仿项目:官方文档的 "入门示例" 跟着做,再找简单的 React 项目(比如 GitHub 搜小 Demo ),拆组件、看逻辑咋写的。

刚开始头大正常,多练几遍、遇到问题拆分概念找对应,慢慢就顺了!要是哪个点还卡,随时拆 。

3 jsx和html通常是不是看成是一样的?(答:建议先把 JSX 当成 "特殊的 JS 写法",别和 HTML 混为一谈)

JSX 和 HTML 虽然看起来很像,但本质上是不同的东西,理解它们的区别对写 React 很关键。我用大白话 + 例子帮你拆:

核心区别:JSX 是 JavaScript,HTML 是标记语言

  1. HTML

    • 是网页的 "骨架",由浏览器解析,比如: html

      预览

      html 复制代码
      <div class="container">
        <h1>Hello World</h1>
        <button onclick="alert('Hi')">Click me</button>
      </div>
  2. JSX

    • JavaScript 的语法扩展 (可以理解成 "带 HTML 语法的 JS"),最终会被编译成纯 JS 代码,比如:

      jsx

      javascript 复制代码
      // JSX 代码
      const element = (
        <div className="container">
          <h1>Hello World</h1>
          <Button onClick={() => alert('Hi')} />
        </div>
      );
      
      // 编译后等价的 JS 代码(用 React.createElement)
      const element = React.createElement(
        "div",
        { className: "container" },
        React.createElement("h1", null, "Hello World"),
        React.createElement(Button, { onClick: () => alert('Hi') })
      );

写法上的 4 个主要差异

1. 属性名不同
  • HTML :用小写或连字符(class, onclick
  • JSX :用驼峰命名(className, onClick

jsx

javascript 复制代码
// HTML
<div class="box" onclick="handleClick()">...</div>

// JSX
<div className="box" onClick={handleClick}>...</div>
2. 插入表达式不同
  • HTML:不能直接插 JS 表达式
  • JSX :用 {} 插任何 JS 表达式(变量、函数调用、计算等)

jsx

javascript 复制代码
// JSX 里插入变量或计算
const name = "Alice";
<h1>Hello, {name.toUpperCase()}!</h1> // 输出 "Hello, ALICE!"
3. 自闭和标签
  • HTML :部分标签可省略闭合(如 <input>, <br>
  • JSX所有标签必须闭合

jsx

javascript 复制代码
// HTML
<input type="text">
<br>

// JSX(必须闭合)
<input type="text" />
<br />
4. 必须有一个根元素
  • HTML:可以有多个并列标签
  • JSX :必须用一个标签包裹所有内容(或用 <>...</> 片段)

jsx

javascript 复制代码
// 错误:JSX 必须有根元素
return (
  <h1>标题</h1>
  <p>内容</p>
);

// 正确:用一个 div 包裹
return (
  <div>
    <h1>标题</h1>
    <p>内容</p>
  </div>
);

// 或者用空标签(片段)
return (
  <>
    <h1>标题</h1>
    <p>内容</p>
  </>
);

为什么 JSX 要设计成这样?

  • 核心目的:让你在 JS 里更直观地写 UI
    React 的理念是 "UI = f (state)"(UI 是状态的函数),JSX 让你在 JS 代码里自然地描述 UI,而不是把 HTML 和 JS 分开写(比如传统的 DOM 操作)。
  • 编译时优化
    JSX 编译后是 React.createElement,React 能提前分析和优化组件结构。

常见误区纠正

  1. JSX 不是模板语言

    模板语言(如 Vue 的模板)是 "HTML 里插 JS",而 JSX 是 "JS 里插 HTML",本质是 JS。

  2. JSX 必须引入 React

    因为 JSX 会编译成 React.createElement,所以即使你没显式用 React,也得 import React from 'react'(React 17+ 后可以省略)。

  3. JSX 里的逻辑更灵活

    比如条件渲染、循环:

    jsx

    javascript 复制代码
    // 条件渲染
    {isLoggedIn ? <UserProfile /> : <LoginButton />}
    
    // 循环渲染列表
    {items.map(item => (
      <div key={item.id}>{item.name}</div>
    ))}

总结:一句话区分

  • HTML:是给浏览器看的标记语言。
  • JSX:是给开发者看的 "语法糖",最终会变成纯 JS 代码。

刚开始写 React 时,建议先把 JSX 当成 "特殊的 JS 写法",别和 HTML 混为一谈。多写几个组件,自然就习惯了!

4 React 组件编写的知识点总结

Recap: Writing Components

总结 "怎么拆分、写组件" 的基础规则:

  1. 组件拆分 :把 App 拆成多个组件,每个组件单独放一个文件(方便管理,像搭积木一样)。
  2. 组件本质 :每个组件是 "接收 props 当输入,返回 JSX(长得像 HTML 的代码)" 的函数
  3. JSX 语法
    • () 包裹多行 JSX,让代码进入 "JSX 环境"(写法规范,避免歧义)。
    • 在 JSX 里,用 {} 临时切回 "JS 环境",可以写变量、表达式(比如 {props.name} 插变量)。

总结 "组件传值、状态、样式" 的关键细节:

  1. 传 props :父组件用 <Post text="I love weblab" /> 这种方式,给子组件传数据(text 就是 props)。
  2. 读 props :子组件里用 props.text 拿到父组件传的值。
  3. 声明 state :用 useState 存组件的 "可变数据",格式是 const [something, setSomething] = useState(initialValue)something 是当前值,setSomething 是改它的函数)。
  4. 样式写法 :React 里给元素加 CSS 类名,className 代替 HTML 里的 class (因为 class 在 JS 里是关键字,冲突啦)。

一句话总结

这两页是老师带着复习 "React 组件怎么拆分、怎么传值、怎么写状态和样式" 的核心规则,把写组件的基础流程和语法细节串了一遍~ 刚开始记不住没关系,多写几个组件(比如做个按钮、卡片组件),这些规则自然就熟啦!

相关推荐
自己记录_理解更深刻几秒前
js 箭头函数箭头后面添加大括号加return,箭头后面添加小括号,和不加括号的区别,怎么使用
javascript
前端灵派派1 分钟前
cesium鼠标拾取展示信息弹窗
前端·cesium
剽悍一小兔2 分钟前
上线了,自己开发的Java刷题小程序
前端
Hilaku4 分钟前
我为什么在团队里,强制要求大家用pnpm而不是npm?
前端·javascript·npm
呦呦鹿鸣Rzh6 分钟前
MyBatisPlus
java·前端·spring boot
一天睡25小时9 分钟前
04 - 弹性与接触材质详解
前端·javascript·面试
AliciaIr13 分钟前
深入理解JWT认证:从原理到实践(上)
前端
一天睡25小时16 分钟前
03 - Cannon 材质与摩擦系数设置
前端·javascript
一天睡25小时17 分钟前
01 - Cannon.js 引擎的用途和基本使用
前端·javascript
南方kenny18 分钟前
React 副作用深度解析:从概念到实战到面试考点(超详细)
前端·javascript·react.js