Files
upstream-affine/blocksuite/docs-site/guide/event.md
upstream-mirror 50f788e799
Some checks failed
Build & Test / Analyze (javascript, blocksuite) (push) Failing after 3s
Build & Test / Rust test filter (push) Failing after 3s
Build & Test / E2E BlockSuite Test (2) (push) Failing after 3s
Build & Test / E2E BlockSuite Test (3) (push) Failing after 4s
Build & Test / E2E BlockSuite Test (4) (push) Failing after 3s
Build & Test / E2E BlockSuite Cross Browser Test (push) Failing after 3s
Build & Test / E2E Mobile Test (1) (push) Failing after 3s
Build & Test / E2E Mobile Test (2) (push) Failing after 3s
Build & Test / Build AFFiNE native (x86_64-unknown-linux-gnu) (push) Failing after 4s
Build & Test / Unit Test (1) (push) Has been skipped
Build & Test / Unit Test (2) (push) Has been skipped
Build & Test / Unit Test (3) (push) Has been skipped
Build & Test / Build Server native (push) Failing after 3s
Build & Test / Check Git Status (push) Has been skipped
Build & Test / Server Test (0, 4) (push) Has been skipped
Build & Test / Server Test (1, 4) (push) Has been skipped
Build & Test / Analyze (javascript, affine) (push) Failing after 3s
Build & Test / Analyze (typescript, affine) (push) Failing after 3s
Build & Test / Analyze (typescript, blocksuite) (push) Failing after 3s
Build & Test / Mobile native build filter (push) Failing after 3s
Build & Test / Check yarn binary (push) Failing after 3s
Build & Test / E2E BlockSuite Test (1) (push) Failing after 4s
Build & Test / E2E BlockSuite Test (5) (push) Failing after 3s
Build & Test / Unit Test (4) (push) Has been skipped
Build & Test / Unit Test (5) (push) Has been skipped
Build & Test / Native Unit Test (push) Has been skipped
Build & Test / Server Test (2, 4) (push) Has been skipped
Build & Test / Server Test (3, 4) (push) Has been skipped
Build & Test / Server Test with Elasticsearch (push) Has been skipped
Build & Test / Server Test with Embedded Search (push) Has been skipped
Build & Test / Server Test with Manticore Search (push) Has been skipped
Build & Test / Server E2E Test (push) Has been skipped
Build & Test / Cloud Desktop E2E Test (push) Has been skipped
Build & Test / Cloud E2E Test 1/2 (push) Has been skipped
Build & Test / Cloud E2E Test 2/2 (push) Has been skipped
Build & Test / Build @affine/electron renderer (push) Failing after 3s
Build & Test / Copilot test filter (push) Failing after 4s
Build & Test / Lint Rust (push) Has been skipped
Build & Test / Build Android app (push) Has been skipped
Build & Test / Test Android app (push) Has been skipped
Build & Test / Run native tests (push) Has been skipped
Build & Test / Server Copilot Api Test (push) Has been skipped
Build & Test / Frontend Copilot E2E Test (3, 5) (push) Has been skipped
Build & Test / Frontend Copilot E2E Test (4, 5) (push) Has been skipped
Build & Test / Frontend Copilot E2E Test (1, 5) (push) Has been skipped
Build & Test / Frontend Copilot E2E Test (2, 5) (push) Has been skipped
Build & Test / Frontend Copilot E2E Test (5, 5) (push) Has been skipped
Build & Test / Desktop Test (ubuntu-latest, linux, x64, x86_64-unknown-linux-gnu, true) (push) Has been cancelled
Build & Test / Desktop Test (windows-latest, windows, x64, x86_64-pc-windows-msvc, true) (push) Has been cancelled
Build & Test / 3, 2, 1 Launch (push) Has been cancelled
Build & Test / Lint (push) Has been cancelled
Build & Test / Typecheck (push) Has been cancelled
Build & Test / Build iOS app (push) Has been cancelled
Build & Test / Build AFFiNE native (aarch64-apple-darwin) (push) Has been cancelled
Build & Test / E2E Test (1) (push) Has been cancelled
Build & Test / E2E Test (2) (push) Has been cancelled
Build & Test / E2E Test (3) (push) Has been cancelled
Build & Test / E2E Test (4) (push) Has been cancelled
Build & Test / E2E Test (5) (push) Has been cancelled
Build & Test / Build AFFiNE native (x86_64-apple-darwin) (push) Has been cancelled
Build & Test / Build AFFiNE native (aarch64-pc-windows-msvc) (push) Has been cancelled
Build & Test / Build AFFiNE native (x86_64-pc-windows-msvc) (push) Has been cancelled
Build & Test / Desktop Test (macos-latest, macos, arm64, aarch64-apple-darwin, true) (push) Has been cancelled
Build & Test / Desktop Test (macos-latest, macos, x64, x86_64-apple-darwin, false) (push) Has been cancelled
snapshot of https://github.com/toeverything/AFFiNE.git (canary, 2026-09-16; blobs > 131072B omitted)
2026-09-16 00:31:07 +05:00

