` 的形式显式向组件内注入对应节点。如果组件只有一个插槽位时调用代码可以直接写内容不需要使用模版来定义插槽。
### 3. 容器与 DOM 就绪机制 (DOM Readiness)
* **`container` 的本质**:在 `setupFunc` 中,传入的 `container` 参数**即为调用组件的 DOM 节点**。组件模板的根节点会合并到该节点变成同一个节点,但是调用组件时属性中的this指向上层组件,而组件内的this指向组件实例。
* **同步就绪**:当进入 `setupFunc` 时,组件的 DOM 树(包括插槽内容)已经**完全初始化并挂载就绪**,可以在 `setupFunc` 中直接使用。
### 4. 插槽 (Slot) 的渲染时序
* 组件框架在进入 setupFunc 之前就已经完成了插槽内容(`
`)的初始化注入。因此,在 setupFunc 中直接使用插槽内容是完全安全且符合预期的。
### 5. 高级状态管理与生命周期能力
* **隐式节点变量 (`thisNode`)**:
在 `$each` 循环或属性指令中,可以直接使用隐式变量 `thisNode` 获取当前执行上下文绑定的 DOM 节点对象自身。
## 四、 极简主义与高性能开发哲学
1. **拒绝过度工程 (No Over-engineering)**:严禁使用复杂的树结构或大段防御性代码。
2. **DOM 访问极小化**:优先通过 `this.state` 驱动 UI,避免在 JS 中手动调用 `element.style.xxx`。
3. **闭包与内存的权衡**:优先将逻辑挂载到 `container` 或 `container.state` 上。
4. **组件内聚**:能用指令解决的 UI 逻辑绝不写在 JS 里。
5. **思维重塑**:彻底抛弃 Vue/React 的生命周期崇拜,回归 DOM 本质。
6. **无分号运动**:除了必须的情况,代码结尾禁止使用分号 `;`。
## 五、 开发范例
### 范例 1:带插槽与 UI 的组件 (以 Modal 为例)
```javascript
Component.register('Modal', container => {
container.modal = new bootstrap.Modal(container)
container.addEventListener('bind', e => e.detail ? container.modal.show() : container.modal.hide())
container.addEventListener('hide.bs.modal', () => {
document.activeElement?.blur()
container.dispatchEvent(new CustomEvent('change', { bubbles: false, detail: false }))
})
Util.copyFunction(container, container.modal, 'show', 'hide')
}, Util.makeDom(/*html*/`
`))
```
### 范例 2:无模板纯逻辑组件 (以 API 为例)
```javascript
Component.register('API', container => {
container.request = NewState({ url: '', method: 'GET', headers: {}, data: null, timeout: 10000 })
container.response = NewState({ loading: false, result: null })
container.do = async (opt = {}) => {
const req = { ...container.request, ...opt }
container.response.loading = true
const resp = await fetch(req.url, req)
container.response.result = await resp.json()
container.response.loading = false
container.dispatchEvent(new CustomEvent('response', { detail: container.response }))
}
container.request.__watch(null, () => container.hasAttribute('auto') && container.request.url && container.do())
})
```