dojo 龙形主标识

自定义元素插槽

Dojo 小部件可以支持子对象,这些子对象通过使用“插槽”作为自定义元素来支持。slot 属性被添加到自定义元素的子元素中,子元素作为插槽的值被传递进来。

Dojo 自定义元素支持最常见的子对象场景。

命名子元素

Widget.tsx

export interface WidgetChildren {
	foo: RenderResult;
}
<Widget>
	{{
		foo: <Label>My Label</Label>
	}}
</Widget>

index.html

<dojo-widget>
  <dojo-label slot="foo">My Label</dojo-label>
</dojo-widget>

命名子元素渲染器

Widget.tsx

export interface WidgetChildren {
	foo: () => RenderResult;
}
<Widget>
	{{
		foo: () => <Label>My Label</Label>
	}}
</Widget>

index.html

<dojo-widget>
  <dojo-label slot="foo">My Label</dojo-label>
</dojo-widget>

命名子元素数组

如果多个子元素具有相同的插槽名称,它们将被捆绑在一起并作为数组传递给自定义元素。

Widget.tsx

export interface WidgetChildren {
	foo: RenderResult[];
}
<Widget>
	{{
		foo: [<Label>Label 1</Label>, <Label>Label 2</Label>]
	}}
</Widget>

index.html

<dojo-widget>
  <dojo-label slot="foo">Label 1</dojo-label>
  <dojo-label slot="foo">Label 2</dojo-label>
</dojo-widget>

命名子元素渲染器数组

Widget.tsx

export interface WidgetChildren {
	foo: (() => RenderResult)[];
}
<Widget>
	{{
		foo: [() => <Label>Label 1</Label>, () => <Label>Label 2</Label>]
	}}
</Widget>

index.html

<dojo-widget>
  <dojo-label slot="foo">Label 1</dojo-label>
  <dojo-label slot="foo">Label 2</dojo-label>
</dojo-widget>

带参数的命名子元素渲染器

如果小部件将参数传递给子元素渲染函数,则参数将通过“渲染”事件发送到插槽中的子元素。

Widget.tsx

export interface WidgetChildren {
	foo: (active: boolean) => RenderResult;
}
<Widget>
	{{
		foo: (active) => <Label active={active}>My Label</Label>
	}}
</Widget>

index.html

<dojo-widget>
  <dojo-label slot="foo" id="label1">Label 1</dojo-label>
  <dojo-label slot="foo" id="label2">Label 2</dojo-label>
</dojo-widget>

<script>
  function setActive(event) {
    const { detail: [active] } = event;
    event.target.active = active;
  }

  label1.addEventListener('render', setActive);
  label2.addEventListener('render', setActive);
</script>