mirror of
https://github.com/toeverything/AFFiNE.git
synced 2026-08-10 13:38:49 +08:00
feat(docs): migrate bs docs
This commit is contained in:
@@ -0,0 +1,42 @@
|
||||
# Slot
|
||||
|
||||
BlockSuite extensively uses `Slot` to manage events that are not DOM-native. You can think of it as a type-safe event emitter or a simplified RxJS [Observable](https://rxjs.dev/guide/observable):
|
||||
|
||||
```ts
|
||||
import { Slot } from '@blocksuite/store';
|
||||
|
||||
// Create a new slot
|
||||
const slot = new Slot<{ name: string }>();
|
||||
|
||||
// Subscribe events
|
||||
slot.on(({ name }) => console.log(name));
|
||||
|
||||
// Or alternatively only listen event once
|
||||
slot.once(({ name }) => console.log(name));
|
||||
|
||||
// Emit the event
|
||||
slot.emit({ name: 'foo' });
|
||||
```
|
||||
|
||||
To unsubscribe from the slot, simply use the return value of `slot.on()`:
|
||||
|
||||
```ts
|
||||
const slot = new Slot();
|
||||
const disposable = slot.on(myHandler);
|
||||
|
||||
// Dispose the subscription
|
||||
disposable.dispose();
|
||||
```
|
||||
|
||||
Moreover, for any node in the block tree, events can be triggered when the node is updated:
|
||||
|
||||
```ts
|
||||
const model = doc.root[0];
|
||||
|
||||
// Triggered when the `props` of the block model is updated
|
||||
model.propsUpdated.on(() => updateMyComponent());
|
||||
// Triggered when the `children` of the block model is updated
|
||||
model.childrenUpdated.on(() => updateMyComponent());
|
||||
```
|
||||
|
||||
In the prebuilt AFFiNE editor, which is based on the [lit](https://lit.dev/) framework, the UI component of each block subscribes to its model updates using this pattern.
|
||||
Reference in New Issue
Block a user