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

推荐订阅源

云风的 BLOG
云风的 BLOG
L
LangChain Blog
Recent Announcements
Recent Announcements
P
Proofpoint News Feed
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
B
Blog
D
DataBreaches.Net
腾讯CDC
Martin Fowler
Martin Fowler
Google DeepMind News
Google DeepMind News
MyScale Blog
MyScale Blog
F
Fortinet All Blogs
Microsoft Azure Blog
Microsoft Azure Blog
M
MIT News - Artificial intelligence
GbyAI
GbyAI
N
Netflix TechBlog - Medium
The GitHub Blog
The GitHub Blog
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
T
The Blog of Author Tim Ferriss
D
Docker
V
Visual Studio Blog
宝玉的分享
宝玉的分享
A
About on SuperTechFans
量子位

皓子的小站

网站字体应用之坑——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 组件。