# Angular Storybook: 道具旋钮和 ng-content 的魔法
Angular Storybook 是一个强大的工具,用于构建、测试和展示 Angular 组件。其中,道具旋钮(Knobs)和 ng-content 是两个非常有趣且功能强大的特性,它们使得组件的开发和测试更加灵活和可视化。在本文中,我们将深入探讨这两个特性,并演示如何使用它们为组件增添独特的魅力。## 道具旋钮:实时调整组件参数道具旋钮 是 Storybook 中的一个亮点,它允许我们在 Storybook 界面上实时调整组件的属性,从而更直观地了解组件在不同情境下的表现。这为开发者提供了一种简便而直观的方式来测试组件的可定制性和响应性。让我们通过一个简单的例子来展示道具旋钮的强大之处。考虑一个按钮组件,它具有颜色和标签两个属性。首先,我们需要安装 `@storybook/addon-knobs`:bashnpm install --save-dev @storybook/addon-knobs接下来,在 `.storybook/main.js` 中的 addons 数组中添加 '@storybook/addon-knobs':
javascriptmodule.exports = { // ... addons: ['@storybook/addon-knobs'],};现在,我们可以在组件的 Story 文件中使用道具旋钮了。假设我们的按钮组件定义如下:
typescript// button.component.tsimport { Component, Input } from '@angular/core';@Component({ selector: 'app-button', template: '',})export class ButtonComponent { @Input() color = 'blue'; @Input() label = 'Click me';}接下来,在 Story 文件中使用道具旋钮:
typescript// button.stories.tsimport { Meta, moduleMetadata, Story } from '@storybook/angular';import { withKnobs, text, color } from '@storybook/addon-knobs';import { ButtonComponent } from './button.component';export default { title: 'Button', component: ButtonComponent, decorators: [ withKnobs, moduleMetadata({ declarations: [ButtonComponent], }), ],} as Meta;export const Default: Story = () => ({ component: ButtonComponent, props: { color: color('Color', 'blue'), label: text('Label', 'Click me'), },});在上述代码中,我们使用 `color` 和 `text` 函数从道具旋钮中获取颜色和标签的输入值。在 Storybook 界面上,我们可以即时调整这些属性,以查看按钮在不同配置下的效果。## ng-content:组件内容的灵活排列ng-content 是 Angular 中用于内容投影的重要特性,而在 Storybook 中的应用使得组件更具可复用性和灵活性。通过 ng-content,我们可以将组件的部分结构留给使用者自由组合,使得组件更容易适应各种场景和需求。让我们以一个简单的面板组件为例,该组件包含标题和内容两个部分。首先,定义面板组件:
typescript// panel.component.tsimport { Component } from '@angular/core';@Component({ selector: 'app-panel', template: `在这个例子中,我们使用 ``, styles: [ ` .panel { border: 1px solid #ccc; padding: 16px; margin: 16px; } .title { font-size: 18px; font-weight: bold; margin-bottom: 8px; } `, ],})export class PanelComponent {}
typescript// panel.stories.tsimport { Meta, moduleMetadata, Story } from '@storybook/angular';import { PanelComponent } from './panel.component';export default { title: 'Panel', component: PanelComponent, decorators: [ moduleMetadata({ declarations: [PanelComponent], }), ],} as Meta;export const Default: Story = () => ({ component: PanelComponent, template: `在上述代码中,我们在 ``,}); Title of the PanelContent of the Panel