React 入门

Posted on 2026-03-26 11:22  打杂滴  阅读(1)  评论(0)    收藏  举报

JSX(JavaScript XML)是一种 JavaScript 的语法扩展,它允许开发者在 JavaScript 代码中使用类似 HTML 的语法来描述用户界面。虽然 JSX 看起来像 HTML,但它实际上是一种语法糖,最终会被编译成标准的 JavaScript 对象,通常是 React.createElement() 调用。

1.React 应用程序是由 组件 组成的。一个组件是 UI(用户界面)的一部分,它拥有自己的逻辑和外观。组件可以小到一个按钮,也可以大到整个页面。

React 组件是返回标签的 JavaScript 函数:

function MyButton() {
return (
<button>我是一个按钮</button>
);
}

至此,你已经声明了 MyButton,现在把它嵌套到另一个组件中:

export default function MyApp() {
return (
<div>
<h1>欢迎来到我的应用</h1>
<MyButton />
</div>
);
}

你可能已经注意到 <MyButton /> 是以大写字母开头的。你可以据此识别 React 组件。React 组件必须以大写字母开头,而 HTML 标签则必须是小写字母。

export default 关键字指定了文件中的主要组件。

function MyButton() {
return (
<button>
我是一个按钮
</button>
);
}

export default function MyApp() {
return (
<div>
<h1>欢迎来到我的应用</h1>
<MyButton />
</div>
);
}

 

2.使用 JSX 编写标签

 

上面所使用的标签语法被称为 JSX。它是可选的,但大多数 React 项目会使用 JSX,主要是它很方便。

JSX 比 HTML 更加严格。你必须闭合标签,如 <br />。你的组件也不能返回多个 JSX 标签。你必须将它们包裹到一个共享的父级中,比如 <div>...</div> 或使用空的 <>...</> 包裹:

function AboutPage() {
return (
<>
<h1>关于</h1>
<p>你好。<br />最近怎么样?</p>
</>
);
}

如果你有大量的 HTML 需要移植到 JSX 中,你可以使用 在线转换器

3.添加样式

在 React 中,你可以使用 className 来指定一个 CSS 的 class。它与 HTML 的 class 属性的工作方式相同:

<img className="avatar" />

然后,你可以在一个单独的 CSS 文件中为它编写 CSS 规则:

/* 在你的 CSS 文件中修改 */
.avatar {
border-radius: 50%;
}

React 并没有规定你如何添加 CSS 文件。最简单的方式是使用 HTML 的 <link> 标签。如果你使用了构建工具或框架,请阅读其文档来了解如何将 CSS 文件添加到你的项目中。

4.显示数据

JSX 会让你把标签放到 JavaScript 中。而大括号会让你 “回到” JavaScript 中,这样你就可以从你的代码中嵌入一些变量并展示给用户。例如,这将显示 user.name:

return (
<h1>
{user.name}
</h1>
);

你还可以将 JSX 属性 “转义到 JavaScript”,但你必须使用大括号 而非 引号。例如,className="avatar" 是将 "avatar" 字符串传递给 className,作为 CSS 的 class。但 src={user.imageUrl} 会读取 JavaScript 的 user.imageUrl 变量,然后将该值作为 src 属性传递:

return (
<img
className="avatar"
src={user.imageUrl}
/>
);

你也可以把更为复杂的表达式放入 JSX 的大括号内,例如 字符串拼接:

const user = {
name: 'Hedy Lamarr',
imageUrl: 'https://i.imgur.com/yXOvdOSs.jpg',
imageSize: 90,
};

export default function Profile() {
return (
<>
<h1>{user.name}</h1>
<img
className="avatar"
src={user.imageUrl}
alt={'Photo of ' + user.name}
style={{
width: user.imageSize,
height: user.imageSize
}}
/>
</>
);
}

 

image

 

