React 入门:像搭积木一样写页面,10 分钟上手 JSX

101 阅读5分钟

前言

还在用原生 JavaScript 一点点 createElementappendChild 拼页面吗?
还在为了 HTML 和 JS 的频繁切换 感到头疼吗?

在学完一段时间 JavaScript 之后,我也遇到了同样的问题: 会写 JS,但写页面又累又乱。
于是我开始接触前端框架,而 React,几乎是所有前端学习路线里绕不开的一站。

这篇文章是一份 React 入门学习笔记,带你理解 React 在“爽”什么。

一、React 是什么?一句话先立住

如果用一句话来形容 React,它就是一个让你可以像搭积木一样写网页的 JS 框架:把页面拆成组件,用 JSX 把 HTML 和 JS 写在一起,再用声明式的方式描述界面,而不用自己频繁操作 DOM。写页面时,你只需要关心——当前的数据,应该对应什么样的界面

二、开局第一步:搭建 React 项目

想玩 React,第一步一定是:把项目跑起来

2.1create-react-app(CRA)

官方提供的“傻瓜式”脚手架,一条命令就能创建项目:

npx create-react-app my-react-app
cd my-react-app
npm start

优点是不用关心 webpack / babel,非常适合第一次上手 React

缺点则是项目偏重,启动速度相对慢一些

2.2Vite(更推荐)

现在更主流、也更轻量的选择:

npm create vite@latest
# 选择 React + JavaScript
cd my-vite-react
npm install
npm run dev

Vite 的特点就是一个字: 。冷启动、热更新体验都非常好。

三、JSX:React 真正“爽”的地方

JSX 看起来像 HTML,其实是 JavaScript 的语法扩展

3.1一个核心规则

JSX 中只能写“表达式”,不能写“语句”

  • 表达式:变量、三元运算、map
  • 语句:ifforswitch

JSX 里如果要写 JS,必须用 {} 包起来。

3.2实战一:列表渲染

原生 JS 写列表,通常要这样:

<ul id="list"></ul>

<script>
  const arr = ['1', '2', '3'];
  const ul = document.getElementById('list');

  for (let i = 0; i < arr.length; i++) {
    const li = document.createElement('li'); // 创建元素
    li.textContent = arr[i];                 // 设置内容
    ul.appendChild(li);                      // 插入到页面
  }
</script>

可以看到,哪怕只是渲染一个最简单的列表,也需要手动创建元素、设置内容,再逐个插入到 DOM 中,步骤相对固定且偏繁琐。

而在 React 里,用 map 就能搞定:

export default function App() {
  const arr = ['1', '2', '3'];

  return (
    <ul>
      {arr.map((item, index) => (
        <li key={index}>{item}</li>
      ))}
    </ul>
  );
}

React 的写法更像是在描述结果:“我需要一个由这些数据组成的列表”,
而不是一步步告诉浏览器如何操作 DOM。

3.3实战二:条件渲染

JSX 里不能直接写 if,但可以用 三元表达式逻辑与

export default function App() {
  const flag = true;

  return (
    <div>
      <h2>{flag ? '我比她高' : '她比我高'}</h2>
      <p>{flag && '只有 flag 为 true 才能看到我'}</p>
    </div>
  );
}

四、样式处理:React 中怎么写 CSS?

4.1行内样式

注意两点:样式是 对象,属性名是 小驼峰

export default function App() {
  const styleObj = {
    color: 'red',
    fontSize: '20px'
  };

  return <div style={styleObj}>玉米</div>;
}

另外,JSX 要求返回的元素必须被同一个父节点包裹,否则会直接报错。

4.2className

import './index.css';

export default function App() {
  return <div className="home">首页</div>;
}

JSX 中不能用 class,要用 className

4.3动态类名

export default function App() {
  const isActive = true;

  return (
    <div className={`box ${isActive ? 'active' : ''}`}>
      动态样式
    </div>
  );
}

className 本质是一个字符串,因此可以配合条件表达式,按需拼接不同的样式类名。

五、事件绑定:从 onclick 到 onClick

事件名使用 小驼峰onClick,绑定的是 函数本身,而不是字符串,JSX 中用 {} 来包裹 JS 表达式

5.1最常见写法:绑定一个事件函数

export default function App() {
  const handleClick = () => {
    console.log('点击了');
  };
  //<div onClick={handleClick()}>点我</div>❌
  return <div onClick={handleClick}>点我</div>;
}

注意:不要加 () ,否则会立刻执行。

5.2事件传参:为什么一定要包一层箭头函数?

实际开发中,事件函数几乎都会用到参数,比如点击某一项列表。

export default function App() {
  const songs = [
    { id: 1, name: '稻香' },
    { id: 2, name: '夜曲' }
  ];

  const handler = (name) => {
    console.log(name);
  };

  return (
    <ul>
      {songs.map(item => (
        <li
          key={item.id}
          onClick={() => handler(item.name)}
        >
          {item.name}
        </li>
      ))}
    </ul>
  );
}

onClick 接收的是一个函数,所以需要用 箭头函数包一层,点击时再调用真正的处理函数。

六、组件化:React 的灵魂

React 的核心思想之一就是 组件化

鼓励把页面拆成独立组件,每个组件只负责一块界面。这样的结构更清晰,也更容易维护,页面复杂度增加时优势尤为明显。

6.1定义组件

// Head.jsx —— 头部组件
export default function Head() {
  return (
    <header>
      <h1>我的 React 博客</h1>
    </header>
  );
}

// Main.jsx —— 主体内容组件
export default function Main() {
  const songs = [
    { id: 1, name: '稻香' },
    { id: 2, name: '夜曲' }
  ];

  return (
    <main>
      <h2>热门歌曲</h2>
      <ul>
        {songs.map(item => (
          <li key={item.id}>{item.name}</li>
        ))}
      </ul>
    </main>
  );
}

6.2组合组件

// App.jsx(根组件)
import Head from './Head';
import Main from './Main';

export default function App() {
  return (
    <div>
      {/* 引入并使用头部组件 */}
      <Head />

      {/* 引入并使用主体组件 */}
      <Main />
    </div>
  );
}

6.3组件是如何渲染到页面上的?

前面我们写的所有组件,最终都需要通过一个入口文件渲染到页面中。在使用 Vite 或 create-react-app 创建的 React 项目中,这个入口文件通常叫做 main.jsx(或 index.jsx)。

// main.jsx —— 项目入口文件
import React from 'react';
import ReactDOM from 'react-dom/client';
import App from './App.jsx';
import './index.css';

// 将 App 根组件挂载到 index.html 中的 root 节点
ReactDOM.createRoot(document.getElementById('root')).render(
  <App />
);

这段代码只做了一件事: 找到页面中的 #root 容器,然后把 App 组件渲染进去。
之后我们写的所有组件,都会通过 App 这一层逐级展示到页面上。


最后

React 并不是“魔法”,它只是帮我们把 重复、繁琐、容易出错的 DOM 操作 封装了起来。
React 的开发流程非常清晰:首先,使用 CRA 或 Vite 创建项目,并在 main.jsx 中挂载根组件;
然后,通过 JSX 编写组件,使用表达式处理列表渲染、条件判断和事件绑定;
最后,将页面拆分成多个小组件,按需组合成完整页面。

当你开始用 组件 + JSX 思考页面时,写前端就像搭积木一样顺畅,不再困扰于复杂的 DOM 操作。
如果你和我一样,是在学完 JS 后第一次接触 React,希望这篇文章能帮你少走一些弯路。