学React治好了我的焦虑症,1小时速通React 前20分钟。

前言

我是某大学大二的学生,目前在面试阶段,说实话学完vue3,然后写完两个项目,我本人是越来越对自己保持怀疑,vue3这个东西吧,用它就像用一种半黑箱(如果你没看源码的话)b站上的教程教你怎么用,用完,我发现我js的能力还倒退了一些,顿时就汗流浃背。直到我在学习vue3源码和转react这路,我选了后者,接触了react,我感觉我焦虑症瞬间好了,学起来嘎嘎上头(可能是黑暗之魂,黑暗之魂3,法环玩多了,变成了小高的形状),总之学vue就很枯燥,感觉很简单,没啥好学的,毕竟东西都封装的那么好了,拿来当组件库用就对了。

下面是我20分钟的速通笔记

TIPS:如果使用了()里面智能返回一个根组件,所以用<></>包裹,如果需要设置key则用<Fragment> <Fragment/>包裹,return后面有()是应对换行自动加;的问题

React Hooks 入门:useState 实战示例

从 JSX 基础到状态管理,一文掌握 React 函数组件的核心用法

一、JSX 基础与条件渲染

1. 最简单的组件与插值

jsx

javascript 复制代码
function App() {
  const titleName = 'xixi'
  const content = '我爱林希,我就是林希'

  return (
    <div title={titleName}>
      <p>{content}</p>
    </div>
  )
}

export default App
  • 在 JSX 中使用 {} 包裹 JavaScript 表达式
  • 标签属性也可以使用 {} 传入变量

2. 条件渲染(if/else)

jsx

javascript 复制代码
function App() {
  const flag = true
  const titleName = "林希"
  let content = null

  if (flag) {
    content = <p>哈哈哈</p>
  } else {
    content = <div>这是什么</div>
  }

  return (
    <div title={titleName}>
      {content}
    </div>
  )
}

export default App
  • 可以在 JSX 外部使用 if/else 决定渲染内容
  • 将 JSX 元素赋值给变量,再通过 {} 嵌入

二、列表渲染与 Fragment

jsx

javascript 复制代码
import { Fragment } from "react"

function App() {
  const arr = [
    { name: "xixi", id: 1 },
    { name: "buxixi", id: 2 },
    { name: "xixihaha", id: 3 }
  ]

  const newArr = arr.map((item) => (
    <Fragment key={item.id}>
      <li>{item.name}</li>
      <li>_______</li>
    </Fragment>
  ))

  return <ul>{newArr}</ul>
}

export default App
  • 使用 map() 遍历数组生成 JSX 元素列表
  • 必须为每个列表项添加 key 属性(帮助 React 高效更新)
  • <Fragment> 可以包裹多个相邻元素而不增加额外 DOM 节点

三、useState 基础 ------ 管理不同数据类型

3.1 管理字符串

jsx

javascript 复制代码
import { useState } from "react"

function App() {
  const [data, setData] = useState("这是我的默认内容")

  function change() {
    setData("笑嘻嘻")
  }

  return (
    <>
      <div>{data}</div>
      <button onClick={change}>点我进行改变</button>
    </>
  )
}

export default App
  • useState 返回一个数组:[当前状态, 更新函数]
  • 调用更新函数会触发组件重新渲染

3.2 管理对象(注意不可变数据)

jsx

javascript 复制代码
import { useState } from "react"

function App() {
  const [data, setData] = useState({ name: "Linxi", age: 18 })

  function change() {
    setData({ ...data, age: 17 })  // 扩展运算符创建新对象
  }

  return (
    <>
      <div>{data.name}____{data.age}</div>
      <button onClick={change}>点我进行改变</button>
    </>
  )
}

export default App
  • 更新对象状态时,必须创建新对象,不能直接修改原对象
  • 使用 ... 扩展运算符复制原有属性,再覆盖要修改的字段

3.3 管理数组 ------ 增删改

初始数据与列表展示

jsx

php 复制代码
import { useState } from "react"

function App() {
  const [data, setData] = useState([
    { name: "Linxi", age: 18 },
    { name: "Yue", age: 19 },
    { name: "R", age: 20 }
  ])

  const List = data.map(item => (
    <li key={item.name}>
      名字:{item.name} 年龄:{item.age}
    </li>
  ))

  // ... 更新函数
}
添加元素

jsx

php 复制代码
function change() {
  setData([...data, { name: "xixi", age: 19 }])
}
  • 使用扩展运算符复制原数组,再追加新元素
过滤(删除)

jsx

scss 复制代码
function change() {
  setData(data.filter(item => item.age >= 19))
}
  • filter 返回新数组,年龄小于 19 的被移除
修改某个元素(更新指定对象)

jsx

javascript 复制代码
function change() {
  setData(data.map(item => {
    if (item.name === "Linxi") {
      return { ...item, age: 17 }   // 只修改 age
    }
    return item
  }))
}
  • 使用 map 遍历,找到目标项返回修改后的新对象,其余项不变
  • 同样遵循不可变原则

四、完整示例(最终代码)

jsx

javascript 复制代码
import { useState } from "react"

function App() {
  const [data, setData] = useState([
    { name: "Linxi", age: 18 },
    { name: "Yue", age: 19 },
    { name: "R", age: 20 }
  ])

  const List = data.map(item => (
    <li key={item.name}>
      名字:{item.name} 年龄:{item.age}
    </li>
  ))

  function change() {
    setData(data.map(item => {
      if (item.name === "Linxi") {
        return { name: "Linxi", age: 17 }
      }
      return item
    }))
  }

  return (
    <>
      <ul>{List}</ul>
      <button onClick={change}>点我进行改变</button>
    </>
  )
}

export default App

总结

数据类型 更新方式示例 关键原则
字符串 setData("新值") 直接替换
对象 setData({...data, key: newValue}) 创建新对象,不可直接修改
数组 setData([...data, newItem]) 创建新数组
数组 setData(data.filter(...)) 返回新数组
数组 setData(data.map(...)) 返回新数组,修改目标项
相关推荐
芝士爱知识a2 小时前
AI 模拟面试怎么做:智蛙公考智能体多轮对话 + 实时追问的工程实现
面试·职场和发展
KaMeidebaby3 小时前
卡梅德生物技术快报|蛋白 N 端测序在重组贻贝融合蛋白表征中的应用,解决原核表达序列偏移工艺难题
前端·人工智能·物联网·算法·百度
帅次3 小时前
Android 高级工程师面试:Java 基础知识 近1年高频追问 22 题
android·java·面试
kyriewen4 小时前
我筛了 1400 个 Claude Code Skills,留下 5 个天天在用的
前端·ai编程·claude
JNX_SEMI4 小时前
AT2401C 2.4GHz 全集成射频前端单芯片技术解析
前端·单片机·嵌入式硬件·物联网·硬件工程
anOnion4 小时前
Agentic 前端开发之 实时显示 AI Agent 终端输出
前端·javascript·人工智能
随风一样自由5 小时前
【前端领域】2026最新前端领域全梳理(框架/工具/AI/跨端/底层标准/就业趋势)
前端·人工智能·前端框架
这是个栗子5 小时前
【前端性能优化】优化数据加载:用 Promise.all 从串行到并行
前端·javascript·性能优化·异步编程·前端优化·promise.all
fei_sun5 小时前
黑洞路由(Null Route/空接口路由)
服务器·前端·javascript
大爱一家盟5 小时前
告别卡点BGM同质化 2026原创卡点音乐素材下载网站 TOP5 推荐
大数据·前端·人工智能