React 新手村通关指南:状态、组件与魔法 UI 🧙‍♂️

React 入门:从 JSX 到组件化,搞定核心知识点 🚀

一、 什么是 React & 为什么选择 React?🎯

如果你问前端圈的程序猿 "现在最火的 UI 库是什么",十有八九会听到 "React" 这个名字。简单来说,React 是 Facebook(现在的 Meta)推出的一个用于构建用户界面的 JavaScript 库,它就像一个超级高效的 "UI 建筑师",让我们能轻松搭建出交互丰富、性能能打的网页。

为什么要学 React 呢?"react 一开始就是组件思想,非常的纯粹"。和传统前端开发相比,React 有三个 "撒手锏":响应式(数据变了 UI 自动更)、数据绑定(数据和 UI 手拉手)、组件化(把页面拆成一块块可复用的 "积木")。虽然有人说它入门门槛比 Vue 高一点,但一旦上手,你会发现这种 "激进" 的设计思路特别适合复杂应用开发,毕竟谁不想写一次代码到处复用呢?

二、 JSX 语法:在 JS 里写 HTML?这操作有点秀!✨

2.1 什么是 JSX?

第一次看到 JSX 代码的同学可能会懵:"这到底是 JS 还是 HTML?" 其实官方解释很直白 ------JSX 就是 "XML in JS" (在 JavaScript 里写 XML),而我们熟悉的 HTML,本质上就是一种特殊的 XML。

看看下面的例子:

jsx

javascript 复制代码
// JSX写法
const element = <h2>JSX 是 React 中用于描述用户界面的语法扩展</h2>

// 等效的原生JS写法(JSX的编译结果)
const element2 = createElement('h2', null,'JSX 是 React 中用于描述用户界面的语法扩展');

这两行代码效果完全一样,但显然 JSX 版本更像 "人话"。所以说,JSX 本质是createElement函数的语法糖,它的存在就是为了让我们写 UI 时少掉点头发,毕竟谁愿意对着一堆嵌套的函数调用流泪呢?

2.2 JSX 的基本语法

虽然 JSX 看起来像 HTML,但它有几个 "小怪癖" 需要注意:

  1. 必须有根元素包裹 就像快递必须有包装盒,JSX 返回的内容也得有个 "根容器"。比如下面用<div>当容器,也可以用 React 提供的<Fragment>(文档碎片)当 "隐形容器",避免多一层不必要的 DOM 节点。

    jsx

    javascript 复制代码
    // 正确:有根元素包裹
    return (
      <div>
        <h1>title</h1>
        <p>content</p>
      </div>
    )
    
    // 错误:没有根元素
    return (
      <h1>title</h1>
      <p>content</p>
    )
  2. class 要写成 className ,如果你在 JSX 里写<div class="box">,React 会给你抛错 ------ 因为class是 JavaScript 的关键字,所以得改用className。比如:

    jsx

    ini 复制代码
    // 正确写法
    <span className="title">Hello</span>
    
    // 错误写法(会报错)
    <span class="title">Hello</span>
  3. 表达式要用大括号包起来 想在 JSX 里插入变量或表达式?用{}就行!比如:

    jsx

    javascript 复制代码
    const name = "React";
    const isLoggedIn = true;
    
    // 插入变量
    return <h1>Hello {name}!</h1>;
    
    // 插入条件表达式
    return {isLoggedIn ? <div>已登录</div> : <div>未登录</div>};

三、 组件化:前端开发的 "乐高积木"🧩

3.1 什么是组件?

组件就像网页的 "功能模块"------ 把 HTML、CSS、JS 打包成一个独立单元,完成特定功能。比如下面的JuejinHeader是头部组件,Ariticles是文章列表组件,它们就像乐高积木,拼在一起就成了完整页面。

jsx

javascript 复制代码
// 头部组件
function JuejinHeader() {
  return(
    <div>
      <header>
        <h1>JueJin首页</h1>
      </header>
    </div>
  )
}

// 文章列表组件
const Ariticles = () => {
  return(
    <div>
      Articles
    </div>
  )
}

3.2 为什么 React 选函数当组件?

React 里的组件大多是函数,这可不是随便选的。函数适合做组件,因为能将 JSX + 逻辑封装成一个组件。想想看,函数接收参数、处理逻辑、返回结果,组件接收数据、处理交互、返回 UI,简直是天造地设!

比如最简化的组件长这样:

jsx

javascript 复制代码
// 一个简单的签到组件
const Checkin = () => {
  return(
    <div>Checkin</div>
  )
}

一行不多一行不少,逻辑和 UI 完美融合~

3.3 根组件与子组件组合形成组件树

整个 React 应用就像一棵大树,有一个 "根组件",其他组件都是它的 "子组件"。以掘金首页为例展示根组件、子组件以及组件树的知识内容。下面代码的JuejinHeaderAriticles都是APP的子组件:

jsx

javascript 复制代码
function JuejinHeader() {
  return(
    // jsx 最外层
    <div>
      <header>
        <h1>JueJin首页</h1>
      </header>
    </div>
  )
}

