【VS Code插件开发】消息通信(四)

🐱 个人主页:不叫猫先生,公众号:前端舵手
🙋‍♂️ 作者简介:前端领域优质作者、阿里云专家博主,共同学习共同进步,一起加油呀!
📢 资料领取:前端进阶资料可以找我免费领取
🔥 摸鱼学习交流:我们的宗旨是在「工作中摸鱼,摸鱼中进步」,期待大佬一起来摸鱼(文末有我wx或者私信)

在这里插入图片描述

目录

  • 消息从扩展传递到Webview
    • 1、reveal用法
    • 2、案例
    • 3、展示
  • 消息从 Web 视图传递到扩展
    • 1、acquireVsCodeApi
    • 2、onDidReceiveMessage
    • 3、案例

在开发过程中,扩展和 Webview 可以互相通信,消息既可以从扩展传递到Webview,反之也是可以的。

消息从扩展传递到Webview

1、reveal用法

在使用面板的时候,会用到reveal先方法,先讲解一下reveal的用法:

reveal 是一个方法,用于将 Webview 面板显示在用户界面中的特定编辑器列(比如:左侧编辑器、右侧编辑器等)。比如下面的代码中currentPanel.reveal(vscode.ViewColumn.One) 是用来显示已经创建的面板 currentPanel 并将其显示在 vscode.ViewColumn.One 编辑器列中。

总结一下:currentPanel 在已经创建 Webview 面板时存在,而 reveal是将已创建的 Webview 面板显示在用户界面的指定编辑器列的方法。

2、案例

消息从扩展传递到Webview,可以通过下面的代码逻辑实现:

  • 注册命令demoPlugin.doRefactor
  • 执行该命令时,通过webview.postMessage({ command: 'refactor' })向 Webview 发送消息指令或者数据信息
  • Webview 通过window.addEventListener('message', callback)监听到扩展发送的指令或者数据,然后执行相应的逻辑
export function activate(context: vscode.ExtensionContext) {// Only allow a single Cat Coderlet currentPanel: vscode.WebviewPanel | undefined = undefined;context.subscriptions.push(vscode.commands.registerCommand('demoPlugin.start', () => {if (currentPanel) {currentPanel.reveal(vscode.ViewColumn.One);} else {currentPanel = vscode.window.createWebviewPanel('catCoding','Cat Coding',vscode.ViewColumn.One,{enableScripts: true});currentPanel.webview.html = getWebviewContent();currentPanel.onDidDispose(() => {currentPanel = undefined;},undefined,context.subscriptions);}}));// new commandcontext.subscriptions.push(vscode.commands.registerCommand('demoPlugin.doRefactor', () => {if (!currentPanel) {return;}// Send a message to our webview.// You can send any JSON serializable data.currentPanel.webview.postMessage({ command: 'refactor' });}));
}
//1ms对count加1,然后乘0.5再向上取整,将最终结果通过操作dom显示在页面中
function getWebviewContent() {return `<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Cat Coding</title>
</head>
<body><img src="https://media.giphy.com/media/JIX9t2j0ZTN9S/giphy.gif" width="300" /><h1 id="lines-of-code-counter">0</h1><script>const counter = document.getElementById('lines-of-code-counter');let count = 0;setInterval(() => {counter.textContent = count++;}, 100);// Handle the message inside the webviewwindow.addEventListener('message', event => {const message = event.data; // The JSON data our extension sentswitch (message.command) {case 'refactor':count = Math.ceil(count * 0.5);counter.textContent = count;break;}});</script>
</body>
</html>`;
}

3、展示

其中的数字就是执行了 doRefactor 与 Webview 进行了通信,Webview 监听到传过来的指令是自己需要的,然后执行相应的逻辑来展示数字变化
在这里插入图片描述

消息从 Web 视图传递到扩展

Webview 还可以将消息传递回其扩展程序。这是通过使用 postMessageweb 视图内的特殊 VS Code API 对象上的函数来完成的。要访问 VS Code API 对象,可以在 Webview 调用acquireVsCodeApi方法。每个会话只能调用该函数一次。您必须保留此方法返回的 VS Code API 实例,并将其分发给需要使用它的任何其他函数。

1、acquireVsCodeApi

acquireVsCodeApiVS Code 内置的方法,他在 Webview 内部获取一个可以用来与 VS Code 宿主环境进行通信的 API 对象,以实现 Webview 与扩展代码之间的交互。

用法如下:

  • Webview 发送数据
   const vscode = acquireVsCodeApi();vscode.postMessage({command: '指令',text: '你的数据'})
  • 扩展接收数据

2、onDidReceiveMessage

