Monaco Editor系列(八)插入自定义DOM、删除指定位置的单词、给特定单词着色

前言:人都不知道自己是谁,所以想让自己成为什么样的人,就多给自己说什么样的话。我爱学习!学习使我快乐!回顾一下上一篇文章的内容。还记得 Monaco Editor 的三个命名空间吗?分别是 editorlanguagesworkerCodeLensCompletion 自动完成配置都归languages 管,因为是针对不同语言进行的配置。并且用法非常的类似,都是注册一个 Provider,然后传参类型也类似,就是名字都好长啊🙀🙀🙀

  • 编辑器中的 git 提交记录提示是用 CodeLens 实现的,使用 monaco.editor.registerCodeLensProvider 注册 CodeLens
    参数一通常使用语言字符串,如 javascript
    参数二是一个对象,接口类型为 CodeLensProvider,通常只填一个属性 provideCodeLenses 就可以
    provideCodeLenses 属性是一个方法,最终要返回一个对象,对象里面有一个属性 lenses 表示配置项列表
    配置项列表的元素的几个关键属性:
    1、range 必填 其实只有 startLineNumber 有影响,因为 CodeLens 一定从第一列开始显示,并且不会多行显示
    2、id 非必填
    3、command 点击的时候触发的命令 非必填

    	var commandId = editor.addCommand(
        0,
        function () {
            alert('CodeLens被点击啦');
        },
        ""
    );
    monaco.languages.registerCodeLensProvider("javascript", {
        provideCodeLenses: function (model, token) {
            return {
                lenses: [
                    {
                        range: {
                            startLineNumber: 1,
                            startColumn: 1,
                            endLineNumber: 2,
                            endColumn: 1,
                        },
                        id: "First Line",
                        command: {
                            id: commandId,
                            title: "我是第一行",
                        },
                    },
                ],
            };
        },
    });
    
  • 使用API触发键盘事件有两种方式
    1、editor.trigger(source, handlerId) 第一个 source 是自己定义的一个字符串,随便写就行;第二个是 actionid
    2、先使用 editor.getAction(actionId) 获取 action 实例,然后再使用 actionrun() 方法执行对应的回调函数。

  • 内置的 actionid 可以通过打印 editor 获取,在 editor 实例的 _action 属性上

  • 自动补全功能使用 registerCompletionItemProvider,用法和上面的 CodeLens 的配置及其类似,但是就是配置自动补全的数组元素的配置项有一丢丢多。

    function createDependencyProposals(range) {
        return [
            {
                label: 'monaco',
                kind: monaco.languages.CompletionItemKind.Reference,  // 控制图标
                documentation: "定义一个不能修改的常量",  // 点击右侧按钮出现在下边,详细说明
                detail: '我是detail属性',  // 出现在选项的最右侧,几个字的内容
                insertText: 'console.log("monaco可真是太好用了")',  // 实际插入的代码
                range: range,  // 范围
                // tags: [monaco.languages.CompletionItemTag.Deprecated],  // 出现划线,表示不建议
                preselect: true, // 预选中
                // filterText: 'falsy',  // 不显示
                insertTextRules: monaco.languages.CompletionItemInsertTextRule.KeepWhitespace, // 插入的规则 InsertAsSnippet:作为代码块插入;KeepWhitespace:插入后自动格式化
                commitCharacters: ['a', 'b','c'], // 选中后输入这几个字符,自动插入代码和字符
                // additionalTextEdits: [
                //     {
                //         range: {
                //             startLineNumber: 1,
                //             startColumn: 1,
                //             endLineMumber: 1,
                //             endColumn:1
                //         },
                //         text: '// 这是一行额外加进来的代码',
                //         forceMoveMarkers: true,
                //     }
                // ],
                command: {
                    id: 'editor.action.commentLine',
                    title: '注释选中的行',
                }
    
            },
        ];
    }
    
    monaco.languages.registerCompletionItemProvider("javascript", {
        provideCompletionItems: function (model, position) {
            var word = model.getWordUntilPosition(position);
            var range = {
                startLineNumber: position.lineNumber,
                endLineNumber: position.lineNumber,
                startColumn: word.startColumn,
                endColumn: word.endColumn,
            };
            return {
                suggestions: createDependencyProposals(range),
            };
        },
    });
    

