--- name: zhin-component-rendering description: Covers Zhin component rendering, defineComponent usage, and message template composition. Use when creating reusable message UI components. license: MIT metadata: author: zhinjs version: "1.0" framework: zhin --- # Zhin Component Rendering Skill Use this skill when developers need to create reusable message components with Zhin's component system. ## Define and Register a Component ```ts import { defineComponent, usePlugin } from '@zhin.js/core' const plugin = usePlugin() const StatusCard = defineComponent((props: { title: string, value: string }, context) => { return `${props.title}: ${props.value}` }, 'status-card') plugin.addComponent(StatusCard) ``` ## Template Usage Components render within message templates: ```ts await message.$reply('') ``` You can nest components: ```ts await message.$reply('') ``` ## Props & Expressions Props support inline expressions with `{}` and template interpolation via `${}` when rendering: ```ts const Card = defineComponent((props: { title: string, count: number }) => { return `${props.title}: ${props.count}` }, 'card') await message.$reply('') ``` ## Rendering Lifecycle The component service attaches a `before.sendMessage` listener to render templates before messages send. If you need to pre-render a template manually, use `renderComponents`: ```ts import { renderComponents } from '@zhin.js/core' const options = await renderComponents(componentService.byName, { context: 'process', bot: 'dev', type: 'private', id: '123', content: '' }) ``` ## Built-in Components Zhin includes: - `Fragment` for grouping/children rendering - `fetch` for loading remote content (use carefully and validate URLs) ## Best Practices - Keep components small and reusable. - Validate and sanitize user input before passing it into templates. - Avoid untrusted URLs with the `fetch` component.