惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

美团技术团队
J
Java Code Geeks
有赞技术团队
有赞技术团队
GbyAI
GbyAI
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
酷 壳 – CoolShell
酷 壳 – CoolShell
博客园 - 叶小钗
阮一峰的网络日志
阮一峰的网络日志
Microsoft Security Blog
Microsoft Security Blog
IT之家
IT之家
G
Google Developers Blog
月光博客
月光博客
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
S
SegmentFault 最新的问题
博客园 - 三生石上(FineUI控件)
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
博客园 - Franky
腾讯CDC
V
Visual Studio Blog
博客园 - 【当耐特】
D
Docker
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Engineering at Meta
Engineering at Meta
L
LangChain Blog

皓子的小站

网站字体应用之坑——font-family 篇 糟糕的 meta name="theme-color" How to Automatically Track Newly Supported ESLint Rules in Oxlint How to Gradually Migrate from ESLint to Oxlint (Without Breaking Everything) 静态资源预压缩:零运行时开销,极致节省带宽 CVE-2025-70886 Proof of Concept (PoC) | A Script to Crash Halo CMS Comment Backend 自定义网页鼠标指针——一段曲折的旅程 CVE-2025-70886 漏洞复现/PoC | 一个脚本让 Halo CMS 评论后台瘫痪 2025 年终总结 & 博客两周年 老用户专享!已有 Halo 专业版授权可免费升级商业版 自动追踪 Oxlint 对 ESLint 规则的新增支持 Halo 贡献者证书与实体周边盲盒开箱 博客评论系统指南 CDN 回源跟随配置导致登录异常问题排查 SCDN 免费赞助计划:助力高质量博客&博客圈 锐捷校园网:网络共享与带宽叠加方案(哈理工案例) ESLint 到 Oxlint 渐进式迁移快速上手指南 Fixing Vite Breaking Inline JS & CSS in Thymeleaf Templates 解决 Vite 破坏 Thymeleaf 模板内联 JS & CSS 的方法 我的博客,为什么是月更? 博客俱乐部一周年纪念品开箱 网站字体加载之坑——format 篇 经历 1000000000 次 DDoS 请求攻击后,我总结了三条经验 题解分享:[AtCoder Beginner Contest 414 E] Count A%B=C 题解分享:[蓝桥杯 2025 国 Python A] 杨辉三角 P12876 FiF口语训练破解刷分教程(适用于 Windows) 不要与蠢人辩论 小心网络地雷·续篇 当心网络组织“开往”·续篇 当心网络组织“开往”
Halo CMS 表单定义的隐藏规则
HowieHz · 2026-06-14 · via 皓子的小站

前言

Halo CMS 文档在表单定义提到了,所有表单都使用了使用 FormKit Schema 来定义。这必然会伴随抽象泄露(Leaky Abstraction)问题——底层实现细节无法被完美隐藏,有时会暴露出来影响你。

问题描述

当你定义了以下的表单(设计意图:switch1 启用时,a 显示,反之 b 显示):

# settings.yaml
spec:
  forms:
    - group: group1
      label: 组标签
      formSchema:
        - $formkit: switch
          name: switch1
          label: 开关
          value: false
        - $formkit: number
          name: a
          if: "$switch1 === true"
          label: 真时显示,number 类型
          value: 200
        - $formkit: switch
          name: b
          if: "$switch1 === false"
          label: 假时显示,switch 类型
          value: true

你会发现当 switch1 切换并保存时,ab 的渲染会出现异常:渲染了一个四不像。需要刷新页面才能恢复正常。如下图所示:

正常版本

halo-form-key-1.avif

halo-form-key-2.avif

异常版本

halo-form-key-3.avif

halo-form-key-4.avif

原因

name: aname: b 会被渲染成同一个 Vue 组件 <FormKit>。当条件发生变化时,Vue 的差异算法看到这个位置上始终是 <FormKit> 组件,就会尽量复用已有的组件实例。

​解决办法

类似使用 v-for 时建议添加 key:定义表单时给每个字段指定一个 key,避免 Vue 意外复用。

修改后如下:

# settings.yaml
spec:
  forms:
    - group: group1
      label: 组标签
      formSchema:
        - $formkit: switch
          name: switch1
          label: 开关
          value: false
        - $formkit: number
          name: a
          key: a  // [!code ++]
          if: "$switch1 === true"
          label: 真时显示,number 类型
          value: 200
        - $formkit: switch
          name: b
          key: c  // [!code ++]
          if: "$switch1 === false"
          label: 假时显示,switch 类型
          value: true

总结

定义表单时,建议给每个 name: 都配备一个 key:,以避免类似的渲染错误。

类似的渲染错误还容易出现在 array 组件。