如何在 Vaadin Upload 中设置 vaadin-upload-file 组件的样式

kam*_*llo 4 vaadin vaadin-upload vaadin14

我想vaadin-upload通过更改文件列表中元素的外观来设置 Vaadin Upload 组件 ( ) 的样式,例如隐藏命令按钮(开始、删除、重试)。文件列表包含vaadin-upload-file元素。

目前,我只能通过向其添加自定义主题并导入适当的 css 来自定义 vaadin-upload 本身 - 就像本例中一样:https://cookbook.vaadin.com/large-upload-area

@CssImport(value = "./styles/custom-upload.css", themeFor = "vaadin-upload")
public class MainView extends VerticalLayout implements HasUrlParameter<String> {

    public MainView() {
        Upload upload = new Upload();
        upload.getElement().getThemeList().add("custom-upload");
        add(upload);
    }
}
Run Code Online (Sandbox Code Playgroud)

自定义上传.css:

:host([theme~="custom-upload"]) {
  border: 0;
}

:host([theme~="custom-upload"]) [part="commands"] {
  display: none;
}
Run Code Online (Sandbox Code Playgroud)

简化的 DOM:

<vaadin-upload theme="custom-upload" target="VAADIN/dynamic/resource/1/70860bf9-21c4-474e-9418-fd5516c28736/upload">
    #shadow-root
        <div part="primary-buttons">...</div>
        <slot name="file-list">
            <div id="fileList" part="file-list">
                <vaadin-upload-file>...</vaadin-upload-file>
            </div>
        </slot>
        ...
</vaadin-upload>
Run Code Online (Sandbox Code Playgroud)

文件指出:

有没有办法将自定义附加theme到 vaadin-upload-file 组件?

Tar*_*aby 7

是的,您只需要一个针对vaadin-upload-file组件的单独样式模块,这可以使用@CssImport注释来实现。例如,

@CssImport(value = "./styles/custom-upload-file.css", themeFor = "vaadin-upload-file")
Run Code Online (Sandbox Code Playgroud)

然后可以将自定义 CSS 添加到{project_root}/frontend/styles/custom-upload-file.css.

编辑:与其他 Vaadin 组件不同,分配给的主题名称vaadin-upload不会(不幸的是)传播到vaadin-upload-file. 因此,人们不能依赖主题属性来有选择地设置vaadin-upload-file同一应用程序中某些组件的样式。

如果需要选择性样式,可以通过调用 JavaScript 向组件添加类名来实现一种巧妙的解决方法vaadin-upload-file。然而,此类调用仅vaadin-upload-file在 DOM 中呈现之后才有效(通常在文件上传成功时发生)。因此,JS 调用应该在上传成功监听器中进行。

这是用于有选择地隐藏 的清除按钮的实际解决方法vaadin-upload-file

@Route
@CssImport(value = "./styles/vaadin-upload-styles.css", themeFor = "vaadin-upload-file")
public class MainView extends VerticalLayout {

    public MainView() {

        MemoryBuffer buffer = new MemoryBuffer();
        Upload upload = new Upload(buffer);
        upload.addSucceededListener(e -> {
            upload.getElement()
                    .executeJs("this.shadowRoot.querySelector('vaadin-upload-file').className = 'hidden-clear'");
        });

        Button showClear = new Button("Show clear button", e -> upload.getElement()
                .executeJs("this.shadowRoot.querySelector('vaadin-upload-file').className = ''"));

        add(upload, showClear);
    }

}
Run Code Online (Sandbox Code Playgroud)

然后在 中vaadin-upload-styles.css,可以执行以下操作:

:host(.hidden-clear) [part~=clear-button] {
    display: none;
}
Run Code Online (Sandbox Code Playgroud)

  • @kamillo 不幸的是,主题传播并未在所有组件中一致实现,并且 vaadin-upload 是主题传播不起作用的组件之一。此外,没有 API 可以直接访问文件上传元素。恐怕目前您只能对所有上传的文件进行主题上传。您可能想在这里提出问题:https://github.com/vaadin/web-components。 (2认同)