Skip to main content

Command Palette

Search for a command to run...

[Learn With Agent] JSX & React Components

Updated
[Learn With Agent] JSX & React Components

前言

这是Learn With Agent 的第一篇博客,这个系列(不知道有没有后续了)是想通过agent辅助进行快速的学习(过概念)掌握一些相关的知识。之后再通过agent辅助开发,应该也能做出来个7788。对于AI还有很多思考,另起一个博客再说吧就。

因为网络和经费原因,这里使用的是CC+GLM 4.6 & Gemini 系列。🈚️广,文字为百分百人类手敲&传统CV大法。

JSX

JSX是React生态中占据很重要的部分,JSX是一种语法拓展,它可以允许用户在js中写类似html的标签结构。 JSX还是一种描述UI的方式。对于react component,JSX像是镜像,而react component更像容器,它的作用就是将JSX渲染成真实的DOM。

// 1. 这是一个 React 组件(函数)
function Welcome(props) {
  // 2. 组件在它的 return 语句中使用了 JSX
  return (
    // 这是 JSX,它描述了一个 <h1> 和一个 <p> 标签的 UI 结构
    <div>
      <h1>Hello, {props.name}!</h1>
      <p>这是 Welcome 组件的内容。</p>
    </div>
  );
  // 3. 这个 JSX 最终会被组件返回
}

JSX 渲染机制

bundle.js 文件

JSX 本质上是 JavaScript 的一个扩展语法。浏览器或 Node.js 环境(在没有额外配置的情况下)并不能直接识别

这样的 JSX 标签。因此,它们必须被转换成普通的 JavaScript 代码。 如果是一个简单的在线demo,比如从cdn中直接引入babel,它会实时运行,并且把jsx转换为React.createElement调用。 在一个CICD流水线中,会通过webpack、vite等工具将所有jsx转换为浏览器可以识别的bundle.js 文件。这个bundle.js文件中已经不含任何 JSX 语法了。

运行时渲染&虚拟dom

转译后的代码进入浏览器后,React库本身会接管整个渲染过程。 React.createElement 调用不会直接生成DOM元素,而是返回一个轻量级的JavaScript对象,我们称之为React元素(React Element)。 主要是因为浏览器操作真实dom会有昂贵的开销,所以说React引入了虚拟dom的概念。 虚拟dom是一个轻量级的JavaScript对象,它描述了真实dom的结构。当组件的状态发生变化时,React会重新渲染组件,并且对比前后两次渲染的虚拟dom差异,只更新必要的部分到真实dom中。它存在的唯一目的就是为了提高性能,尤其是在需要频繁更新UI的应用中。

Components

react中组件的作用

react中组件的主要作用就是封装ui以及交互逻辑。和后端的microservices很像,组件的主要作用除了用就是为了复用 :)

一个简单的组件的例子:

    const Avatar = ({ imageUrl, name }) => {
      return (
        <div className="grandchild-component">
          <h5>📸 头像组件 (组件)</h5>
          <img
            src={imageUrl || `https://picsum.photos/seed/${name}/50/50.jpg`}
            alt={`${name}的头像`}
            style={{width: '50px', height: '50px', borderRadius: '50%'}}
          />
        </div>
      );
    };

一个页面往往由多个组件构成,这也是前端工程化组件化的思想之一

  const App = () => {       
    return (           
      <div>                    
        <BasicJSXDemo />      // 独立的功能组件
        <ComparisonDemo />    // 独立的对比演示组件 
        <DynamicDataDemo />   // 独立的数据展示组件                                 
        <InteractiveDemo />   // 独立的交互演示组件                                 
      div>                                                                       
    );                                                                           
  };

父子组件

父子组件顾名思义

来拿我们后端的内容做对比的话:

组件层级 ≈ 容器编排层级 (K8s: Pod → Service → Deployment)

Props传递 ≈ 配置传递 (ConfigMap → Pod)

事件回调 ≈ 事件通知 (Webhook/Alert Manager)

组件复用 ≈ 模板复用 (Terraform/Helm Chart)

父子组件的实际应用

