当前位置: 首页 > news >正文

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

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

举个小例子串起来

假设做个 “点赞卡片” 组件:

jsx

import React, { useState } from 'react';// 子组件:点赞按钮(用 props 接收父组件的初始点赞数)
const LikeButton = ({ initialCount }) => {// 用 state 存实时点赞数const [count, setCount] = useState(initialCount);// 点击事件:改 stateconst 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

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

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

    子组件里就能拿到 props.title(值是 “这是帖子标题” )、props.likes(值是 100 )用。
3. 状态(State)
  • 是什么:组件自己的 “内部变量” ,能改,改了会让组件重新渲染更新 。用 useState 声明,比如:

    jsx

    // 声明状态: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]) :依赖 title 或 count ,这俩变了就执行 (比如标题变了,重新请求对应数据)。
6. .then() 是啥(文档里单独讲的)
  • 本质:JavaScript 里处理 “异步操作” 的,比如用 fetch 调接口,接口请求得等一会儿才返回结果,.then() 就是 等异步操作做完,再执行后面的逻辑 。
  • 例子

    jsx

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

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

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

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

jsx

// 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 做副作用:这里调接口,拿到数据后改 exampleState1useEffect(() => { // 调接口(异步),.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

      预览

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

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

      jsx

      // 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:用小写或连字符(classonclick
  • JSX:用驼峰命名(classNameonClick

jsx

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

jsx

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

jsx

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

jsx

// 错误: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

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

总结:一句话区分

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

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

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 组件怎么拆分、怎么传值、怎么写状态和样式” 的核心规则,把写组件的基础流程和语法细节串了一遍~ 刚开始记不住没关系,多写几个组件(比如做个按钮、卡片组件),这些规则自然就熟啦!

http://www.dtcms.com/a/292520.html

相关文章:

  • 云祺容灾备份系统Hadoop备份与恢复实操手册
  • 188粉福
  • 【第三节】Class与Style绑定
  • 网络基础15-16:MSTP +VRRP综合实验
  • 单张显卡运行多个vllm模型
  • 零基础数据结构与算法——第五章:高级算法-回溯算法子集全排列问题
  • ZooKeeper学习专栏(六):集群模式部署与解析
  • C++ new 创建数组的内在原理详解
  • linux 环境服务发生文件句柄泄漏导致服务不可用
  • ELF 文件操作手册
  • python学习-读取csv文件
  • 如何验证分类模型输出概率P值的“好坏”:评估与校准示例
  • GitHub 上的开源项目 ticktick(滴答清单)
  • recvmsg函数的用法
  • 算法学习--滑动窗口
  • 学习python中离线安装pip及下载package的方法
  • C语言:函数基础
  • day059-zabbix自定义监控与自动发现
  • Node.js:Web模块、Express框架
  • es6中的symbol基础知识
  • 在Android开发中,如何获取到手机设备的PIN码?
  • 如何安装CMake较新的版本
  • Apache Ignite 长事务终止机制
  • 精密全波整流电路(一)
  • torchvision.transforms 与 MONAI 数据增强的异同
  • Cloud 与 VPS 的区别:如何选择最适合你的服务器解决方案?
  • stream流入门
  • 【打怪升级 - 01】保姆级机器视觉入门指南:硬件选型 + CUDA/cuDNN/Miniconda/PyTorch 安装全流程(附版本匹配秘籍)
  • vmware 克隆虚拟机,报错:克隆时出错:指定不存在的设备。然后电脑卡死,只能强制关机再开机。
  • FastDFS 6.11.0 单机环境搭建与测试(附 Nginx 集成)+ docker构建+k8s启动文件