React16源码: React中event事件系统初始化源码实现

终端渲染原理:React+Yoga+Canvas高性能实现解析 终端渲染并非简单的DOM输出,而是融合声明式UI、增量布局与跨平台文本绘制的精密系统。其核心在于将日志流结构化处理、解耦布局计算与像素绘制,并通过Yoga引擎实现高精度等宽字体测量与零GC布局。相比传统DOM方案,该架构显著规避强制同步布局(Layout Thrashing)和V8垃圾回收压力,使高频日志场景下仍保持60fps流畅滚动。典型应用场景包括IDE插件、AI编程助手桌面端及CLI可视化面板——尤其适用于需兼顾响应速度与视觉一致性的Electron或Tauri项目。本文深入剖析从React Reco 阅读详情

event 事件系统初始化


1 )概述

  • react事件系统比较的复杂,它是基于dom的事件系统
  • 在dom事件系统上面进行了一个深度的封装
  • 它里面的很多实现逻辑都是自由的一套
  • 在初始化 react-dom 的源码的时候,会为react的事件系统注入 reactdom 相关的一些插件
  • 因为react事件系统,它有一个独立的模块,这个模块是一个公用性质的模块
  • 就是说它是可以给 react-dom 用,也可以给 react-native 用
  • 不同平台它们的事件系统可能会不一样,这个时候就对于不同的平台
  • 它们要去使用同一个 event 模块的时候,使用注入的方式来注入一些跟平台相关的逻辑在里面
  • 在这个模块,也是有一部分核心的内容是全平台通用的,这部分内容是react抽象出来的
  • 我们关注平台插件注入的一个流程,以及它插入之后到底做了什么事情
    • 首先要确定一个插件注入的顺序
      • 因为在react当中它的插件执行是会按照顺序来的
      • 如果不按顺序来,可能会出现一定的问题
    • 然后要注入插件模块
    • 最后要计算 registationNameModules 等属性
  • 在之前 completeWork 的时候,初始化 dom 节点的时候
    • 要去绑定 props 对应的 dom 的 attributes 的时候
    • 就有遇到过这个 registationNameModules 属性

2 )源码

定位到 packages/react-dom/src/client/ReactDOM.js#L20

import './ReactDOMClientInjection';

再次定位到 packages/react-dom/src/client/ReactDOMClientInjection.js

/**
 * Copyright (c) Facebook, Inc. and its affiliates.
 *
 * This source code is licensed under the MIT license found in the
 * LICENSE file in the root directory of this source tree.
 */

import * as EventPluginHub from 'events/EventPluginHub';
import * as EventPluginUtils from 'events/EventPluginUtils';

import {
  getFiberCurrentPropsFromNode,
  getInstanceFromNode,
  getNodeFromInstance,
} from './ReactDOMComponentTree';
import BeforeInputEventPlugin from '../events/BeforeInputEventPlugin';
import ChangeEventPlugin from '../events/ChangeEventPlugin';
import DOMEventPluginOrder from '../events/DOMEventPluginOrder';
import EnterLeaveEventPlugin from '../events/EnterLeaveEventPlugin';
import SelectEventPlugin from '../events/SelectEventPlugin';
import SimpleEventPlugin from '../events/SimpleEventPlugin';

/**
 * Inject modules for resolving DOM hierarchy and plugin ordering.
 */
EventPluginHub.injection.injectEventPluginOrder(DOMEventPluginOrder);
EventPluginUtils.setComponentTree(
  getFiberCurrentPropsFromNode,
  getInstanceFromNode,
  getNodeFromInstance,
);

/**
 * Some important event plugins included by default (without having to require
 * them).
 */