这篇文章继续来学习 monaco editor更多的功能吧!

一、插入自定义DOM

在编辑器中插入DOM的使用场景还是挺常见的,例如
查找单词的时候复现出来的查找框
在这里插入图片描述
编辑时候浮现出来的建议列表
在这里插入图片描述
以及 gitlab 中,给别人的合并请求添加修改建议的小框框
在这里插入图片描述
可以发现上面几个框框虽然都是独立于编辑区域的,但是显示上还是有区别的,搜索的框框和建议列表框框是浮在编辑器上的,给合并请求提建议的框框是插入到上下两行的中间的,会把两行撑开,并且不会占用行号。
所以其实 monaco 的编辑器之外的DOM有两种,一种是 IContentWidget,一种是 IOverlayWidget。

(一)IOverlayWidget

是一个渲染在文本之上的浮窗组件。查找组件就是用它实现的。

1、实例属性

我们先看一下接口定义。源码中有更详细的解释
out/monaco-editor/monaco.d.ts

export interface IOverlayWidget {
    // 是否允许组件溢出到编辑器外
    allowEditorOverflow?: boolean;
    // 设置唯一标识 字符串
    getId(): string;
    // 设置该组件要显示
    getDomNode(): HTMLElement;
    // 设置组件的显示位置 枚举值,有三个位置可选:右下角、顶部中心、右下角,如果返回 null 的话就会自适应
    getPosition(): IOverlayWidgetPosition | null;
    // 编辑器将会确保滚动宽度大于这个值
    getMinContentWidthInPx?(): number;
}
2、相关方法
  • addOverlayWidget(widget: IOverlayWidget): void 新增一个 IOverlayWidget。必须提供独一无二的 id,否则会被视为更新操作
  • layoutOverlayWidget(widget: IOverlayWidget): void 重新渲染 IOverlayWidget
  • removeOverlayWidget(widget: IOverlayWidget): void 移除 IOverlayWidget
    新增:
// 1、新增 OverlayWidget
editor.addOverlayWidget({
    getId: function() {
        return 'monaco.editor.ymj.overlay.widget'
    },
    getDomNode: function() {
        var domNode = document.createElement('div')
        domNode.style.cssText = 'position: absolute;background-color: red;'
        domNode.innerHTML = '我是一个叠加的Widget'
        return domNode
    },
    getPosition: function() {
        return {
            preference: monaco.editor.OverlayWidgetPositionPreference.TOP_RIGHT_CORNER,
            // preference: monaco.editor.OverlayWidgetPositionPreference.BOTTOM_RIGHT_CORNER,
            // preference: monaco.editor.OverlayWidgetPositionPreference.TOP_CENTER,
        }
    }
})

在这里插入图片描述
重新渲染,只能更改位置,不能更改 DOM 元素,样式、文本都不能改变

// 2、重新渲染 overlaywidget
setTimeout(function() {
    editor.layoutOverlayWidget({
        getId: function() {
            return 'monaco.editor.ymj.overlay.widget'
        },
        getPosition: function() {
            return {
                preference: monaco.editor.OverlayWidgetPositionPreference.TOP_CENTER,
            }
        }
    })
}, 2000)

在这里插入图片描述

删除,只需要指定id

// 3、移除 OverlayWidget
setTimeout(function() {
    editor.removeOverlayWidget({
        getId: function() {
            return 'monaco.editor.ymj.overlay.widget'
        }
    })
}, 4000)

这三个方法的传参都是传 OverlayWidget 对象,但是其实重新渲染的方法只需要传 getIdgetPosition,删除的方法只需要 getId

(二)IContentWidget

是出现在编辑区域附近的内容框框,和编辑的位置密切相关。

1、实例属性
export interface IContentWidget {
	// 是否允许组件溢出编辑器
	allowEditorOverflow?: boolean;
	// 是否阻止鼠标按下操作,如果设置为false,则用户可以点击组件
	suppressMouseDown?: boolean;
	// 唯一标识	
	getId(): string;
	// 创建的 DOM 元素
	getDomNode(): HTMLElement;
	// 位置信息
	getPosition(): IContentWidgetPosition | null;
	// 渲染之前会执行的函数 可以设置组件的宽高尺寸
	beforeRender?(): IDimension | null;
	// 渲染完成执行的回调 设置组件的显示位置
	afterRender?(position: ContentWidgetPositionPreference | null): void;
}

