# Block View In BlockSuite, blocks can be rendered by any UI framework. A block should be rendered to a DOM element, and we use `view` to represent the renderer. By default, we provide a [lit](https://lit.dev/) renderer called `@blocksuite/lit`. But it's still possible to use other UI frameworks. We'll introduce later about how to write custom block renderers. ## Web Component Block View We provide a `BlockComponent` class to help building a lit-based block view. ```ts import { defineBlockSchema, type SchemaToModel } from '@blocksuite/store'; import { BlockComponent } from '@blocksuite/lit'; import { html } from 'lit'; import { customElement } from 'lit/decorators.js'; const myBlockSchema = defineBlockSchema({ //... props: () => ({ count: 0, }), }); type MyBlockModel = SchemaToModel; @customElements('my-block') class MyBlockView extends BlockComponent { override render() { return html`

My Block

`; } } ``` ## Render Children A block can have children, and we can render them by using `renderModelChildren`. ```ts @customElements('my-block') class MyBlockView extends BlockComponent { override render() { return html`

My Block

${this.renderModelChildren(this.model)}
`; } } ``` ## Get and Set Props It's easy to get and set props in a block view. ```ts @customElements('my-block') class MyBlockView extends BlockComponent { private _onClick = () => { this.doc.updateBlock(this.model, { count: this.model.count + 1, }); }; override render() { return html`

My Block

Count: ${this.model.count}

`; } } ``` It's also possible to watch prop changes to create something like `computed props`. ```ts @customElements('my-block') class MyBlockView extends BlockComponent { private _yen = '0¥'; override connectedCallback() { super.connectedCallback(); this.model.propsUpdated.on(() => { this._yen = `${this.model.count * 100}¥`; }); } override render() { return html`

My Block

Price: ${this._yen}

`; } } ``` You can get the `std` instance from `this.std` to use the full power of [`block-std`](/api/@blocksuite/block-std/).