EventPluginHub.injection.injectEventPluginsByName({
  SimpleEventPlugin: SimpleEventPlugin,
  EnterLeaveEventPlugin: EnterLeaveEventPlugin,
  ChangeEventPlugin: ChangeEventPlugin,
  SelectEventPlugin: SelectEventPlugin,
  BeforeInputEventPlugin: BeforeInputEventPlugin,
});
  • 看到它 import 了一大堆的东西,后续只是调用了3个方法

    • injectEventPluginOrder
    • setComponentTree 这个先跳过
    • injectEventPluginsByName
  • 看下 EventPluginHub.injection.injectEventPluginOrder(DOMEventPluginOrder);

    • 这个 DOMEventPluginOrder
      // packages/react-dom/src/events/DOMEventPluginOrder.js
      const DOMEventPluginOrder = [
        'ResponderEventPlugin',
        'SimpleEventPlugin',
        'EnterLeaveEventPlugin',
        'ChangeEventPlugin',
        'SelectEventPlugin',
        'BeforeInputEventPlugin',
      ];
      
      export default DOMEventPluginOrder;
      
      • 它单纯的 export 出来了一个数组
      • 这个数组可以看到有6项,每一项都以一个 Plugin 为结尾的
      • 这些 plugin 都是在 react-dom 这个环境当中要用到的 plugin
      • 这边只是用来定义这些 plugin 它的一个顺序
  • 后续 EventPluginHub.injection.injectEventPluginsByName 这个方法的参数

    • 发现这里少了一个 ResponderEventPlugin 先不管
  • 关注下 EventPluginHub 这个模块下的 injection

    /**
     * Methods for injecting dependencies.
     */
    export const injection = {
      /**
       * @param {array} InjectedEventPluginOrder
       * @public
       */
      injectEventPluginOrder,
    
      /**
       * @param {object} injectedNamesToPlugins Map from names to plugin modules.
       */
      injectEventPluginsByName,
    };
    
    • 上述内部这两个方法来自 ./EventPluginRegistry.js 进入
      /**
       * Injects an ordering of plugins (by plugin name). This allows the ordering
      * to be decoupled from injection of the actual plugins so that ordering is
      * always deterministic regardless of packaging, on-the-fly injection, etc.
      *
      * @param {array} InjectedEventPluginOrder
      * @internal
      * @see {EventPluginHub.injection.injectEventPluginOrder}
      */
      export function injectEventPluginOrder(
        injectedEventPluginOrder: EventPluginOrder,
      ): void {
        invariant(
          !eventPluginOrder,
          'EventPluginRegistry: Cannot inject event plugin ordering more than ' +
            'once. You are likely trying to load more than one copy of React.',
        );
        // Clone the ordering so it cannot be dynamically mutated.
        // 克隆一个可动态修改的数组
        eventPluginOrder = Array.prototype.slice.call(injectedEventPluginOrder);
        recomputePluginOrdering();
      }
      
      /**
       * Injects plugins to be used by `EventPluginHub`. The plugin names must be
      * in the ordering injected by `injectEventPluginOrder`.
      *
      * Plugins can be injected as part of page initialization or on-the-fly.
      *
      * @param {object} injectedNamesToPlugins Map from names to plugin modules.
      * @internal
      * @see {EventPluginHub.injection.injectEventPluginsByName}
      */
      export function injectEventPluginsByName(
        injectedNamesToPlugins: NamesToPlugins,
      ): void {
        let isOrderingDirty = false;
        // 遍历对象上的 pluginName
        for (const pluginName in injectedNamesToPlugins) {
          // 非本身拥有,则跳过
          if (!injectedNamesToPlugins.hasOwnProperty(pluginName)) {
            continue;
          }
          const pluginModule = injectedNamesToPlugins[pluginName];
          if (
            !namesToPlugins.hasOwnProperty(pluginName) ||
            namesToPlugins[pluginName] !== pluginModule
          ) {
            invariant(
              !namesToPlugins[pluginName],
              'EventPluginRegistry: Cannot inject two different event plugins ' +
                'using the same name, `%s`.',
              pluginName,
            );
            // 重新注入 module
            namesToPlugins[pluginName] = pluginModule;
            isOrderingDirty = true; // 设置这个 isOrderingDirty 状态
          }
        }
        if (isOrderingDirty) {
          recomputePluginOrdering(); // 调用这个方法
        }
      }
      
      • 上述 namesToPlugins 本来就是一个 空的对象
      • 进入 recomputePluginOrdering
        /**
         * Recomputes the plugin list using the injected plugins and plugin ordering.
        *
        * @private
        */
        function recomputePluginOrdering(): void {
          if (!eventPluginOrder) {
            // Wait until an `eventPluginOrder` is injected.
            return;
          }
          // 遍历在 injectEventPluginsByName 方法中处理好的 namesToPlugins 对象
          for (const pluginName in namesToPlugins) {
            const pluginModule = namesToPlugins[pluginName];
            const pluginIndex = eventPluginOrder.indexOf(pluginName); // 拿到注入顺序
            invariant(
              pluginIndex > -1,
              'EventPluginRegistry: Cannot inject event plugins that do not exist in ' +
                'the plugin ordering, `%s`.',
              pluginName,
            );
            // plugins 初始化的时候,是一个空的数组,存在则跳过
            if (plugins[pluginIndex]) {
              continue;
            }
            invariant(
              pluginModule.extractEvents,
              'EventPluginRegistry: Event plugins must implement an `extractEvents` ' +
                'method, but `%s` does not.',
              pluginName,
            );
            // 注意,这里的 index 是从 eventPluginOrder 的顺序插入的,而非有序插入,这里可能会造成数组中的某几项为 undefined
            plugins[pluginIndex] = pluginModule;
            const publishedEvents = pluginModule.eventTypes; // click, change, focus 等类型
            for (const eventName in publishedEvents) {
              invariant(
                // 注意这里
                publishEventForPlugin(
                  publishedEvents[eventName], // 注意这个数据结构
                  pluginModule,
                  eventName,
                ),
                'EventPluginRegistry: Failed to publish event `%s` for plugin `%s`.',
                eventName,
                pluginName,
              );
            }
          }
        }
        
        • 关于 eventTypes
          const eventTypes = {
            // 这个 对应 dom 中的真实事件,比如 change 事件 document.addEventListener('change', () => {})
            // 这个 change 代表 event name 存在
            // 这个 value 对应上面的 dispatchConfig
            change: {
              // 事件的阶段,有冒泡和捕获 两个阶段,对应react中 使用的事件 props 名称
              phasedRegistrationNames: {
                bubbled: 'onChange',
                captured: 'onChangeCapture', // 这个 props 不常用,用于在绑定捕获阶段的事件监听
              },
              // 监听 change 事件的同时,需要依赖绑定下面的事件
              dependencies: [
                TOP_BLUR,
                TOP_CHANGE,
                TOP_CLICK,
                TOP_FOCUS,
                TOP_INPUT,
                TOP_KEY_DOWN,
                TOP_KEY_UP,
                TOP_SELECTION_CHANGE,
              ],
            },
          };
          
          • eventTypes 这个对象里面还可以再加其他事件,以上是初始化时候挂载处理的 change 事件,参考下面
        • 对于 packages/react-dom/src/events/SimpleEventPlugin.js 里面监听了大部分的常用事件
          • 在这里面 会生成一个 type, 定位到 #L143 (143行)
            function addEventTypeNameToConfig(
              [topEvent, event]: EventTuple,
              isInteractive: boolean,
            ) {
              const capitalizedEvent = event[0].toUpperCase() + event.slice(1);
              const onEvent = 'on' + capitalizedEvent;
            
              // 注意这里
              const type = {
                phasedRegistrationNames: {
                  bubbled: onEvent,
                  captured: onEvent + 'Capture',
                },
                dependencies: [topEvent],
                isInteractive,
              };
              eventTypes[event] = type;
              topLevelEventsToDispatchConfig[topEvent] = type;
            }
            
        • 进入 publishEventForPlugin
          /**
           * Publishes an event so that it can be dispatched by the supplied plugin.
          *
          * @param {object} dispatchConfig Dispatch configuration for the event.
          * @param {object} PluginModule Plugin publishing the event.
          * @return {boolean} True if the event was successfully published.
          * @private
          */
          function publishEventForPlugin(
            dispatchConfig: DispatchConfig,
            pluginModule: PluginModule<AnyNativeEvent>,
            eventName: string,
          ): boolean {
            invariant(
              !eventNameDispatchConfigs.hasOwnProperty(eventName),
              'EventPluginHub: More than one plugin attempted to publish the same ' +
                'event name, `%s`.',
              eventName,
            );
            // 这里 eventNameDispatchConfigs 的结构
            // { change: ChangeEventPlugin.eventTypes.change }
            eventNameDispatchConfigs[eventName] = dispatchConfig;
          
            // 获取事件 内部的 phasedRegistrationNames
            const phasedRegistrationNames = dispatchConfig.phasedRegistrationNames;
            if (phasedRegistrationNames) {
              for (const phaseName in phasedRegistrationNames) {
                if (phasedRegistrationNames.hasOwnProperty(phaseName)) {
                  const phasedRegistrationName = phasedRegistrationNames[phaseName];
                  publishRegistrationName(
                    phasedRegistrationName,
                    pluginModule,
                    eventName,
                  );
                }
              }
              return true;
            } else if (dispatchConfig.registrationName) {
              publishRegistrationName(
                dispatchConfig.registrationName,
                pluginModule,
                eventName,
              );
              return true;
            }
            return false;
          }
          
          • 进入 publishRegistrationName
            /**
             * Publishes a registration name that is used to identify dispatched events.
            *
            * @param {string} registrationName Registration name to add.
            * @param {object} PluginModule Plugin publishing the event.
            * @private
            */
            function publishRegistrationName(
              registrationName: string,
              pluginModule: PluginModule<AnyNativeEvent>,
              eventName: string,
            ): void {
              invariant(
                !registrationNameModules[registrationName],
                'EventPluginHub: More than one plugin attempted to publish the same ' +
                  'registration name, `%s`.',
                registrationName,
              );
              // onChange: ChangeEventPlugin
              registrationNameModules[registrationName] = pluginModule;
              // onChange: [TOP_BLUR ...]
              registrationNameDependencies[registrationName] =
                pluginModule.eventTypes[eventName].dependencies;
            
              if (__DEV__) {
                const lowerCasedName = registrationName.toLowerCase();
                possibleRegistrationNames[lowerCasedName] = registrationName;
            
                if (registrationName === 'onDoubleClick') {
                  possibleRegistrationNames.ondblclick = registrationName;
                }
              }
            }
            
        • 关于 const publishedEvents = pluginModule.eventTypes; 这里,可参考 packages/react-dom/src/events/ChangeEventPlugin.js#L258
          const ChangeEventPlugin = {
            eventTypes: eventTypes,
          
            _isInputEventSupported: isInputEventSupported, // 这个 _isInputEventSupported 是一个私有标志位
            
            // 这个 extractEvents 是生成事件,比如 onChange 事件对应的事件对象的
            extractEvents: function(
              topLevelType,
              targetInst,
              nativeEvent,
              nativeEventTarget,
            ) {
              const targetNode = targetInst ? getNodeFromInstance(targetInst) : window;
          
              let getTargetInstFunc, handleEventFunc;
              if (shouldUseChangeEvent(targetNode)) {
                getTargetInstFunc = getTargetInstForChangeEvent;
              } else if (isTextInputElement(targetNode)) {
                if (isInputEventSupported) {
                  getTargetInstFunc = getTargetInstForInputOrChangeEvent;
                } else {
                  getTargetInstFunc = getTargetInstForInputEventPolyfill;
                  handleEventFunc = handleEventsForInputEventPolyfill;
                }
              } else if (shouldUseClickEvent(targetNode)) {
                getTargetInstFunc = getTargetInstForClickEvent;
              }
          
              if (getTargetInstFunc) {
                const inst = getTargetInstFunc(topLevelType, targetInst);
                if (inst) {
                  const event = createAndAccumulateChangeEvent(
                    inst,
                    nativeEvent,
                    nativeEventTarget,
                  );
                  return event;
                }
              }
          
              if (handleEventFunc) {
                handleEventFunc(topLevelType, targetNode, targetInst);
              }
          
              // When blurring, set the value attribute for number inputs
              if (topLevelType === TOP_BLUR) {
                handleControlledInputBlur(targetNode);
              }
            },
          };
          
  • 通过以上操作,插入了所有的plugin之后,形成了这边的几个变量

    • let eventPluginOrder: EventPluginOrder = null; 数据结构如下
      [
        'ResponderEventPlugin', 
        'SimpleEventPlugin', 
        'EnterLeaveEventPlugin', 
        'ChangeEventPlugin', 
        'SelectEventPlugin', 
        'BeforeInputEventPlugin'
      ];
      
    • export const plugins = []; 数据结构如下
      [
          {
              eventTypes:{},
              extractEvents:function,
              otherProps
          },
          ....
      ]
      
    • export const eventNameDispatchConfigs = {};
      {
          click:{
              dependencies:['click'],
              phasedRegistrationNames:{
                  bubbled: "onClick"
                  captured: "onClickCapture"
              },
              isInteractive: true
          }
      }
      
    • const namesToPlugins: NamesToPlugins = {};
      {
          SimpleEventPlugin:{
              eventTypes:{},
              extractEvents:function,
              otherProps
          },
          // ...其他插件
      }
      
    • export const registrationNameModules = {};
      {
          onClick:{
              eventTypes:{},
              extractEvents:function,
              otherProps
          },
          ...
      }
      
    • export const registrationNameDependencies = {};
      {
          onClick: ["click"],
          onChange: [
              "blur", "change", "click", "focus", "input", "keydown",keyup", "selectionchange
              ],
          ....
      }
      
  • 把这几个变量维护好之后,后面可以很方便的进行一些事件绑定相关的操作

  • 对于事件注入这个模块,是初始化事件的前置任务

  • 重点关注最终拿到的几个完成注册之后的变量的数据格式

  • 以上就是把整个事件的插件它注入到react事件系统当中的过程