const Ariticles = () => {
  return(
    <div>
      Articles
    </div>
  )
}

const Checkin = () => {
  return(
    <div>
      Checkin
    </div>
  )
}

const TopArticles = () => {
  return(
    <div>
      TopArticles
    </div>
  )
}



// 根组件
function APP() {
  // 子组件们
  return(
    <div>
      {/* <h1>Hello <b>React!</b></h1> */}
      {/* 头部组件 */}
      <JuejinHeader />
      <main>
        {/* 组件也和html 一样声明,自定义组件 */}
        {/* 组件化让我们像搭积木一样组合成页面 */}
        <Ariticles />
        <aside>
          <Checkin />
          <TopArticles />
        </aside>
      </main>
    </div>
  )
}

export default APP 

组件树以一个根组件为起点(就像树干),其他组件作为 "子组件"(树枝和树叶)嵌套在其中,形成明确的层级关系。整个 React 应用的 UI 结构,本质上就是一棵组件树的可视化呈现。上面这段代码形成的组件树结构如下:

css 复制代码
APP(根)
├─ JuejinHeader
└─ main
   ├─ Ariticles
   └─ aside
      ├─ Checkin
      └─ TopArticles

四、 状态:让组件 "动" 起来的魔法📦

4.1 什么是 state 状态?

如果说组件是 "身体",那状态(state)就是 "灵魂"------ 它是组件内部的 "数据仓库",决定了组件的样子和行为。比如用户是否登录、待办事项列表、当前显示的名字,这些都是状态。

4.2 useState:状态管理的 "金钥匙"

React 提供了useState这个钩子函数来管理状态,它的用法就像 "拆盲盒":

jsx

javascript 复制代码
// 引入useState
import { useState } from 'react';

// 声明状态:初始值为"vue",setName用于更新状态
const [name, setName] = useState("vue");

这几行代码做了三件事:

  1. 声明了一个叫name的状态,初始值是 "vue"
  2. 得到一个更新状态的函数setName
  3. setName被调用时,组件会重新渲染,UI 自动更新

比如 3 秒后更新状态,页面会自动变化:

jsx

scss 复制代码
// 3秒后将name从"vue"改为"react"
setTimeout(() => {
  setName("react");
}, 3000);

效果展示:

4.3 多种状态管理

一个组件可以有多个状态,就像一个人可以有 "姓名""年龄""职业" 多个属性。比如同时管理三个状态:

jsx

php 复制代码
// 框架名称状态
const [name, setName] = useState("vue");

// 待办事项列表状态
const [todos, setTodos] = useState([
  { id: 1, title: "学习react", done: false },
  { id: 2, title: "学习node", done: false }
]);

// 登录状态
const [isLoggedIn, setIsLonggedIn] = useState(false);

每个状态独立管理,互不干扰,代码逻辑清晰得很~

五、 渲染:让数据 "长" 成 UI 的艺术🖌️

5.1 条件渲染:根据状态 "变魔术"

React 里的条件渲染就像 "if-else" 的可视化版本,jSX中不能直接使用"if-else"语法(因为 JSX 大括号{}内只能放表达式 ,而if else是语句),通常使用三目运算符代替。比如判断待办事项是否为空:

jsx

javascript 复制代码
// 有数据时显示列表,无数据时显示提示
todos.length > 0 ? (
  <ul>
    {/* 列表内容 */}
  </ul>
) : (
  <div>暂无待办事项</div>
)

登录状态的显示也是同理:

jsx

javascript 复制代码
// 根据登录状态显示不同内容
{isLoggedIn ? <div>已登录</div> : <div>未登录</div>}

5.2 列表渲染:用 map () 批量 "生产" UI

当需要渲染列表(比如待办事项、商品列表)时,map()方法就是神器。比如渲染 todos 列表:

jsx

javascript 复制代码
<ul>
  {
    todos.map((todo) => (
      // 每个列表项必须有唯一key
      <li key={todo.id}>
        {todo.title}
      </li>
    ))
  }
</ul>

这里有个小细节:每个列表项必须加key属性(通常用唯一 ID),这是 React 的 "性能暗号",帮助它快速识别哪些项没变,避免重复渲染 ------ 不加 key 虽然能运行,但可能会有性能问题哦!

六、 事件处理:给组件 "装开关"🔌

React 里的事件处理就像给组件装开关,点击、输入等操作都会触发对应的函数。语法上有个小特点:事件名要用驼峰命名(比如onClick而不是onclick)。

比如登录按钮的点击事件:

jsx

javascript 复制代码
// 切换登录状态的函数
const toggleLogin = () => {
  setIsLonggedIn(!isLoggedIn);
};

// 按钮绑定点击事件
<button onClick={toggleLogin}>
  {isLoggedIn ? "退出登录" : "登录"}
</button>

点击按钮时,toggleLogin函数会切换isLoggedIn状态,按钮文字和登录状态显示会自动更新 ------ 这就是 "数据驱动 UI" 的魅力,我们只需要管数据怎么变,UI 自然会跟上。

