diff --git a/zh-CN/api/message/api.md b/zh-CN/api/message/api.md
index a2b9e890e284..a7e02de7189b 100644
--- a/zh-CN/api/message/api.md
+++ b/zh-CN/api/message/api.md
@@ -16,12 +16,12 @@ interface Element {
### h(type, attrs?, ...children?)
-- **type:** `string` 消息元素类型
+- **type:** `string | Function` 消息元素类型
- **attrs:** `object` 消息元素属性
- **children:** `Element[]` 子消息元素
- 返回值: `Element` 生成的消息元素
-构造一个消息元素对象。
+构造一个消息元素对象。如果 `type` 是一个函数,则会视为一个自定义消息组件。
### h.escape(source, inline?)
diff --git a/zh-CN/api/message/elements.md b/zh-CN/api/message/elements.md
index 3a30694d6b0b..17ce4067ef66 100644
--- a/zh-CN/api/message/elements.md
+++ b/zh-CN/api/message/elements.md
@@ -197,6 +197,10 @@
## 排版元素
+### 换行 (br)
+
+`
` 元素表示一个独立的换行。
+
### 段落 (p)
`
` 元素表示一个段落。在渲染时,它与相邻的元素之间会确保有一个换行。
diff --git a/zh-CN/guide/basic/element.md b/zh-CN/guide/basic/element.md
index 72edcba26081..79278c8e6b30 100644
--- a/zh-CN/guide/basic/element.md
+++ b/zh-CN/guide/basic/element.md
@@ -144,23 +144,66 @@ h.image(buffer, 'image/png')
## 消息组件
-除了标准元素外,Koishi 还提供了一系列名为 **消息组件 (Component)** 的高级元素。例如:
+**消息组件 (Component)** 是一种对消息元素的扩展和封装。它允许你创建可重用的定制元素,并在渲染时引入自定义逻辑。例如,`` 组件会将其中的内容作为指令执行,并将执行结果替换该元素:
-- `execute`:执行指令
-- `prompt`:等待输入
-- `i18n`:国际化
-- `random`:随机选择
+```html
+这是执行结果:echo hello
+```
+
+
+这是执行结果:hello
+
+
+如你所见,你可以像使用普通的消息元素一样使用消息组件。唯一的区别是消息组件不由适配器实现,而是由 Koishi 直接处理。与之相对的,某些消息组件只有在特定的会话环境下才能使用 (例如在 `ctx.broadcast()` 中传入 `` 是无意义的,也会抛出错误)。
+
+Koishi 已经内置了一系列消息组件,包括:
+
+- ``:执行指令
+- ``:等待输入
+- ``:国际化
+- ``:随机选择
+
+你可以在 [这个页面](../../api/message/components.md) 了解每个组件的详细用法和适用范围。
+
+### 声明消息组件
+
+一个消息组件本质上是一个函数,它接受三个参数:
+
+- **attrs:** 元素的属性
+- **children:** 子元素列表
+- **session:** 当前会话
+
+例如,下面的代码就定义了一个简单的消息组件:
-这些元素的用法与标准元素类似,但它们不在适配器中实现,而由 Koishi 直接处理。与之相对的,部分消息组件只有在会话环境下才能使用 (例如在 `ctx.broadcast()` 中传入 `` 是无意义的,也会抛出错误)。
+```ts
+// 请注意函数名必须以大写字母开头
+function Custom(attrs, children, session) {
+ return '自定义内容'
+}
+```
-消息组件也是可以由插件扩展的:
+你可以直接在渲染时使用这个组件:
+
+::: tabs code
+```tsx title=JSX
+// 请注意这里的大写字母
+session.send()
+```
+```ts title=API
+// 请注意这里的大写字母
+session.send(h(Custom))
+```
+:::
+
+### 注册全局组件
+
+上面的写法只能在当前文件中使用,并且必须以大写字母开头。如果想要更自然的写法,并将组件提供给其他插件使用,只需使用 `ctx.component()` 将它注册为一个全局组件:
```ts
ctx.component('custom', (attrs, children, session) => {
return '自定义内容'
})
-session.send() // -> 自定义内容
+// 现在你可以在任何地方使用小写的 了
+session.send()
```
-
-我们在 [这个页面](../../api/message/components.md) 中列出了所有的内置组件,你可以稍后在这里查看每个组件的详细用法和适用范围。