手把手实现ReACT LLM Agent:Python异步状态机工程实践 ReACT是一种将大语言模型推理过程显式结构化为‘推理-行动-观察-思考’闭环的智能体设计范式,其本质是可控、可观测、可调试的外部状态机,而非黑箱提示工程。它通过强制模型输出结构化动作指令(如Action/Action Input),再由代码层解析、调用真实工具、清洗Observation并反馈,从而实现与外部世界的可靠交互。相比Chain-of-Thought,ReACT的核心技术价值在于工程可控性——支持断点调试、日志追踪、异常拦截与重试策略,是构建生产级AI Agent的基石。典型应用场景包括多步骤信 阅读详情

相关推荐

React快照测试原理与工程实践:结构校验而非截图

React快照测试是一种基于组件渲染输出结构的自动化校验机制,其核心在于将JSX转换为可序列化的JavaScript对象,再通过文本比对实现UI结构稳定性保障。它依托Jest测试框架与react-test-renderer轻量渲染器,利用确定性序列化(如pretty-format)生成可版本控制的.sanp文件,有效解决props变更、条件渲染、className调整等导致的UI回归问题。相比视觉截图,它具备零环境依赖、高执行效率、Git友好Diff等工程优势,特别适用于Design System原子组件、

weixin_33701294的博客 311