七、实战演练-简单的学习任务清单登陆界面

7.1 代码展示:

javascript 复制代码
// JSX 负责UI
// use 使用
// state 数据状态

import {useState} from 'react';
import './App.css';
function App() {
    // const name = "vue";
    // useState 会返回一个数组
    // 数组的第一个元素是状态值,第二个元素是更新状态值的函数
    const [name,setName] = useState("vue");
    const [todos, setTodos] = useState([{
        id: 1,
        title: "学习react",
        done: false,
    },
    {
        id: 2,
        title: "学习node",
        done: false,

    }]);
    const [isLoggedIn,setIsLonggedIn] = useState(false);
    setTimeout(() => {
        setName("react");
    },3000);
    // 组件的数据业务、交互等
    // JSX js里面,class 是js 关键字 不能用,用className
    const toggleLogin = () => {
        setIsLonggedIn(!isLoggedIn);
    }
    return(
        // 文档碎片标签
        <div>
            <h1>Hello <span className="title">{name}!</span></h1>
            {
                todos.length > 0 ? (
                    <ul>
                        {
                            todos.map((todo) => (
                                <li key={todo.id}>
                                    {todo.title}
                                </li>
                            ))
                        }
                    </ul>
                ) : (<div>暂无待办事项</div>)
            }
            {isLoggedIn ? <div>已登录</div>:<div>未登录</div>}
            <button onClick = {toggleLogin}>
                {isLoggedIn?"退出登录":"登录"}
            </button>
        </div>
    )
}

export default App

7.2 项目介绍

这个项目是一个基于 React 的简单示例,主要展示了 React 的核心特性,具体如下:

  1. 技术基础 :使用 React 框架开发,采用 JSX 语法描述 UI 界面,通过import引入 React 的useState(状态管理)API。

  2. 核心功能

    • 动态文本展示:通过name状态控制标题文本,初始显示 "Hello vue!",3 秒后自动更新为 "Hello react!"。
    • 待办事项列表:基于todos状态渲染待办事项列表,若列表为空则显示 "暂无待办事项"。
    • 登录状态切换:通过isLoggedIn状态管理登录状态,点击按钮可切换 "登录 / 退出登录" 状态,并同步显示对应的状态文本。
  3. React 特性体现

    • 状态管理:使用useState钩子管理组件内部状态(nametodosisLoggedIn),通过状态更新函数(如setNamesetIsLonggedIn)触发 UI 重新渲染。
    • 条件渲染:通过三元表达式根据状态(如todos.lengthisLoggedIn)动态展示不同 UI 内容。
    • JSX 语法:在 JavaScript 中直接编写类似 HTML 的标签,同时支持嵌入变量(如{name})和表达式。

整体是一个用于演示 React 状态与 UI 联动、组件化开发思想的基础示例。

7.3 效果亮个相

八、 总结:React 核心知识清单 & 结语📝

8.1 知识清单

  1. React 是专注于 UI 的库,核心是组件化和响应式
  2. JSX 是 "JS 里写 XML" 的语法糖,简化 UI 开发
  3. 组件是函数,封装 UI 和逻辑,可组合成组件树
  4. useState管理状态,状态变则 UI 变
  5. 条件渲染用三目运算符,列表渲染用map()+key
  6. 事件处理用驼峰命名,绑定函数操作状态

8.2 结语

学 React 就像学搭积木 ------ 一开始可能觉得 "这零件怎么拼",但掌握了 JSX、组件、状态这些 "基础块" 后,你会发现再复杂的页面也能一步步搭出来。

React 更加激进,但这种激进恰恰让它成为前端开发的 "瑞士军刀"------ 无论是小应用还是大型项目,都能应对自如。现在,你已经掌握了 React 的核心概念,接下来就动手写写代码吧,毕竟实践才是最好的老师!💪

相关推荐
天天扭码7 小时前
深入MCP本质——编写自定义MCP Server并通过Cursor调用
前端·mcp
小明记账簿7 小时前
JavaScript浮点数精度问题及解决方案
开发语言·javascript·ecmascript
1024肥宅8 小时前
JavaScript性能与优化:手写实现关键优化技术
前端·javascript·面试
一字白首8 小时前
Vue 项目实战,从注册登录到首页开发:接口封装 + 导航守卫 + 拦截器全流程
前端·javascript·vue.js
前端西瓜哥8 小时前
平面几何:如何绘制一个星形?
前端
天天扭码8 小时前
解放双手!使用Cursor+Figma MCP 高效还原响应式设计稿
前端·mcp
沐浴露z8 小时前
详解Javascript精度丢失以及解决方案
java·javascript
今天不要写bug8 小时前
基于qrcode前端实现链接转二维码的生成与下载
前端·javascript·typescript·vue
JIngJaneIL9 小时前
基于Java + vue干洗店预约洗衣系统(源码+数据库+文档)
java·开发语言·前端·数据库·vue.js·spring boot