父子组件关系就像现实中的父子关系一样,父组件负责管理和协调,子组件负责具体的业务逻辑实现。

React中,数据是单向流动的,从父组件流向子组件,这个设计模式被称为"单向数据流"。这样可以避免数据管理的混乱,让组件之间的依赖关系更加清晰。

// 父组件
const UserProfile = () => {
  const [userName, setUserName] = useState("张三");
  const [userAge, setUserAge] = useState(25);

  // 父组件定义的事件处理函数
  const handleAgeChange = (newAge) => {
    setUserAge(newAge);
  };

  return (
    <div className="parent-component">
      <h3>用户资料</h3>
      {/* 通过props将数据传递给子组件 */}
      <UserAvatar
        name={userName}
        age={userAge}
        onAgeChange={handleAgeChange}  // 将回调函数传递给子组件
      />
    </div>
  );
};

// 子组件
const UserAvatar = ({ name, age, onAgeChange }) => {
  const handleClick = () => {
    // 子组件调用父组件传递的回调函数
    onAgeChange(age + 1);
  };

  return (
    <div className="child-component">
      <h4>头像:{name}</h4>
      <p>年龄:{age}</p>
      <button onClick={handleClick}>增加年龄</button>
    </div>
  );
};

通过合理地使用父子组件的结构,可以构建出更加清晰、可维护的react project。

More from this blog

Go 隐式接口与模板方法

前言 今天在使用testify框架写单元测试的时候有这样一个需求: 对于一个方法来说,可能会有很长的上下文链路数据。 按照正常的单元测试流程,这个时候我们需要按照接口的逻辑来事先mock好原始未处理的数据,并且定义最终想要的数据结果。定义好不同的test case 尽可能的覆盖到每一个if else,才可以通过后续的ci 流程。 对于一些特殊的case,我们需要一些特殊的操作: 测试前置处理-> 运行测试代码 -> 测试后处理 需要在测试前后对数据进行预处理,如:事先存入一些数据,测试后再删除...

Nov 13, 2025
Go 隐式接口与模板方法

一次Nginx 403 的问题排查

前言&问题复现 参与了一个内部效率提升项目(边角料项目)后要发到内部的测试机器上。内部的测试机器上并没有配置集群,没有一个专门的ingress或者说是网关来处理请求分发。 并且这个测试机器属于多个部门,导致机器环境很复杂,一台物理机安装有多个nginx,有直接host安装的,也有在容器上运行的。 由于这是一个内部项目,没有必要专门部署一个minio,but 项目需要上传文件,所以就直接保存在server的目录下,简单配置了一下nginx的配置,配置如下: location /static...

Oct 18, 2025
一次Nginx 403 的问题排查

提示词以及常见优化技巧

prompt 种类 system : 系统提示词用于统一设定当前会话下ai的行为,例如设定ai的行为、语气、风格或限制。用户不会显式观察到系统提示词,但是会影响到用户和ai的后续对话。 user : 这是用户实际向ai提出的问题,这是对话的起点。 assistant: 这是ai对于用户问题的回答,通常也会被添加到上下文中,供下一次对话进行参考,所以也属于prompt的范畴。 prompt 格式 标准格式: <Instruction> 问答格式: <Question>? 零样本提示 ...

Aug 14, 2025
提示词以及常见优化技巧

Http 长连接 & 短连接详解

网络连接基础 TCP/IP TCP/IP,是几乎所有互联网通信的基石。HTTP、WebSocket 和 常见的RPC框架尽管功能各异,但都运行在应用层,并从根本上依赖传输层的 TCP(传输控制协议)来实现可靠的、面向连接的数据传输 。 TCP 的核心职责是确保数据包从发送端到接收端可靠、按序且无损地传输 。这包括序列号、确认、流量控制和拥塞控制等机制。在网络层,IP(互联网协议)负责网络路由和寻址,使数据能够跨越不同网络到达其目的地 。现代操作系统普遍内置并管理 TCP/IP 协议栈,从而为应用...

Jun 13, 2025
E

Ekreke's Blog

11 posts