在react中使用event(事件对象),如何使用,注意事项和react中如何定义和使用函数?

定义使用方式和function一样的区别在于箭头函数没有自己的this指向,只会向上继承父级的this指向,如果父级没有this指向还会继续向上检索执行后的效果。

Youyzq的博客 2400

Claude Agent Teams实战:从ReAct循环到多智能体协同架构

多Agent系统是现代AI工程的核心范式,其本质是将复杂任务分解为可验证、可调度、可容错的智能体协作流程。基于ReAct(推理-行动-观察-反思)原理,每个Agent需具备结构化约束生成、契约化工具调用、事件驱动状态迁移三大能力。技术价值在于提升任务成功率、降低运维不确定性、实现错误可追溯与自动降级。典型应用场景包括电商库存协同、金融风控闭环、跨系统客服自动化等。本文聚焦Claude API原生集成,详解如何绕过CLI陷阱、规避base_url配置错误、解决token超限与状态漂移问题,构建生产就绪的轻量级

weixin_33802505的博客 399

React中events的踩坑指南

本文介绍react项目中如何创建events来进行跨组件事件触发重点讲解自定义参数传递,和如何拿到最新的state值🌟。

分享前端知识,记录前端进阶 908

浅谈React Event实现原理

React 元素的事件处理和 DOM元素的很相似。但是有一点语法上的不同: React事件绑定属性的命名采用驼峰式写法,而不是小写。 如果采用 JSX 的语法你需要传入一个函数作为事件处理函数,而不是一个字符串(DOM元素的写法) 并且 React 自己内部实现了一个合成事件,使用 React 的时候通常你不需要使用 addEventListener 为一个已创建的 DOM 元素添加监听器。你仅仅需要在这个元素初始渲染的时候提供一个监听器。 我们看一下这是怎么实现的 React 事件机制分为 事件注册,和事件分发,两个部分 事件注册 // 事件绑定 function handleCl

