JuanForm vs FormCreate: A Vue 3 Form-Engine Linked-Config Shootout
The PK draws the architectural line for anyone building or choosing a Vue 3 form engine: target-field, scope-and-node config over a plain-object schema versus source-field control over a `ref()`-wrapped reactive rule tree. That line determines how far pure config can stretch before users hit closed components, init-order workarounds, or listener overhead, and since the comparison comes from JuanForm's own developer, its claims are best treated as a strong opinion to verify against real workloads rather than a neutral benchmark.
The author runs JuanForm, the self-developed engine, against FormCreate on the same six sets of linked-form requirements. Field hiding, expression-based summation, cross-layer writes, province-city cascades, dynamic beneficiary lists with row/column styling, conditional hints, and add limits all get configured in both engines with code and rendered Element Plus effects.
The comparison comes down to where dependencies are declared. JuanForm puts `hidden`, `expression`, and `dependsOn` on the target field, reading values through a scope chain that mirrors Vue's own template semantics — `<template v-if>`, per-row nodes, path-based lookups. FormCreate mostly wires source fields to targets via `control`, `link`, and `update`, and its `computed` variants only work when the entire rule array is wrapped in `ref()`, which the author argues becomes a listener-performance burden as schemas grow.
FormCreate's list handling is closed around a `group` component with built-in add/delete buttons and hooks like `onBeforeAdd`; JuanForm treats add, delete, and limits as ordinary button fields. Cross-layer writes also expose a FormCreate gap: the first write fires before nested subforms initialize, and its `api.nextTick` is actually a `setTimeout(..., 10)` shim rather than Vue's `nextTick`. The verdict favors JuanForm for complex, page-level linking and FormCreate for smaller, standard forms.
The comparison is written by JuanForm's own developer as a home-match "PK": FormCreate's ecosystem, docs, and existing adoption are never weighed, only its config mechanics, so the clean-mechanism verdict is an engineering opinion from the competing engine's team.
The `ref()`-wrapped rule array is the article's strongest concrete charge, but the author concedes it matters little for small forms, which narrows the performance argument to large, config-heavy schemas.
FormCreate's `nextTick` being a `setTimeout` shim points to a real render-ordering gap in its pipeline; whether that stays a corner-case workaround or becomes a maintenance hazard depends on how often nested init-order writes occur in production forms.
The deeper position this stakes out is architectural: a runtime modeled on nodes and scope, close to how a Vue developer writes templates by hand, versus a runtime modeled on a rule tree and instance APIs, which is more imperative and tends toward closed components and per-case configuration interfaces.
An author spent 8 years developing a Vue low-code form, and then an AI analysis of the open-source code reveals a whole range of design and extensibility problems 🤣