image

 

 在上面示例中,style={{}} 并不是一个特殊的语法,而是 style={ } JSX 大括号内的一个普通 {} 对象。当你的样式依赖于 JavaScript 变量时,你可以使用 style 属性。

 

 条件渲染

React 没有特殊的语法来编写条件语句,因此你使用的就是普通的 JavaScript 代码。使用 if 语句根据条件引入 JSX:


import React, { useState } from 'react';

// 用户登录状态组件
function UserGreeting() {
  const [isLoggedIn, setIsLoggedIn] = useState(false);

  const handleLogin = () => {
    setIsLoggedIn(true);
  };

  const handleLogout = () => {
    setIsLoggedIn(false);
  };
 
  if(isLoggedIn)
  {
    return (
      <div>
        <h1>欢迎回来</h1>
        <button onClick={handleLogout}> 登出 </button>
      </div>
    );
  }
  else
  {
    return (
       <div>
        <h1>请登录</h1>
        <button onClick={handleLogin}> 登录 </button>
      </div>
    );
  }
}

// 数据加载状态组件
function DataLoader() {
  const [status, setStatus] = useState('loading'); // 'loading', 'success', 'error'

  const statusMap = {
    loading: <p>加载中...</p>,
    success: <p>数据加载成功!</p>,
    error: <p>加载失败,请点击重试</p>
  };

  return (
    <div>
      {statusMap[status]}
      <div style={{ marginTop: 10 }}>
        <button onClick={() => setStatus('loading')}>模拟加载中</button>
        <button onClick={() => setStatus('success')} style={{ margin: '0 10px' }}>
          模拟加载成功
        </button>
        <button onClick={() => setStatus('error')}>
          模拟加载失败
        </button>
      </div>
    </div>
  );
}

// 主应用组件
export default function App() {
  return (
    <div>
      <h2>用户登录状态示例</h2>
      <UserGreeting />
      <h2>数据加载状态示例</h2>
      <DataLoader />
    </div>
  );
}
 

image

 使用 条件 ? 运算符

  if(isLoggedIn)
  {
    return (
      <div>
        <h1>欢迎回来</h1>
        <button onClick={handleLogout}> 登出 </button>
      </div>
    );
  }
  else
  {
    return (
       <div>
        <h1>请登录</h1>
        <button onClick={handleLogin}> 登录 </button>
      </div>
    );
  }
可改为:
return (
    <div>
      {isLoggedIn ? (
        <h1>欢迎回来</h1>
      ) : (
        <h1>请登录~</h1>
      )}
      <button onClick={isLoggedIn ? handleLogout : handleLogin}>
        {isLoggedIn ? '登出' : '登录'}
      </button>
    </div>
  );

useState 是一个 React Hook,它允许你向组件添加一个 状态变量。

const [isLoggedIn, setIsLoggedIn] = useState(false); 这行代码是 React 中使用 useState Hook 来创建和管理组件状态的一种方式。

具体解释如下:

useState 是 React 提供的一个 Hook,用于在函数组件中添加状态管理功能。
useState(false) 表示初始化状态变量 isLoggedIn 的值为 false。通常在用户登录场景中,false 表示用户未登录,true 表示用户已登录。
isLoggedIn 是状态变量的名称,用于存储当前的登录状态。
setIsLoggedIn 是一个函数,用于更新 isLoggedIn 的值。例如,当用户点击登录按钮时,可以通过调用 setIsLoggedIn(true) 将登录状态设置为 true;当用户点击登出按钮时,可以通过调用 setIsLoggedIn(false) 将登录状态设置为 false。

 

渲染列表 

你将依赖 JavaScript 的特性,例如 for 循环array 的 map() 函数 来渲染组件列表。

在 JavaScript 中,const 是一个关键字,用于声明常量。它表示所声明的变量在初始化后不能被重新赋值。

 

const products = [
  { title: '卷心菜', isFruit: false, id: 1 },
  { title: '大蒜', isFruit: false, id: 2 },
  { title: '苹果', isFruit: true, id: 3 },
];

