React vscode-webview-ui-toolkit 按钮不显示图标

问题描述 投票:0回答:1

我正在使用 React 开发 vscode 的扩展,并使用 WebUi Toolkit 库 (https://github.com/microsoft/vscode-webview-ui-toolkit) 作为组件。我想在我的按钮上添加一个“保存”图标。

我已按照文档在 React 中添加按钮(https://github.com/microsoft/vscode-webview-ui-toolkit/tree/main/src/react#use-oninput-instead-of-onchange-处理击键)。

我按照文档的其他部分添加了一个图标(https://github.com/microsoft/vscode-webview-ui-toolkit/blob/main/src/button/README.md#start-icon ).

我还在 codicons 网站上查找了保存图标(https://microsoft.github.io/vscode-codicons/dist/codicon.html)。

所以生成的代码是:

import { VSCodeButton } from '@vscode/webview-ui-toolkit/react';    

<VSCodeButton >
    Save
    <span slot="start" className="codicon codicon-save"></span>
</VSCodeButton>

但是图标没有显示。 如何给按钮添加图标?

reactjs typescript visual-studio-code icons vscode-extensions
1个回答
0
投票

您的代码和 Toolkit 文档提供的示例使用某些 CSS 类来设置图标样式。在您的情况下,如果未找到类

codicon
codicon-save
,则它将无法按预期工作。

首先,您需要正确安装 Codicons 包。确保您专门为 React 应用程序安装它,而不是扩展的根目录(假设您的扩展基于 Webview UI Toolkit React 示例,这将位于

webview-ui
级别)。

然后,就像在 Microsoft 提供的 webview Codicons 示例中一样,您必须在 Webview 提供程序的 HTML 内容中包含样式表

<link>
,如此处所示(请注意,这是使用已弃用的
vscode-codicons
,但您将需要
@vscode/codicons
)。在您的情况下,您可能希望在您的 webview 面板提供程序中使用类似的内容(在主扩展
src
中,而不是
webview-ui
React 应用程序中):

import { Uri } as vscode from "vscode";

private _getWebviewContent(webview: Webview, extensionUri: Uri) {
  const codiconsUri = webview.asWebviewUri(
    Uri.joinPath(
      extensionUri,
      `webview-ui`,
      'node_modules',
      '@vscode',
      'codicons',
      'dist',
      'codicon.css',
    )
  );

  return `
    <!DOCTYPE html>
    <html lang="en">
      <head>
        <link rel="stylesheet" type="text/css" href="${codiconsUri}">
      </head>
      <body>
        <div id="root"></div>
      </body>
    </html>
  `;
}

这样,React 应用程序将能够访问必要的 CSS 类,以便使用您提供的代码正确渲染所需的图标。

您还需要将同一目录添加到 webview 选项中允许的本地资源中,否则您在尝试检索样式表时可能会遇到

401: Unauthorized
错误:

import { Uri } as vscode from "vscode";

this._webviewView.webview.options = {
  enableScripts: true,
  localResourceRoots: [
    Uri.joinPath(this._extensionUri, "out"),
    Uri.joinPath(this._extensionUri, "webview-ui/build"),

    // Must explicitly allow webview access to that style sheet
    Uri.joinPath(this._extensionUri, "webview-ui/node_modules/@vscode/codicons/dist"),
  ],
};
© www.soinside.com 2019 - 2024. All rights reserved.