2

我想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);
    }
}

自定义上传.css:

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

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

简化的 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>

文档指出:

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

4

2 回答 2

5

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

@CssImport(value = "./styles/custom-upload-file.css", themeFor = "vaadin-upload-file")

然后可以将自定义 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);
    }

}

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

:host(.hidden-clear) [part~=clear-button] {
    display: none;
}
于 2021-11-09T13:57:58.087 回答
2

要修改扩展的 Vaadin Web 组件中的样式ThemableMixin,您可以

  • 做Tarek所说的,或者
  • vaadin-upload-file.css使用文件夹中命名的文件创建自定义主题components在这里阅读更多。

无论哪种方式,您都需要了解这ThemeList#add(String)只是将参数附加到theme客户端的属性。所以,你只需要在 CSS 中处理新的主题,例如:

:host([theme~="prettypink"]) [part="done-icon"]::before {
    color: #ff31f1;
}

以下vaadin-upload是和的默认 Lumo 样式vaadin-upload-file

于 2021-11-09T15:25:50.703 回答