了解了这些你就掌握了 React(上)

1. 前言

本文将以 React 和 Vue3 进行同步对比,带大家快速掌握 React。这个系列分为上下两篇,上篇内容包括:

  • 组件
  • JSX
  • 插值
  • 数据通信
  • 渲染
  • 事件
  • 状态

下篇包括:

  • 元素引用
  • 跨级传值
  • Portals
  • Suspense
  • Error Boundaries
  • Hooks

2. 组件

第一次遇见"组件"是比较抽象的,实际上,它相当于电路板上的电阻、电容、变压器、二极管等等元器件,这些元器件共同组成了一块电路板。

同理,网页中的一个个UI块就是一个个元器件,它们被称为"组件",这些组件共同构成了一张完整的UI界面。

Vue:

html 复制代码
<MyHeader />
<MyMain />
<MyFooter />

React:

html 复制代码
<MyHeader />
<MyMain />
<MyFooter />

3. JSX

组件的本质是 JS 函数,以 MyHeader 组件为例:

Vue:

ts 复制代码
// MyHeader.ts
export default {
  template: '<div>MyHeader</div>',
};

// SFC
// MyHeader.vue
<template>
  <div>MyHeader</div>
</template>

React:

ts 复制代码
// MyHeader.tsx
export default function MyHeader() {
  return <div>MyHeader</div>;
}

在 React 中返回了一串 HTML 标记,这种语法被称为 JSX,它等价于:

tsx 复制代码
React.createElement('div', null, 'MyHeader');

注意:Vue 中也支持 JSX 语法(搭配插件:@vitejs/plugin-vue-jsx):

tsx 复制代码
// MyHeader.tsx
import { defineComponent } from 'vue';

export const MyHeader = defineComponent({
  setup() {
    return () => <div>MyHeader</div>;
  },
});

4. 插值

在Vue中插值使用一对双大括号表示,而在React中使用一对大括号。

Vue:

tsx 复制代码
<h1>Hello, {{ msg }}.</h1>

React:

tsx 复制代码
<h1>Hello, {msg}.</h1>

5. 数据通信

数据的通信分为传值和传组件,都是从外部传入。

5.1 传值

通过自定义属性进行传值。

Vue:

tsx 复制代码
// 父组件
<Coding who="me" />
<Coding who="you" />
<Coding who="them" />

// Coding.vue
<script setup>
defineProps(['who']);
</script>

<template>
  <div>Coding for {{ who }}.</div>
</template>

React:

tsx 复制代码
// 父组件
<Coding who={'me'} />
<Coding who={'you'} />
<Coding who={'them'} />

// Coding.tsx
export default function Coding(props: { who: string }) {
  return <div>Coding for {props.who}.</div>;
}

5.2 传组件

通过插槽来传组件,这就像游戏机的卡槽、电脑边上的各种接口。

Vue:

tsx 复制代码
// 父组件
<MyCard>This is my card.</MyCard>
<MyCard>
  <Coding who="boss" />
</MyCard>

// MyCard.tsx
<template>
  <div :style="{ border: '1px solid #000' }">
    <slot></slot>
  </div>
</template>

React:

tsx 复制代码
// 父组件
<MyCard>This is my card.</MyCard>
<MyCard>
  <Coding who={'boss'} />
</MyCard>

// MyCard.tsx
export default function MyCard({ children }: { children: React.ReactNode }) {
  return <div style={{ border: '1px solid #000' }}>{children}</div>;
}

6. 渲染

6.1 列表渲染

Vue:

tsx 复制代码
const list = [
  { id: 1, name: '🍎', price: 6 },
  { id: 2, name: '🍌', price: 3 },
  { id: 3, name: '🍐', price: 5 },
];

<ul>
  <li v-for="item in list" :key="item.id">
    {{ item.name }}-{{ item.price }}
  </li>
</ul>

React:

tsx 复制代码
<ul>
  {list.map((item) => (
    <li key={item.id}>
      {item.name}-{item.price}
    </li>
  ))}
</ul>

6.2 条件渲染

Vue:

tsx 复制代码
const visible = false;

<p v-if="visible">显示</p>
<p v-else>隐藏</p>

React:

tsx 复制代码
const visible = false;

{visible ? <p>显示</p> : <p>隐藏</p>}

7. 事件

在网页中可以实现很多交互功能,借助于各种事件:点击事件、鼠标移动事件、键盘点击事件......

Vue:

tsx 复制代码
<form
  @submit="
    (e) => {
      e.preventDefault();
      console.log('提交了');
    }
  "
>
  <input @change="(e) => console.log('内容变化了:', e.target.value)" />
  <button @click="() => console.log('点我了')">点我提交</button>
</form>

React:

tsx 复制代码
<form
  onSubmit={(e) => {
    e.preventDefault();
    console.log('提交了');
  }}
>
  <input onChange={(e) => console.log('内容变化了:', e.target.value)} />
  <button onClick={() => console.log('点我了')}>点我提交</button>
</form>

8. 状态

在 Vue 中使用 ref(响应式引用)、reactive(响应式对象) 方法来管理状态,而在 React 中则使用 useState 方法。

Vue:

tsx 复制代码
import { ref } from 'vue';

const count = ref(0);

<p>
  {{ count }}
  <button @click="() => count++">+1</button>
</p>

React:

tsx 复制代码
import { useState } from 'react';

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

<p>
  {count}
  <button onClick={() => setCount(count + 1)}>+1</button>
</p>
  1. 用户点击按钮,触发 setCount
  2. 更新状态 count
  3. {count} 读取新状态

技术交流:

  • 公众号:见嘉 Being Dev
  • v:with_his_x
相关推荐
LaughingZhu9 小时前
Product Hunt 每日热榜 | 2026-05-21
前端·人工智能·经验分享·chatgpt·html
怕浪猫9 小时前
Electron 开发实战(一):从零入门核心基础与环境搭建
前端·electron·ai编程
小鹏linux10 小时前
Ubuntu 22.04 部署开源免费具有精美现代web页面的Casdoor账号管理系统
linux·前端·ubuntu·开源·堡垒机
前端若水11 小时前
会话管理:创建、切换、删除对话历史
前端·人工智能·python·react.js
Bigger11 小时前
mini-cc:一个轻量级 AI 编程助手的诞生
前端·ai编程·claude
涵涵(互关)11 小时前
Naive-ui树型选择器只显示根节点
前端·ui·vue
BY组态12 小时前
Ricon组态系统最佳实践:从零开始构建物联网监控平台
前端·物联网·iot·web组态·组态
BY组态12 小时前
Ricon组态系统vs传统组态软件:为什么选择新一代Web组态平台
前端·物联网·iot·web组态·组态
SoaringHeart12 小时前
Flutter进阶:OverlayEntry 插入图层管理器 NOverlayZIndexManager
前端·flutter
放下华子我只抽RuiKe512 小时前
React 从入门到生产(四):自定义 Hook
前端·javascript·人工智能·深度学习·react.js·自然语言处理·前端框架