初识 React :响应式数据与状态管理

146 阅读3分钟

在上一篇文章中,我们对 Vue 有了初步的认识,了解了 Vue 组件的基本概念以及如何使用组件来渲染静态数据。在这篇接续文章中,我们将探讨 React 中的响应式数据和状态管理,通过分析 App.jsx 文件来进一步理解 React 的强大功能。

代码分析

首先,让我们来看一下 App.jsx 文件的代码:

import './App.css'
 function App() {
   //react 比vue 更纯粹
   const todos = ['吃饭', '睡觉', '打豆豆'];
   return (
     <>
       <table>
         <thead>
           <tr>
             <th>序号</th>
             <th>任务</th>
           </tr>
         </thead>
         <tbody>
           {
             todos.map((item,index)=>(
               `
               <tr>
                 <td>${index+1}</td>
                 <td>${item}</td>
               </tr>
               `
               )
             )
           }
         </tbody>
       </table>
     </>
   )
 }

export default App

按照以前js和vue的角度,这串代码好像没什么问题,但是浏览器打开却是这样:

image.png

我们检查一下看看就破案了:

image.png

两层标签?意思是说 react 自带一层是吗?那我不是就可以直接在内部写 js 代码了?有点意思,改一下:

<tbody>
  {
    todos.map((item,index)=>(
       <tr>
         <td>{index+1}</td>
         <td>{item}</td>
       </tr>
      )
    )
  }
</tbody>

问题解决了:

image.png

代码问题

有经验的开发者肯定看出我们的代码是“死的”这个问题,没有动态交互,任务永远都是“吃饭睡觉打豆豆”。

那有问题我们就解决一下吧:

先展示完整代码和效果:

import { useState } from 'react'
import './App.css'
function App() {
  // 数据 -> 数据状态 数据业务 改变的 数据状态
  const [todos,setTodos] = useState(['吃饭', '睡觉', '打豆豆']);
  const [title,setTitle] = useState('Hello React');
  setTimeout(()=>{
    setTodos(['学习'])
    setTitle('不 Hello')
  },2000);
  return (
    <div>
      <h1 className='title'>{title}</h1>
      <table>
        <thead>
          <tr>
            <th>序号</th>
            <th>任务</th>
          </tr>
        </thead>
        <tbody>
          {
            // html 模板
            todos.map((item,index)=>(
              <tr>
                <td>{index+1}</td>
                <td>{item}</td>
              </tr>
              )
            )
          }
        </tbody>
      </table>
    </div>
  )
}
export default App

屏幕录制 2025-06-04 224214.gif

1. 引入必要的模块

import { useState } from 'react'
import './App.css'

这里我们引入了 useState 钩子,它是 React 中用于管理状态的重要工具。同时,为了看起来舒服一点,我们引入了 App.css 文件,用于为组件添加样式。

2. 状态管理

const [todos, setTodos] = useState(['吃饭', '睡觉', '打豆豆']);
const [title, setTitle] = useState('Hello React');

useState 是一个 React 钩子,用于在函数组件中添加状态。它接受一个初始值作为参数,并返回一个数组,数组的第一个元素是当前状态的值,第二个元素是一个函数,用于更新该状态。

在这个例子中,我们定义了两个状态:todostitletodos 是一个数组,初始值为 ['吃饭', '睡觉', '打豆豆']title 是一个字符串,初始值为 'Hello React'

3. 状态更新

setTimeout(() => {
  setTodos(['学习']);
  setTitle('不 Hello');
}, 2000);

我们使用 setTimeout 函数在 2 秒后更新 todostitle 的状态。setTodossetTitle 分别是用于更新 todostitle 状态的函数。当这些状态更新时,React 会自动重新渲染组件,以反映最新的状态。

4. JSX 渲染

return (
  <div>
    <h1 className='title'>{title}</h1>
    <table>
      <thead>
        <tr>
          <th>序号</th>
          <th>任务</th>
        </tr>
      </thead>
      <tbody>
        {
          todos.map((item, index) => (
            <tr>
              <td>{index + 1}</td>
              <td>{item}</td>
            </tr>
          ))
        }
      </tbody>
    </table>
  </div>
)

return 语句中,我们使用 JSX 语法来定义组件的 UI。{title} 是一个 JSX 表达式,用于插入 title 状态的值。todos.map 方法用于遍历 todos 数组,并为每个元素生成一个 <tr> 元素。

5. 样式应用

App.css 文件中,我们定义了一个 .title 类:

.title {
  background-color: rgb(137, 99, 129);
  color: yellow;
}

这个样式会应用到 <h1> 元素上,使标题具有特定的背景颜色和文字颜色。

总结

通过这个例子,我们深入了解了 React 中的状态管理和响应式数据。useState 钩子让我们可以在函数组件中轻松地管理状态,并且当状态更新时,React 会自动重新渲染组件,以反映最新的状态。这种响应式的设计使得我们可以更专注于业务逻辑,而不必手动操作 DOM。

在后续的学习中,我们可以进一步探索 React 的其他特性,如组件间通信、生命周期方法、上下文 API 等,以构建更复杂的应用程序。