其中 getPosition() 的返回值比上面浮窗组件中的稍微复杂一些

export interface IContentWidgetPosition {
	// 组件被放置的坐标 包括 lineNumber、column
	position: IPosition | null;
	// 进一步定义组件的位置,必须和position在同一行,设置组件结束的位置
	secondaryPosition?: IPosition | null;
	// 枚举值 EXACT 精确位置 ABOVE 放在position的上方 BELOW 放在position的下方
	preference: ContentWidgetPositionPreference[];
	/**
	 * Placement preference when multiple view positions refer to the same (model) position.
	 * This plays a role when injected text is involved.
	*/
	// 枚举值 多个视图位置指向同一个(模型)位置的时候的位置偏好 Left 靠左放 Right 靠右放 None
	// LeftOfInjectedText 如果给定的位置是在注入的文本中,那么更偏好将视图放置在该文本的左侧。
	// RightOfInjectedText 如果给定的位置在注入的文本中,那么将视图放置该在文本的右侧
	// 注入文本时起作用
	positionAffinity?: PositionAffinity;
}

根据上面的定义,我们可以创建一个 IContentWidget

const newContentWidget = {
    allowEditorOverflow: true, // 允许组件溢出编辑器
    suppressMouseDown: true,  // 阻止鼠标事件
    getId: function() {
        return 'monaco.editor.ymj.content.widget'
    },
    getDomNode: function() {
        var domNode = document.createElement('div')
        domNode.style.cssText = 'position: absolute;background-color: red;width: 200px;height: 200px;'
        domNode.innerHTML = '我是一个内容组件';
        return domNode
    },
    getPosition: function() {
        return {
            position: {
                lineNumber: 1,
                column: 3
            },
            preference: [
                monaco.editor.ContentWidgetPositionPreference.EXACT
            ],
        }
    },
    beforeRender: function() {
        return {
            width: 200,
            height: 200
        }
    },
    afterRender: function() {
        console.log('afterRender')
    }
}
2、editor 上的相关方法
  • addContentWidget(widget: IContentWidget): void; 新增一个 IContentWidget。必须提供独一无二的 id,否则会被视为更新操作
  • layoutContentWidget(widget:IContentWidget): void 重新渲染 IContentWidget
  • removeContentWidget(widget: IContentWidget): void 移除 IContentWidget

1、新增

editor.addContentWidget(newContentWidget)

另外,根据源码中的注释, beforeRender 返回的宽高会被应用到组件上,但是通过实践,根本没用🤡

  • preference = [monaco.editor.ContentWidgetPositionPreference.EXACT] 会直接覆盖文字

在这里插入图片描述

  • preference: [ monaco.editor.ContentWidgetPositionPreference.BELOW ], 会在指定行的下面
    在这里插入图片描述

  • preference: [ monaco.editor.ContentWidgetPositionPreference.ABOVE ], 会在指定行的上面,如果指定的是第一行,它就溢出了,此时 allowEditorOverflow 属性的配置就起作用了,在代码中我们的 allowEditorOverflow: true
    在这里插入图片描述
    如果它是 allowEditorOverflow: false,直接就不显示了
    在这里插入图片描述
    2、重新渲染,依然是只能修改位置,不能修改 DOM元素

const updatedContentWidget = {
    getId: function() {
        return 'monaco.editor.ymj.content.widget'
    },
    getPosition: function() {
        return {
            position: {
                lineNumber: 3,
                column: 3
            },
            preference: [
                monaco.editor.ContentWidgetPositionPreference.BELOW
            ],
        }
    }
}

setTimeout(function() {
    editor.layoutContentWidget(updatedContentWidget)
}, 2000)

在这里插入图片描述

3、移除

setTimeout(function() {
    editor.removeContentWidget(newContentWidget)
}, 4000)

二、删除指定位置的单词

指定位置,我们就直接用光标所在的位置,那么就是说,点击光标后,延时两秒删除当前光标所在位置的单词
删除文本需要用到的方法是ITextModel 实例上的方法 applyEdits,这个方法用来修改文本,接收参数:
IIdentifiedSingleEditOperation

interface IIdentifiedSingleEditOperation {
    forceMoveMarkers?: boolean;  // 是否删除markers
    range: IRange;  // 修改文本的区域
    text: string;  // 修改成什么文本
}