数据结构与算法——7-2 一元多项式的乘法与加法运算 (20分)

设计函数分别求两个一元多项式的乘积与和。 输入格式: 输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一个多项式非零项系数和指数(绝对值均为不超过1000的整数)。数字间以空格分隔。 输出格式: 输出分2行,分别以指数递降方式输出乘积多项式以及和多项式非零项的系数和指数。数字间以空格分隔,但结尾不能有多余空格。零多项式应输出0 0。 输入样例: 4 3 4 -5 2 6 1 -2 0 3 5 20 -7 4 3 1 输出样例: 15 24 -25 22 30 21 -10 2

qazwsxxxxxasd的博客 1484

React - 初始化项目的步骤

1,使用 create-react-app 快速构建 React 开发环境 create-react-app 自动构建的项目是基于 Webpack + ES6 $ cnpm install -g create-create-app $ create-react-app my-app $ cd my-app $ npm start 在浏览器中访问 http://localhost:3000/...

M_wolf的博客 1595

【原创理论】Stochastic Coupled Dyadic System (SCDS):一个用于两性关系动力学建模的随机耦合系统框架

基于二人爱情耦合系统动力学、稳定性与最优策略的综合性理论的数值模拟与分析

weixin_44695861的博客 1138

React16源码: React中event事件触发的源码实现