export default function ShoppingList() {
  const listItems = products.map(product =>
    <li
      key={product.id}
      style={{
        color: product.isFruit ? 'magenta' : 'darkgreen'
      }}
    >
      {product.title}
    </li>
  );

  return (
    <ul>{listItems}</ul>
  );
}

image

 

响应事件
你可以通过在组件中声明 事件处理 函数来响应事件:

  export default function MyButton() {
  function handleClick() {
    alert('You clicked me!');
  }

  return (
    <button onClick={handleClick}>
      点我
    </button>
  );
}

image

 注意,onClick={handleClick} 的结尾没有小括号!不要 调用 事件处理函数:你只需 把函数传递给事件 即可。当用户点击按钮时 React 会调用你传递的事件处理函数。

更新界面
通常你会希望你的组件 “记住” 一些信息并展示出来,比如一个按钮被点击的次数。要做到这一点,你需要在你的组件中添加 state。

首先,从 React 引入 useState:

import { useState } from 'react';

----------------------------------------

import { useState } from 'react';

export default function MyApp() {
  return (
    <div>
      <h1>独立更新的计数器</h1>
      <MyButton />
      <MyButton />
    </div>
  );
}

function MyButton() {
  const [count, setCount] = useState(0);

  function handleClick() {
    setCount(count + 1);
  }

  return (
    <button onClick={handleClick}>
      点了 {count} 次
    </button>
  );
}

image

 

使用 Hook
以 use 开头的函数被称为 Hook。useState 是 React 提供的一个内置 Hook。你可以在 React API 参考 中找到其他内置的 Hook。你也可以通过组合现有的 Hook 来编写属于你自己的 Hook。

Hook 比普通函数更为严格。你只能在你的组件(或其他 Hook)的 顶层 调用 Hook。如果你想在一个条件或循环中使用 useState,请提取一个新的组件并在组件内部使用它。

 

组件间共享数据

import { useState } from 'react';

export default function MyApp() {
  const [count, setCount] = useState(0);

  function handleClick() {
    setCount(count + 1);
  }

  return (
    <div>
      <h1>共同更新的计数器</h1>
      <MyButton count={count} onClick={handleClick} />
      <MyButton count={count} onClick={handleClick} />
    </div>
  );
}

function MyButton({ count, onClick }) {
  return (
    <button onClick={onClick}>
      点了 {count} 次
    </button>
  );
}

image

使用这种方式传递的信息被称作 prop。此时 MyApp 组件包含了 count state 以及 handleClick 事件处理函数,并将它们作为 prop 传递给 了每个按钮。

 

代码结构分析:
1. 状态管理
const [count, setCount] = useState(0); 使用 useState Hook 创建了一个状态变量 count,初始值为 0
setCount 是用于更新 count 值的函数
2. 事件处理函数
handleClick 函数通过 setCount(count + 1) 来增加计数器的值
这个函数被传递给两个 MyButton 组件
3. 组件结构
MyApp 是主组件,负责管理共享状态
两个 MyButton 组件都接收相同的 count 和 onClick props
每个按钮都显示相同的计数,因为它们共享同一个状态
4. Props 传递机制
count={count}:将父组件的 count 状态传递给子组件
onClick={handleClick}:将事件处理函数传递给子组件
子组件通过 MyButton({ count, onClick }) 接收这些 props
运行效果:
当用户点击任意一个按钮时,两个按钮都会同时更新显示新的计数值。这是因为两个按钮组件都引用了父组件 MyApp 中的同一个 count 状态。

核心概念:
状态提升‌:将共享状态放在共同的父组件中管理
Props 传递‌:通过 props 向子组件传递数据和函数
状态同步‌:多个组件共享同一状态,实现同步更新

博客园  ©  2004-2026
浙公网安备 33010602011771号 浙ICP备2021040463号-3