返回顶部
f

fosmvvm-leaf-view-generatorFOSMVVM叶子视图生成器

Generate Leaf templates for FOSMVVM WebApps. Create full-page views and HTML-over-the-wire fragments that render ViewModels.

作者: admin | 来源: ClawHub
源自
ClawHub
版本
V 2.0.6
安全检测
已通过
633
下载量
免费
免费
0
收藏
概述
安装方式
版本历史

fosmvvm-leaf-view-generator

FOSMVVM Leaf 视图生成器

生成用于渲染 Web 客户端 ViewModel 的 Leaf 模板。

架构上下文: 参见 FOSMVVMArchitecture.md | OpenClaw 参考


Web 应用的视图层

在 FOSMVVM 中,Leaf 模板是 Web 客户端 M-V-VM 架构中的视图

模型 → ViewModel → Leaf 模板 → HTML
↑ ↑
(已本地化) (渲染它)

关键原则: ViewModel 在到达模板时已完成本地化。模板仅渲染接收到的内容。



核心原则:视图与 ViewModel 对齐

Leaf 文件名应与它渲染的 ViewModel 名称匹配。

Sources/
{ViewModelsTarget}/
ViewModels/
{Feature}ViewModel.swift ←──┐
{Entity}CardViewModel.swift ←──┼── 相同名称

{WebAppTarget}/ │
Resources/Views/ │
{Feature}/ │
{Feature}View.leaf ────┤ (渲染 {Feature}ViewModel)
{Entity}CardView.leaf ────┘ (渲染 {Entity}CardViewModel)

这种对齐提供了:

  • - 可发现性 - 即时找到任何 ViewModel 的模板
  • 一致性 - 与 SwiftUI 相同的命名规范
  • 可维护性 - ViewModel 的变更会反映在模板位置中



两种模板类型

全页模板

渲染包含布局、导航、CSS/JS 引入的完整页面。

{Feature}View.leaf
├── 继承基础布局
├── 包含 、、
├── 渲染 {Feature}ViewModel
└── 可能嵌入组件片段模板

用于: 初始页面加载、导航目标。

片段模板

渲染单个组件 - 无布局,无页面结构。

{Entity}CardView.leaf
├── 无布局继承
├── 单个根元素
├── 渲染 {Entity}CardViewModel
├── 包含用于状态的 data-* 属性
└── 返回给 JS 进行 DOM 替换

用于: 部分更新、HTML-over-the-wire 响应。



HTML-Over-The-Wire 模式

用于无需完整页面重新加载的动态更新:

JS 事件 → WebApp 路由 → ServerRequest.processRequest() → 控制器

ViewModel

HTML ← JS DOM 替换 ← WebApp 返回 ← Leaf 渲染 ←────────┘

WebApp 路由:
swift
app.post(move-{entity}) { req async throws -> Response in
let body = try req.content.decode(Move{Entity}Request.RequestBody.self)
let serverRequest = Move{Entity}Request(requestBody: body)
guard let response = try await serverRequest.processRequest(baseURL: app.serverBaseURL) else {
throw Abort(.internalServerError)
}

// 使用 ViewModel 渲染片段模板
return try await req.view.render(
{Feature}/{Entity}CardView,
[card: response.viewModel]
).encodeResponse(for: req)
}

JS 接收 HTML 并将其替换到 DOM 中 - 无需 JSON 解析,无需客户端渲染。



何时使用此技能

  • - 创建新的页面模板(全页)
  • 创建新的卡片、行或组件模板(片段)
  • 为 JS 事件处理添加数据属性
  • 排查 Localizable 类型渲染不正确的问题
  • 为 HTML-over-the-wire 响应设置模板

关键模式

模式 1:用于状态的数据属性

片段必须嵌入 JS 未来操作所需的所有状态:

html

data-{entity}-id=#(card.id)
data-status=#(card.status)
data-category=#(card.category)
draggable=true>