它是出于对各种系统的一个兼容调用的一个方法来进行一个 Polyfill。,这个 target 就是我们 event 对象上面的 target。我们真正的每一个节点上面,如果有绑定这个事件,它就会调用它的一个回调。这就是事件触发的整个流程, 非常的繁琐,有各种各样的方法,嵌套的调用。到这里为止,这边的 listener 就已经被调用了。batchedUpdates 里面调用的方法是。

Wang的专栏 1978

优化Cartographer重定位速度:从子图筛选到参数调优的完整思路

本文详细介绍了优化Cartographer重定位速度的完整方法,从子图筛选到参数调优,帮助工程师在已知初始位姿的前提下将重定位耗时降低50%以上。重点分析了性能瓶颈、子图筛选策略、匹配算法选择及环境自适应的参数优化策略,并通过实战案例展示了显著效果提升。

weixin_28704565的博客 465

MySQL 8.0数据库崩了别慌!手把手教你仅凭一个.ibd文件找回数据(附Go工具包)

本文详细介绍了在MySQL 8.0数据库崩溃后,如何仅凭.ibd文件恢复数据的完整流程。通过使用Go语言工具包和ALTER TABLE技巧,即使没有备份也能实现数据重生。文章包含从环境准备到数据验证的全方位指导,帮助DBA和开发者应对紧急数据恢复场景。