onDidReceiveMessage 是 Webview 对象的一个方法,用于注册一个事件监听器,以接收从宿主环境(扩展代码)发送过来的消息。

语法:panel.webview.onDidReceiveMessage(listener, this?, disposables?)

参数:

  • listener: 监听回调函数,监听从宿主环境发送来的消息。消息通常为一个或多个字段的对象,然后根据消息的字段来执行不同的操作。

  • 第二个参数是一个可选的 this 上下文

  • context.subscriptions: 类型为数组,用于保存资源的引用,以便在扩展被停用时进行清理,防止内存泄漏。

用法:

panel.webview.onDidReceiveMessage(message => {switch (message.command) {case 'alert':vscode.window.showErrorMessage(message.text);return;}},undefined,context.subscriptions
);

3、案例

count每1ms加1,当随机数(大于0小于1)小于 count * 0.01 的时候,就向扩展程序发送消息,扩展程序通过onDidReceiveMessage监听消息。

export function activate(context: vscode.ExtensionContext) {context.subscriptions.push(vscode.commands.registerCommand('demoPlugin.start', () => {const panel = vscode.window.createWebviewPanel('catCoding','Cat Coding',vscode.ViewColumn.One,{enableScripts: true});panel.webview.html = getWebviewContent();// Handle messages from the webviewpanel.webview.onDidReceiveMessage(message => {switch (message.command) {case 'alert':vscode.window.showErrorMessage(message.text);return;}},undefined,context.subscriptions);}));
}function getWebviewContent() {return `<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Cat Coding</title>
</head>
<body><img src="https://media.giphy.com/media/JIX9t2j0ZTN9S/giphy.gif" width="300" /><h1 id="lines-of-code-counter">0</h1><script>(function() {const vscode = acquireVsCodeApi();const counter = document.getElementById('lines-of-code-counter');let count = 0;setInterval(() => {counter.textContent = count++;// Alert the extension when our cat introduces a bugif (Math.random() < 0.001 * count) {vscode.postMessage({command: 'alert',text: '🐛  on line ' + count})}}, 100);}())</script>
</body>
</html>`;
}

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Sim/circuit10

通过观察可知&#xff0c;在a、b同时为0或1时&#xff0c;state的值改变 state的值可以改变q的输出&#xff0c;1为ab的同或&#xff0c;0为异或 利用assign q进行输出 module top_module (input clk,input a,input b,output q,output state );always(posedge clk)if(a&…

国标GB2818视频平台EasyGBS国标平台与车机设备连接显示未连接成功的问题解决方法

EasyGBS平台可提供流媒体接入、处理、转发等服务&#xff0c;支持内网、公网的监控设备通过国标GB/T28181协议进行视频监控直播。平台兼容性强&#xff0c;只要设备支持国标GB28181协议&#xff0c;均能快速接入EasyGBS&#xff0c;实现视频的监控直播、视频录像、语音对讲、云…

一次hard parse处理过程

文章目录 1.问题描叙2. AWR报告2.1 load profile2.2 Instance Efficiency Percentages(Target 100%)2.3 Time Model Statistics2.4 Instance Activity Stats2.5 Top 5 Timed Events2.6 查询hard parse 3. 解决方案&#xff1a;3.1.修改程式&#xff0c;使用绑定变量3.2.使用cur…

机器人远程控制软件设计

机器人远程控制软件设计 That’s all.

Vue3+Pinia+Koa+Three.js 全栈电商项目总结复盘

前言 前几天一个朋友去义乌旅游&#xff0c;带回来很多小商品&#xff0c;就是一整个物美价廉&#xff0c;但是为什么线下购物和网购有的时候差别这么大&#xff08;网购经常要退换货啊&#x1f62d;&#x1f62d;&#x1f62d;&#xff09;&#xff0c;为此我萌生了一个想法&…

什么是确认测试报告?确认测试报告的用途和周期?

确认测试又称有效性测试&#xff0c;其任务是验证软件的功能和性能及其他特性是否与用户的要求一致。确认测试需要提供的资料包括&#xff1a; 软件需求规格说明书&#xff1a;列出了软件的功能和性能要求&#xff0c;是确认测试的依据。 确认测试计划&#xff1a;制定了确认…

分布式微服务架构下网络通信的底层实现原理

在分布式架构中&#xff0c;网络通信是底层基础&#xff0c;没有网络&#xff0c;也就没有所谓的分布式架构。只有通过网络才能使得一大片机器互相协作&#xff0c;共同完成一件事情。 同样&#xff0c;在大规模的系统架构中&#xff0c;应用吞吐量上不去、网络存在通信延迟、我…

Java 四种访问控制权限

1.背景&#xff1a; 针对java的类成员访问控制权限理解 2.Java有四种访问控制权限&#xff1a; private&#xff0c;protected&#xff0c;public&#xff0c;default 他们的具体访问权限都是什么呢&#xff1f;用例子来分析一下&#xff1a; 这里要分几个情景&#xff1a;内…

IDEA中使用Docker插件构建镜像并推送至私服Harbor

一、开启Docker服务器的远程访问 1.1 开启2375远程访问 默认的dokcer是不支持远程访问的&#xff0c;需要加点配置&#xff0c;开启Docker的远程访问 # 首先查看docker配置文件所在位置 systemctl status docker# 会输出如下内容&#xff1a; ● docker.service - Docker Ap…

TensorRT推理手写数字分类(三)

系列文章目录 &#xff08;一&#xff09;使用pytorch搭建模型并训练 &#xff08;二&#xff09;将pth格式转为onnx格式 &#xff08;三&#xff09;onxx格式转为engine序列化文件并进行推理 文章目录 系列文章目录前言一、TensorRT是什么&#xff1f;二、如何通过onnx生成en…

华为云CodeArts Snap 智能编程助手PyCharm实验手册. 插件安装与使用指南

作为一款自主创新的AI代码辅助编程工具&#xff0c;华为云智能编程助手CodeArts Snap目标打造现代化开发新范式。通过将自然语言转化为规范可阅读、无开源漏洞的安全编程语言&#xff0c;提升开发者编程效率&#xff0c;助力企业快速响应市场需求。华为云CodeArts Snap现进入邀…

Python Opencv实践 - 图像直方图均衡化

import cv2 as cv import numpy as np import matplotlib.pyplot as pltimg cv.imread("../SampleImages/pomeranian.png", cv.IMREAD_COLOR) print(img.shape)#图像直方图计算 #cv.calcHist(images, channels, mask, histSize, ranges, hist, accumulate) #images&…

Android中使用JT808协议进行车载终端通信的实现和优化

JT808是一种在中国广泛应用的车载终端通信协议&#xff0c;用于车辆与监控中心之间的数据通信。下面是关于Android平台上使用JT808协议进行通信的一般步骤和注意事项&#xff1a; 协议了解&#xff1a;首先&#xff0c;您需要详细了解JT808协议的规范和定义。该协议包含了通信消…

高速道路监控:工业路由器助力高速监控远程管理与维护

工业路由器在物联网应用中扮演着重要的角色。物联网的发展使得大量设备和传感器能够互联互通&#xff0c;而工业路由器作为连接这些设备和网络的中间桥梁&#xff0c;承担着数据传输和安全管理的重要责任。 工业路由器能够为高速监控提供网络功能&#xff0c;实现户外无线网络部…

基于Java+SpringBoot+vue前后端分离高校办公室行政事务管理系统设计实现

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

selenium案例之RAM 用户登录 aliyun

文章目录 0x00 Selenium0x01 整体流程 思路1.1 打开浏览器并且访问 登录页面 url: https://signin.aliyun.com/login.htm#/main1.2 定位 "用户名" input 和 "下一步" button 点击下一步1.3 定位 "密码" input 和 "登录" button 点击登…

《Linux从练气到飞升》No.17 进程创建

&#x1f57a;作者&#xff1a; 主页 我的专栏C语言从0到1探秘C数据结构从0到1探秘Linux菜鸟刷题集 &#x1f618;欢迎关注&#xff1a;&#x1f44d;点赞&#x1f64c;收藏✍️留言 &#x1f3c7;码字不易&#xff0c;你的&#x1f44d;点赞&#x1f64c;收藏❤️关注对我真的…

Stable Diffusion web UI 部署详细教程

前言 本文使用 AutoDL 平台进行 Stable Diffusion web UI 云端部署 AutoDL 官网&#xff1a;AutoDL算力云 | 弹性、好用、省钱。租GPU就上AutoDL Stable Diffusion web UI 官网&#xff1a;AUTOMATIC1111/stable-diffusion-webui: Stable Diffusion web UI (github.com) 步…

poi带表头多sheet导出

导出工具类 package com.hieasy.comm.core.excel;import com.hieasy.comm.core.excel.fragment.ExcelFragment; import com.hieasy.comm.core.utils.mine.MineDateUtil; import org.apache.poi.hssf.usermodel.*; import org.apache.poi.ss.usermodel.*; import org.apache.po…

Cesium 使用 Entity 绘制点线面

文章目录 一、绘制点1. 第一种2. 第二种 二、绘制面三、绘制线四、移除 Entity <!--* Author: HuKang* Date: 2023-08-18 11:06:43* LastEditTime: 2023-08-25 09:16:59* LastEditors: HuKang* Description: program-c* FilePath: \global-data-display\src\views\program-c…