java - Vaadin Flow - 使用样式表“themeFor”创建自己的组件
问题描述
嗨,我是 vaadin 的新手。我喜欢创建一个自己的组件,我喜欢为其导入自己的“本地”css 样式表。我尝试遵循指南(此处和此处),但它不起作用。我做错了什么?我正在使用 Vaadin v17.0.9。先感谢您。
问题和疑问
- 我的组件的 @CssImport 似乎被忽略了。有没有办法将文本颜色设置为“红色”?
- 有没有办法为我的组件设置一个可以覆盖的默认 .css 样式表文件?
Java 类
@Route("/")
@Theme(value = Lumo.class)
@CssImport(value = "./styles/hello-component.css", themeFor = "hello")
public class MainView extends VerticalLayout {
private static final long serialVersionUID = 1L;
@PostConstruct
private void init() {
setSizeFull();
add(new HelloComponent());
}
}
@Tag("hello")
public class HelloComponent extends Div {
private static final long serialVersionUID = 1L;
public HelloComponent() {
init();
}
private void init() {
setSizeFull();
setText("Test");
}
}
样式表“前端/样式/hello-component.css”
:host {
color: red;
}
解决方案
您不能将本地样式范围应用于您的自定义组件HelloComponent
,因为它甚至没有 Shadow DOM。本地样式范围与常规 Vaadin 组件(例如 aTextField
或 a Button
)相关,因为这些组件具有 Shadow DOM。在您的情况下,HelloComponent
必须使用常规 CSS 选择器使用全局样式范围。您可以使用组件的getStyle()
方法在 Java 代码中执行此操作:
HelloComponent helloComponent = new HelloComponent();
helloComponent.getStyle().set("color", "red");
或者,您可以使用@CssImport
注释导入全局样式表,然后在此样式表中,HelloComponent
使用常规 CSS 选择器定位您的目标。例如,您可以添加@CssImport("./shared-styles.css")
到其中一个类中,然后shared-styles.css
使用以下样式:
hello {
color: red;
}
如果你想用自己的 shadow DOM 创建一个自定义元素,你需要使用 Polymer 或 Lit-element 为它创建一个客户端组件。但即便如此,@CssImport
withthemeFor = "MyCustomElement"
也不会自动工作。为此,您的客户端自定义元素还必须实现ThemableMixin
(https://github.com/vaadin/vaadin-themable-mixin)。后者是允许任何组件(包括 Vaadin 自己的常规组件)使用@CssImport
.
推荐阅读
- mysql - 外键约束“screenshot_ibfk_1”中的引用列“build_id”和引用列“build_id”不兼容
- javascript - javascript中的this:方法和范围
- r - 调整闪亮以显示正确的图形
- python - Lambda/ffmpeg 延时生成 - 输出零字节,无法调试 ffmpeg
- c# - 忽略存储过程中的参数如果为空
- javascript - JS重置按钮不删除功能
- nunjucks - Nunjucks 如何通过扩展传递变量
- java - 连接两个流的 NullSafe 方法是什么?
- powerbi - 如何使用 Power BI 从平均值中找到 Measure 中每个值的 z 分数?
- javascript - 有人可以解释一下 createTags 中的 const tags 数组怎么可能这样修改?