weixin_29235923的博客 421

React——event

1.绑定在React元素上的事件与绑定在DOM元素上的事件非常相似,但是也有一个不同的地方 React事件使用驼峰命名法命名 //在HTML中 <button onclick='handle()'></button> //在React中 <button onClick={handle}></button> 在React中不能...

weixin_30699741的博客 414

DICOM图像知识:深入详解DICOM的层级关系

解析DICOM的四个主要层级:Patient(患者)、Study(检查)、Series(序列)和SOP(服务-对象对),探讨它们之间的关系、各自的唯一标识符以及在实际应用中的用途

编程技术探索者,分享C/C++、C#、Java、数据库等开发经验,聚焦实战技巧与AI兴趣,助力编程爱好者成长。 3305

React16源码: React中event事件监听绑定的源码实现

在 react-dom 代码初始化的时候,去注入了平台相关的事件插件,接下去在react的更新过程绑定了事件的操作,在执行到 completeWork 的时候,对于 HostComponent 会一开始就先去执行了 finalizeInitialChildren 这个方法

Wang的专栏 1481

基于STM32L4XX的环境光传感器(VCNL4040M3OE)应用程序设计

• 集成模块:红外发射器(IRED)、环境光传感器(ALS)、接近传感器(PS)及信号调理IC。#define VCNL4040_I2C_ADDR (0x60 << 1) // 7位地址左移一位。// 组合成16位值。// I2C总线句柄。// 设置参数:ALS集成时间160ms,中断禁止,ALS功能开启。// 设置参数:PS工作频率80Hz,开红外二极管,PS功能开启。// 初始化I2C外设。• 输出类型:I2C总线(ALS/PS)// 2. 配置环境光传感器 (ALS) 并启动。

myron6688的博客 144

学 Simulink——基于载波移相的级联 H 桥双向 DC-AC 逆变器仿真

本文手把手教程基于载波移相(CPS-SPWM)的三相级联H桥双向DC-AC逆变器仿真,通过Simulink实现N=3(七电平)、每模块200V直流源、1kHz开关频率的系统建模。核心在于载波相位错开60°,使谐波集中于6kHz边带,等效开关频率达6kHz,显著降低器件损耗与输出纹波。结合并网电流双闭环(dq解耦)、功率/电压/SoC均衡控制及死区补偿,验证了THD<2%、有功跟踪误差<5%、直流电压与SoC均衡收敛至±3%和2%以内。工程上适用于高压储能系统,具备模块化、故障容错与高电能质量优势

MHD0815的博客 260

制作渐变背景生成器 - React State和Event教程(1)

好,这个渐变背景生成器现在就把它写完了,你也可以把它扩展一下,比如可以自定义渐变的角度,选择多个颜色等等。今天用它把 React 的 state 和 event 两个概念讲了一下,也很简单,是不是?Props 的值是只读不可变的,改变它的值不会引起组件更新。自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。深知大多数前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。

2401_83621499的博客 1011

Agent Skills应用解析:构建可扩展、高效率AI探员

Agent Skills是一个简洁而强大的概念:它是一个包含组织化的指令、脚本和资源的文件夹,智能体可以动态地发现并加载这些内容,以在特定任务中表现更佳。可组合性(Composability):一个Agent Skill是一个独立的、封装良好的能力单元。开发者可以为不同的功能(例如PDF处理、网络浏览、数据分析)创建独立的技能,然后根据需要将它们组合起来,赋能不同的智能体。这意味着不再需要为每个用例构建碎片化、定制设计的智能体,而是可以通过组合现有技能来快速构建新的专业智能体。

形上得其象,形下合于数;阴阳自济,玄理自明。 1628

React与Unity WebGL双向通信:原理、实现与性能优化