text 设置为空字符串,即可实现删除的效果
通过下面两个方法,可以获取指定位置的单词的范围
getWordAtPosition
获取某个位置处的完整单词,位置必须在单词的闭区间内
getWordUntilPosition
获取该位置之前的完整单词,可能会截取单词
下面通过实际示例看一下它俩的不同
首先介绍一下一个枚举值:
monaco.editor.MouseTargetType 表示鼠标在哪里点击,如果是在文本上方点击,就是monaco.editor.MouseTargetType.CONTENT_TEXT,通过这个枚举值我们就可以控制只有鼠标落在文本上的时候再执行下面的操作
监听鼠标落下的方法:editor.onMouseDown(e=>{})

editor.onMouseDown(function(e) {
    // monaco.editor.MouseTargetType.CONTENT_TEXT:光标落在文本上
    if (e.target.type === monaco.editor.MouseTargetType.CONTENT_TEXT) {
        const model = editor.getModel()
        const position = e.target.position
        const word = model.getWordAtPosition(position)
        const word2 = model.getWordUntilPosition(position)
        console.log(word, word2)
    }
})

下面我们在一个单词的中间落下鼠标,看看这两个方法获得的结果有啥区别
在这里插入图片描述

可以看到,getWordAtPosition() 获取的是一整个单词,getWordUntilPosition() 获取的是单词截取到点击的位置
然后我们还需要组装一个 range,因为上述两个方法返回的没有行号,行号还要取 position 的行号

editor.onMouseDown(function(e) {
   // monaco.editor.MouseTargetType.CONTENT_TEXT:光标落在文本上
   if (e.target.type === monaco.editor.MouseTargetType.CONTENT_TEXT) {
       const model = editor.getModel()
       const position = e.target.position
       const word = model.getWordAtPosition(position)
       const word2 = model.getWordUntilPosition(position)
       const range = {
           startLineNumber: position.lineNumber,
           startColumn: word.startColumn,
           endLineNumber: position.lineNumber,
           endColumn: word.endColumn,
       }
       model.applyEdits([{
           range: range,
           text: ''
       }])
   }
})

点击编辑器中的 alert 单词
在这里插入图片描述
在这里插入图片描述
就会直接删除啦👻👻👻

三、给特定单词着色

前面我们讲过 defineTheme 方法,它可以定义主题,其中的 rules 属性可以规定给不同类型的 token 渲染不同的颜色。如果我们的项目中有一些关键词,我们想给它们一个名分,让它们显示出不一样的光彩,那么该怎么做呢?
首先我们需要给这些个特别的单词设置 token,需要用到的方法:setMonarchTokensProvider(languageId, languageDef)
第一个参数是语言,第二个参数 languageDef 类型是 IMonarchLanguage
只有一个必填的属性

tokenizer: {
    [name: string]: IMonarchLanguageRule[];
}

key 是表示匹配规则的字符串,IMonarchLanguageRule 是定义 token 匹配规则的数组,每一条匹配规则也是一个数组,匹配规则的第一个元素是匹配 token 的具体规则,第二个元素是 token 的名字。确实这么讲,有一丢丢绕哈哈,还是看具体代码吧

monaco.languages.setMonarchTokensProvider('javascript',{
    tokenizer:{
        root:[
            ['monaco', 'ymj-monaco'], // 常量
            [/ymj\w+/,'ymj-tip'], // ymj 后面跟字符
            [/\[[a-zA-Z 0-9:]+\]/, 'ymj-date'] // 以 [ 开头 以 ] 结尾
        ]
    }
})

然后注册完 token 之后需要定义主题,在主题里面给这些个 token 上色

monaco.editor.defineTheme('ymj-theme',{
    base: 'vs',
    inherit: true,
    rules: [
        { token: 'ymj-monaco', foreground: '#ad28ee', fontStyle: 'bold' },
        { token: 'ymj-tip', foreground: '#ad28ee', fontStyle: 'italic' },
        { token: 'ymj-date', foreground: '#ad28ee', fontStyle: 'underline' },
    ],
    colors: {}
})

这里有一个需要注意的点,就是创建编辑器必须在上述两个操作的后面,必须要先注册 token、注册 theme,然后再创建编辑器,主题就可以直接写到编辑器的配置对象中
完整代码:

require(['vs/editor/editor.main'], function() {
    const container = document.getElementById('container')
    // 定义tokens并特殊着色
    monaco.languages.setMonarchTokensProvider('javascript',{
        tokenizer:{
            root:[
                ['monaco', 'ymj-monaco'], // 常量
                [/ymj\w+/,'ymj-tip'], // ymj 后面跟字符
                [/\[[a-zA-Z 0-9:]+\]/, 'ymj-date'] // 以 [ 开头 以 ] 结尾
            ]
        }
    })
    monaco.editor.defineTheme('ymj-theme',{
        base: 'vs',
        inherit: true,
        rules: [
            { token: 'ymj-monaco', foreground: '#ad28ee', fontStyle: 'bold' }, // 加粗
            { token: 'ymj-tip', foreground: '#ad28ee', fontStyle: 'italic' }, // 斜体
            { token: 'ymj-date', foreground: '#ad28ee', fontStyle: 'underline' }, // 有下划线
        ],
        colors: {}
    })
    var editor = monaco.editor.create(container, {
        language: 'javascript',
        value: `
        console.log('ymjisbeautiful')
        console,log('[hello]')
        console.log('monaco is awesome!')
        monaco
        `,
        theme: 'ymj-theme'
    });
})

显示:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/723830.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

不是所有洗碗机都能空气除菌 友嘉灵晶空气除菌洗碗机评测

精致的三餐让你以为生活是“享受”,可饭后那些油腻的锅碗瓢盆却成了你我美好生活的最大障碍。想要只吃美食不洗碗,那一台优秀的洗碗机就必不可少了!今天,ZOL中关村在线要评测的就是这样一台不光洗得干净更能有效除菌抑菌的洗碗机—…

数据虚拟化、Data Fabric(数据编织)的兴起,对数据管理有何帮助?

数字化时代,虚拟化(Virtualization)并不是一个很陌生的词汇,它是现代数据中心资源管理的核心技术之一,是对 IT 资源(如服务器、存储设备、网络设备等)的抽象,通过屏蔽 IT 资源的物理…

2024年城市规划与创新管理国际会议(UPIM 2024)

2024年城市规划与创新管理国际会议(UPIM 2024) 2024 International Conference on Urban Planning and Innovation Management 【重要信息】 大会地点:苏州 大会官网:http://www.icupim.com 投稿邮箱:icupimsub-conf.c…

打击帮信罪掩隐罪的全渠道交易反欺诈解决方案

结合多年对抗黑灰产的实践经验,芯盾时代利用自主研发的智能风控决策平台(IRD)、账户风险监测系统(ARM)、终端威胁态势感知(MTD)、智能终端密码模块(PMIT)、设备指纹等产品…

没有 ADetailer,ComfyUI 画图脸崩了怎么办?

我们都知道 SD 的 WebUI 中的面部修复神器是 ADetailer,不过它是 WebUI 的专属插件,在 ComfyUI 中是搜索不到这个插件的,但是并不代表 ComfyUI 就不能使用面部修复功能了,ComfyUI 中也是可以找到平替的。 今天我们就来讲讲在 Com…

爆赞!24年GitHub首本Python开发实战背记手册,标星果然百万名不虚传

Python (发音:[ paiθ(ə) n; (US) paiθɔn ] n. 蟒蛇,巨蛇 ),是一种面向对象的解释性的计算机程序设计语言,也是一种功能强大而完善的通用型语言,已经具有十多年的发展历史,成熟且稳定。Python 具有脚本语言中最丰富…

COGNEX康耐视 INsight Micro系列视觉系统安装手测

COGNEX康耐视 INsight Micro系列视觉系统安装手测

全新剧场app的独特功能

全新剧场App通过引入一系列独特功能,旨在提升用户体验、增加用户粘性并拓宽市场范围。以下是对这些功能的详细分析: 1、虚拟剧场导览: 功能概述:利用增强现实技术,为用户提供虚拟剧场导览体验。用户可以在App中启动这…

从“野人饭”走红,探索品牌户外化营销趋势丨小红书内容分析

wildeat,户外是人的天性的回归 近来,“wildeat(户外野吃)”的风潮在小红书逐渐兴起。越来越多的人选择到户外吃一顿,做一次“野人”,主打一个只要氛围到了,就地开饭,不愁吃什么&…

