如何考虑样式化 AngularJS 组件?

Posted

技术标签:

【中文标题】如何考虑样式化 AngularJS 组件?【英文标题】:How to think about styling AngularJS components? 【发布时间】:2019-03-14 15:44:44 【问题描述】:

我正在开发一个 AngularJS 项目,目的是慢慢地为 Angular 6 或我们开始升级时发布的任何版本做好准备。其中一项重要工作是将现有指令转换为组件。

我最苦恼的事情是,组件的每个实例都会在 DOM 中引入一个额外的元素,该元素包装了我的实际组件 html 并破坏了层次结构,这使得编写能够满足其需要的 CSS 变得非常困难到。

为了说明我的困境,想象一个名为alert 的简单组件,它为您希望用户注意的各种类型的消息提供样式。它接受两个绑定,一个message 和一个type。根据type,我们将添加一些特殊样式,并可能显示不同的图标。所有的显示逻辑都应该封装在组件中,所以使用它的人只需要确保他们正确地传递数据并且它会工作。

<alert message="someCtrl.someVal" type="someCtrl.someVal"></alert>

选项 A:将样式放在额外元素内的 &lt;div&gt;

组件模板

<div
    class="alert"
    ng-class="'alert--success': alert.type === 'success', 'alert--error': alert.type === 'error'">
    <div class="alert__message">alert.message</div>
    <a class="alert__close" ng-click="alert.close()">
</div>

萨斯

.alert 

    & + & 
        margin-top: 1rem; // this will be ignored
    

    &--success 
        background-color: green; // this will work
    

    &--error 
        background-color: red; // this will work
    

只要组件完全不了解它周围的一切,它就可以正常工作,但是当你想将它放在 flex-parent 中,或者使用像“+”这样的选择器时,它就会中断。

选项 B:尝试直接设置额外元素的样式

组件模板

<div class="alert__message">alert.message</div>
<a class="alert__close" ng-click="alert.close()">

萨斯

alert 

    & + & 
        margin-top: 1rem; // this will work now
    

    .alert--success 
        background-color: green; // nowhere to put this
    

    .alert--error 
        background-color: red; // nowhere to put this
    

现在我遇到了相反的问题,因为我无法为成功和错误状态附加修饰符类。

我在这里遗漏了什么吗?处理这个超出组件本身范围的附加元素的最佳方法是什么?

【问题讨论】:

所以问题是您的同级选择器将无法工作,因为您最终会得到像&lt;alert&gt;&lt;div class='alert'&gt;&lt;/div&gt;&lt;/alert&gt; 这样的结构?或者这只是许多样式问题的一个例子? 兄弟姐妹就是一个例子。另一个不好的问题是,如果组件是 flex-child,它将破坏 flex-tree 并根据应用的 flex 属性导致所有不同类型的布局问题。 会在你的组件上使用transclude: true吗?这将使&lt;alert&gt;&lt;/alert&gt; 元素完全替换为组件模板的内容。 【参考方案1】:

我个人选择选项 A。这使您可以轻松识别和创建组件的特定样式,而不必担心它们会覆盖站点范围的样式。例如,我将使用嵌套样式来完成此操作:

#componentContainer 
    input[type=text] 
        background-color: red;
    

这将允许您为组件创建通用样式,而不会溢出到解决方案的其余部分。

【讨论】:

以上是关于如何考虑样式化 AngularJS 组件?的主要内容,如果未能解决你的问题,请参考以下文章

AngularJs中,如何在render完成之后,执行Js脚本

盘点开发人员的十佳AngularJS框架

如何将样式化组件作为属性添加到 TypeScript 中的另一个样式化组件?

如何在 AngularJS 中操作指令样式?

如何在样式化组件之外设置样式?

如何聚焦样式化的组件?