gpt4 book ai didi

angular - 如何动态设置组件宿主样式Angular 8

转载 作者:行者123 更新时间:2023-12-04 01:04:50 26 4
gpt4 key购买 nike

我想从父级动态设置子级主机组件元素的样式。

有一种解决方案可以针对每种样式单独执行,如下所示:
@HostBinding('style.width') @Input() width = 'auto'
但这样我需要为不同的风格制作多条线。

Bellow 是使用主机绑定(bind)和输入组合执行此操作的解决方案。

最佳答案

如果您想将多个 css 样式作为字符串或作为具有 cammelCase 约定的对象传递,这是一个可以涵盖的解决方案:

父 HTML

<app-button [style]="styleFromParent">Some button</app-button>

父组件有 styleFromParent属性,并且如果该属性在某个时候发生更改,它具有模拟:

父组件 TS
import { Component, OnInit, ChangeDetectorRef } from '@angular/core';

@Component({
selector: 'app-site-panel',
templateUrl: './site-panel.component.html',
})
export class SitePanelComponent implements OnInit {
constructor(private _detectChanges: ChangeDetectorRef) {}
styleFromParent = { marginTop: '10px', marginLeft: '50px' };

ngOnInit() {
setTimeout(() => {
this.styleFromParent = { marginTop: '20px', marginLeft: '1px' };

this._detectChanges.detectChanges();
}, 2000);
}
}


子 HTML
<ng-content></ng-content>

子组件 TS

在进行解析的子组件中 if typeof style === 'object'是将 cammelCase 样式解析为基于破折号的样式并将它们连接成一个行字符串。
import { Component, OnInit, HostBinding, Input } from '@angular/core';
import { DomSanitizer, SafeStyle } from '@angular/platform-browser';

@Component({
selector: 'app-button',
templateUrl: './button.component.html',
})
export class ButtonComponent implements OnInit {
@HostBinding('style') baseStyle: SafeStyle;

@Input()
set style(style: string | object) {
let mappedStyles = style as string;

if (typeof style === 'object') {
mappedStyles = Object.entries(style).reduce((styleString, [propName, propValue]) => {
propName = propName.replace(/([A-Z])/g, matches => `-${matches[0].toLowerCase()}`);
return `${styleString}${propName}:${propValue};`;
}, '');

this.baseStyle = this.sanitizer.bypassSecurityTrustStyle(mappedStyles);
} else if (typeof style === 'string') {
this.baseStyle = this.sanitizer.bypassSecurityTrustStyle(mappedStyles);
}
}

constructor(private sanitizer: DomSanitizer) {}

ngOnInit() {}
}

上面你可以看到 baseStyleHostBindingstyle组件绑定(bind)。
style输入传递 setter 将触发,检查是否传递了字符串或对象,将其解析为字符串并清理该 css 并将其分配给 baseStyle因此主机风格会改变。

编辑:

正如@Scorpioo590 所说,这可以替换为 [ngStyle] .
所以这似乎是不必要的。也许至少这可以显示您可以使用样式和 HostBinding 做什么。

关于angular - 如何动态设置组件宿主样式Angular 8,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57254761/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com