规则:

  • - data-{entity}-id 用于主标识符
  • data-{field} 用于状态值(短横线命名法)
  • 存储原始值(枚举 case),而非本地化显示名称
  • JS 读取这些值以构建 ServerRequest 负载

javascript
const request = {
{entity}Id: element.dataset.{entity}Id,
newStatus: targetColumn.dataset.status
};

模式 2:Leaf 中的 Localizable 类型

FOSMVVM 的 LeafDataRepresentable 一致性会自动处理 Localizable 类型。

在模板中,直接使用属性:
html
#(card.createdAt)

如果 Localizable 类型渲染不正确(显示 [ds: 2, ls: ..., v: ...]):

  1. 1. 确保已导入 FOSMVVMVapor
  2. 检查 Localizable+Leaf.swift 是否存在并包含一致性声明
  3. 清理构建:swift package clean && swift build

模式 3:显示值与标识符

ViewModel 应同时提供原始值(用于数据属性)和本地化字符串(用于显示)。关于枚举本地化,请参见枚举本地化模式

swift
@ViewModel
public struct {Entity}CardViewModel {
public let id: ModelIdType // 用于 data-{entity}-id
public let status: {Entity}Status // 用于 data-status 的原始枚举
public let statusDisplay: LocalizableString // 已本地化(存储,非 @LocalizedString)
}

html


#(card.statusDisplay)

模式 4:片段结构

片段应尽量精简 - 仅包含组件本身:

html

data-{entity}-id=#(card.id)
data-status=#(card.status)>


#(card.contentPreview)



规则:

  1. 1. 无 #extend(base) - 片段不使用布局
  2. 单个根元素 - 使 DOM 替换更简洁
  3. 所有必需状态都在 data-* 属性中
  4. 来自 ViewModel 属性的本地化值

模式 5:全页结构

全页继承基础布局:

html

#extend(base):
#export(content):



#(viewModel.title)



#for(card in viewModel.cards):
#extend({Feature}/{Entity}CardView)
#endfor

#endexport
#endextend

模式 6:条件渲染

html
#if(card.isHighPriority):
#(card.priorityLabel)
#endif

#if(card.assignee):


#(card.assignee.name)

#else:
#(card.unassignedLabel)

#endif

模式 7:带嵌入片段的循环

html



#(column.displayName)


#(column.count)


#for(card in column.cards):
#extend({Feature}/{Entity}CardView)
#endfor

#if(column.cards.count == 0):

#(column.emptyMessage)

#endif




文件组织

Sources/{WebAppTarget}/Resources/Views/
├── base.leaf # 基础布局(所有页面继承此布局)
├── {Feature}/
│ ├── {Feature}View.leaf # 全页 → {Feature}ViewModel
│ ├── {Entity}CardView

标签

skill ai

通过对话安装

该技能支持在以下平台通过对话安装:

OpenClaw WorkBuddy QClaw Kimi Claude

方式一:安装 SkillHub 和技能

帮我安装 SkillHub 和 fosmvvm-leaf-view-generator-1776420040 技能

方式二:设置 SkillHub 为优先技能安装源

设置 SkillHub 为我的优先技能安装源,然后帮我安装 fosmvvm-leaf-view-generator-1776420040 技能

通过命令行安装

skillhub install fosmvvm-leaf-view-generator-1776420040

下载

⬇ 下载 fosmvvm-leaf-view-generator v2.0.6(免费)

文件大小: 10.95 KB | 发布时间: 2026-4-17 19:54

v2.0.6 最新 2026-4-17 19:54
Initial ClawHub release

Archiver·手机版·闲社网·闲社论坛·羊毛社区· 多链控股集团有限公司 · 苏ICP备2025199260号-1

Powered by Discuz! X5.0   © 2024-2025 闲社网·线报更新论坛·羊毛分享社区·http://xianshe.com

p2p_official_large
返回顶部