数据结构--顺序表(图文)

顺序表的概念和特点 顺序表是一种线性数据结构,它由一组数据元素构成,这些元素具有相同的特性,并按照一定的顺序排列。在顺序表中,数据元素通常存储在连续的内存空间中,这使得通过索引可以直接访问到表中的任意元素。…

scratch3编程02-使用克隆来编写小游戏

目录 1,游戏效果 2,游戏代码块 1)玩家 2)障碍物 ​ 3)箭头 ​ 4)关卡图片 3,scratch文件 1,游戏效果 使用克隆 在这个游戏中: 程序开始:只要点击“…

开放式耳机哪个牌子好?2024五大闭眼入开放式耳机推荐!

想要购买开放式耳机,但面对很多品牌和型号,是否感到无从下手?别担心,作为耳机发烧友和测评专家,我为大家带来了几款热门开放式耳机的横向对比。从各个方面进行详细对比,还有我自己觉得还不错的五款开放式耳…

行列式和矩阵的区别

目录 一、行列式 1. 行列式的定义 2. (全)排列 3. 逆序数 二、矩阵 1. 矩阵的定义 三、行列式和矩阵的区别 四、参考书目 一、行列式 1. 行列式的定义 2. (全)排列 3. 逆序数 二、矩阵 1. 矩阵的定义 三、行列式和矩阵的区别 四、参考书目 同济大学数学系. 工程数学…

【代码随想录】【算法训练营】【第43天】 [518]零钱兑换II [377]组合总和IV [卡码57]爬楼梯

前言 思路及算法思维,指路 代码随想录。 题目来自 LeetCode。 部分题目来自卡码网。 day 43,极其困难的周三~ 题目详情 [518] 零钱兑换II 题目描述 518 零钱兑换II 解题思路 前提:假设每一种面额的硬币有无限个,求组合数…

大模型技术如何构建金融领域的创新生态?

前言 近年来,人工智能技术不断迭代与突破,助力各行各业加速迈向智能化,其中在金融领域的运用逐渐加深,为银行、保险、基金、券商等金融机构实现数智化转型提供引擎动能。而大模型时代的到来,则为金融智能的发展引入了…

vue3-openlayers 点击多边形弹框,高亮多边形,自定义属性传递,鼠标悬浮多边形上动态修改鼠标样式

本篇介绍一下使用vue3-openlayers点击多边形弹框,高亮多边形,自定义属性传递,鼠标悬浮多边形上动态修改鼠标样式 1 需求 加载天地图,polygon传递自定义属性标悬浮在polygon上,根据自定义属性,动态修改鼠标…

【深度学习】sdwebui A1111 加速方案对比,xformers vs Flash Attention 2

文章目录 资料支撑资料结论sdwebui A1111 速度对比测试sdxlxformers 用contorlnet sdxlsdpa(--opt-sdp-no-mem-attention) 用contorlnet sdxlsdpa(--opt-sdp-attention) 用contorlnet sdxl不用xformers或者sdpa ,用contorlnet sdxl不用xformers或者sdpa …

35 Debian如何配置Postfix+Dovecot实现邮件加密

作者:网络傅老师 特别提示:未经作者允许,不得转载任何内容。违者必究! Debian如何配置Postfix+Dovecot实现邮件加密 《傅老师Debian知识库系列之35》——原创 ==前言== 傅老师Debian知识库特点: 1、拆解Debian实用技能; 2、所有操作在VMware虚拟机实测完成; 3、致力于…

Neo4j 创建关系

Neo4j 创建关系 在 Noe4j 中,关系是我们用来连接图的两个节点的元素。 这些关系具有数据的方向、类型和形式模式。 本章教你如何 建立关系在现有节点之间创建关系使用标签和属性创建关系 建立关系 我们可以使用 CREATE 子句创建关系。 我们将在方括号[]中指定关系…

工业自动化中OBC充电机测试负载箱的应用

在工业自动化中,OBC充电机是电动汽车和混合动力汽车的重要组成部分。它的主要功能是为电动汽车的电池组提供电能,保证车辆的正常运行。为了保证OBC充电机的性能和安全性,通常需要对其进行严格的测试。在这个过程中,负载箱是一种非…