在现代Web开发中,前端框架与3D渲染引擎的深度整合已成为构建复杂可视化应用的关键需求。其核心原理在于建立JavaScript与WebAssembly之间的高效通信桥梁,通过事件驱动与消息传递机制实现数据同步。这一技术方案的核心价值在于能够将React声明式UI的高效状态管理与Unity强大的实时渲染能力相结合,从而突破传统Web应用在交互体验上的局限。在实际工程实践中,开发者常需处理序列化、性能优化与跨平台兼容性等挑战,尤其是在数字孪生、在线教育、互动营销等需要高保真3D展示与复杂业务逻辑并行的应用场景中

蓝色妖姬 1022

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

React 360实战指南:用React语法驱动Three.js构建3D Web应用

React 360并非React的3D扩展,而是一个以React为声明式接口、Three.js为底层渲染引擎、Node.js为构建中枢的三维Web应用框架。其核心原理在于将JSX组件映射为Three.js的Scene/Camera/Renderer对象,通过自定义渲染器实现状态驱动的3D变换。技术价值体现在大幅降低3D开发门槛——开发者无需掌握WebGL着色器或矩阵运算,即可利用React的组件化、状态管理与生命周期构建可维护的全景与空间应用。典型应用场景包括360°虚拟展厅、交互式产品展示、空间导览系统及

weixin_30463341的博客 395

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

react相关面试题

react相关面试题

weixin_47808575的博客 1058

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

从零构建React+TypeScript项目:CRA脚手架实战与类型安全开发指南

在现代前端开发中,静态类型检查是提升代码健壮性和团队协作效率的关键技术。TypeScript作为JavaScript的超集,通过编译时类型检查,能有效捕获潜在的类型错误,提供更智能的代码提示和重构能力。其核心价值在于为大型应用和团队协作提供了可靠的类型安全保障,显著降低维护成本。这一技术广泛应用于构建复杂交互的单页应用、企业级中后台管理系统等场景。本文聚焦于使用React官方脚手架create-react-app(CRA)快速集成TypeScript,深入解析项目初始化、组件开发、状态管理等核心环节,并分享

a359798678的博客 320

Morearty.js完全指南:React集中式状态管理的终极解决方案

Morearty.js 是一个基于 React 的轻量级状态管理库,通过 mixin 实现,以纯 JavaScript 提供类似 Om 的集中式状态管理能力。它利用 Facebook 的 Immutable 库实现不可变数据结构,帮助开发者构建高效、可预测的 React 应用。 ## 为什么选择 Morearty.js?核心优势解析 🚀 ### 简化状态管理流程 Morearty.js 引

gitblog_00698的博客 419

React 音效工程化:Web Audio API 与 React 生命周期协同实践

音效在现代 Web 应用中已不仅是装饰,而是关键的交互反馈机制。其底层依赖 Web Audio API 这一实时信号处理系统,而非简单的 HTMLAudioElement 播放器。理解 AudioContext 状态机(suspended/running/closed)、节点生命周期管理及用户手势激活时机,是保障音效稳定响应的前提。结合 React 的 useEffect 清理机制、并发控制与组件挂载状态,可构建可预测、可复用、可销毁的音频能力。典型场景如按钮点击反馈、表单验证提示、游戏化进度音效和后台任务

weixin_30861459的博客 488

1.vue和react一起学 (*^_^*)

先对比一下vue与react各自的creatElement函数。 vue <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> &lt

l_b_c的博客 438

如何在React应用中实现专业级的拖拽排序功能?React SortableJS实战指南

在构建现代化Web应用时,拖拽排序已成为提升用户体验的关键交互方式。React SortableJS作为SortableJS的React绑定库,为开发者提供了在React生态中实现高效、流畅拖拽排序的专业解决方案。该库完美解决了React组件状态管理与DOM操作之间的协调问题,让复杂的拖拽交互变得简单直观。 ## 🔧 核心架构解析:React与SortableJS的完美融合 React So

gitblog_00860的博客 226
上一篇: React16源码: React中处理hydrate的核心流程源码实现
下一篇: React16源码: React中event事件监听绑定的源码实现
Wang's Blog
博客等级 码龄12年 7438粉丝 2421原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wang's Blog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值