141 lines
4.0 KiB
Markdown

# Event
This document introduces the handling of UI events, event flows within the block tree, and the implementation of hotkeys in BlockSuite.
## Handling UI Events
For UI events such as `click` in editor, there is an underlying event dispatcher in `@blocksuite/block-std` to dispatch events. With the dispatcher, you can handle events in your [block view](./block-view) implementation in this manner:
```ts
@customElements('my-block')
class MyBlockView extends BlockComponent<MyBlockModel> {
private _handleClick = () => {
//...
};
override connectedCallback() {
super.connectedCallback();
this.handleEvent('click', this._handleClick);
}
}
```
### Event Bubbling
All events on dispatcher are bound to the root element of the block view to make it possible to bubble events to the parent block view.
```ts
class ChildView extends BlockComponent<MyBlockModel> {
private _handleClick = () => {
console.log('click1');
};
override connectedCallback() {
super.connectedCallback();
this.handleEvent('click', this._handleClick);
}
}
class ParentView extends BlockComponent<MyBlockModel> {
private _handleClick = () => {
console.log('click2');
};
override connectedCallback() {
super.connectedCallback();
this.handleEvent('click', this._handleClick);
}
}
```
When you click on the `ChildView`, the console will print:
```
click1
click2
```
You may want to stop the event from bubbling to the parent block view. You can simply return `true` in the event handler:
```ts
class ChildView extends BlockComponent<MyBlockModel> {
private _handleClick = () => {
console.log('click1');
return true;
};
override connectedCallback() {
super.connectedCallback();
this.handleEvent('click', this._handleClick);
}
}
```
Then the console will only print:
```
click1
```
The event bubbling is implemented by event target. For the events that won't support bubbling, the event dispatcher will use [block path](#) to dispatch events to the parent block views.
### Event Scope
By default, `handleEvents` will only subscribe events triggered by the block view and its children.
We also provide two more scopes to subscribe to make it possible to handle events triggered by other blocks.
#### Flavour Scope
The flavour scope will subscribe to events triggered by the block view and other blocks with the same flavour.
```ts
class MyBlock extends BlockComponent<MyBlockModel> {
override connectedCallback() {
super.connectedCallback();
this.handleEvent('click', this._handleClick, { flavour: true });
}
}
```
#### Global Scope
The global scope will subscribe to events triggered by the block view and all other blocks.
```ts
class MyBlock extends BlockComponent<MyBlockModel> {
override connectedCallback() {
super.connectedCallback();
this.handleEvent('click', this._handleClick, { global: true });
}
}
```
## Handling Hotkeys
The hotkey is a special event that can be triggered by the keyboard.
Key names may be strings like `"Shift-Ctrl-Enter"`—a key identifier prefixed with zero or more modifiers. Key identifiers
are based on the strings that can appear in [`KeyEvent.key`](https:///developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/key).
Use lowercase letters to refer to letter keys (or uppercase letters if you want shift to be held). You may use `"Space"` as an alias for the `" "` name.
Modifiers can be given in any order. `Shift-` (or `s-`), `Alt-` (or `a-`), `Ctrl-` (or `c-` or `Control-`) and `Cmd-` (or `m-` or
`Meta-`) are recognized.
For characters that are created by holding shift, the `Shift-` prefix is implied, and should not be added explicitly.
You can use `Mod-` as a shorthand for `Cmd-` on Mac and `Ctrl-` on other platforms.
```ts
class MyBlock extends BlockComponent<MyBlockModel> {
override connectedCallback() {
super.connectedCallback();
this.bindHotkey({
'Mod-b': () => {},
'Alt-Space': () => {},
});
}
}
```
Same as `handleEvent`, you can return `true` in the hotkey handler to stop the event from bubbling to the parent block view.