@rockn/vue-formula-editor
@rockn/vue-formula-editor
可复用的 Vue 3 公式编辑器组件 + 零依赖公式引擎。IF/ELSE 块状逻辑、点选变量与函数、枚举标签-值、键值对成员访问、语法高亮、实时求值与安全校验。引擎可脱离 Vue 单独使用,一套引擎同时服务编辑器与你的业务代码。
特性
- 块状 IF / ELSE IF / ELSE:
IF 条件 THEN 真值 ELSE IF 条件 THEN 真值 … ELSE 假值,贴近自然语言;也支持中文关键字如果 / 那么 / 否则 / 否则如果 - 函数式兼容:
IF(条件, 真值, 假值)、IFS(...)、a ? b : c、中缀AND / OR依旧可用 - 枚举变量(标签 ↔ 值):公式里写/显示标签(
{会员等级} == '金卡'),求值返回代码值(如GOLD),比较时标签与值双向可匹配;变量面板可点选标签 - 键值对变量(成员访问):
{订单}.金额、{订单}['金额']、{订单}.商品[0],链式访问;字段定义优先、context 键兜底校验 - 47 个内置函数:逻辑、数字、文本(含
CONTAINS/REPLACE/SPLIT等)、类型转换、日期、聚合统计 - 悬停提示:变量(类型/必填/描述/当前值/枚举标签/键值对字段)、函数(签名/参数说明/示例)、关键字、运算符
- 函数面板:点选插入任意内置函数,占位参数自动选中
- 编辑体验:变量/函数点选插入、
{变量}整块删除(仅光标在花括号内)、Enter 自动缩进 + 行尾内联 ELSE 拆行、一键格式化、括号配对高亮、当前行高亮 - 实时求值:通过
context传测试值,输入即算(击键防抖),结果实时显示 - 安全引擎:递归下降解析 + AST 求值,无
eval/new Function,类型严格检查,错误带原文偏移 - 零依赖引擎:
engine子路径无任何依赖,可在 Node / 其他框架直接使用 - 自定义函数:
functionsprop 注入业务函数,functionSpecsprop 提供签名提示 - 双主题:dark / light,全部样式用
--fe-*CSS 变量,可覆盖
安装
npm install @rockn/vue-formula-editor
# 或
pnpm add @rockn/vue-formula-editor
快速开始
1. 作为 Vue 组件使用
<script setup lang="ts">
import { ref, reactive } from 'vue'
import { FormulaEditor } from '@rockn/vue-formula-editor'
import type { VariableDef } from '@rockn/vue-formula-editor'
const variables: VariableDef[] = [
{ name: '订单金额', type: 'number', description: '订单总金额(元)', required: true },
{ name: '会员等级', type: 'enum', description: '用户会员等级',
options: [
{ label: '金卡', value: 'GOLD' },
{ label: '黑金', value: 'BLACK' },
] },
{ name: '订单', type: 'object', description: '订单对象',
fields: [{ key: '金额' }, { key: '收货人' }] },
]
const formula = ref(`IF {会员等级} == '金卡' OR {会员等级} == '黑金' THEN
ROUND({订单金额} * 0.85, 2)
ELSE
{订单金额}`)
// 测试值:枚举存代码值,公式写标签
const context = reactive({
订单金额: 520,
会员等级: 'GOLD',
订单: { 金额: 520, 收货人: '张三' },
})
</script>
<template>
<FormulaEditor
v-model="formula"
:variables="variables"
:context="context"
title="折扣规则"
subtitle="RULE FORMULA"
/>
</template>
从
1.0.2起,import { FormulaEditor } from '@rockn/vue-formula-editor'会自动带上样式。也可显式引入:import '@rockn/vue-formula-editor/style.css'
2. 单独使用引擎(不依赖 Vue)
import { evaluateFormula, validateFormula } from '@rockn/vue-formula-editor/engine'
// 枚举变量:传变量元数据即可做标签-值解析
const variables = [
{ name: '会员等级', type: 'enum', options: [{ label: '金卡', value: 'GOLD' }] },
]
const result = evaluateFormula(
`IF {会员等级} == '金卡' THEN {金额} - 20 ELSE {金额}`,
{ 金额: 520, 会员等级: 'GOLD' },
{},
variables,
)
if (result.ok) {
console.log(result.value) // 500
} else {
console.error(result.error.message, result.error.start, result.error.end)
}
// 静态校验(未定义变量 / 字段存在性 / 函数参数个数)
const check = validateFormula(`{订单}.金额 > 0`, [
{ name: '订单', type: 'object', fields: [{ key: '金额' }] },
])
3. Node / CommonJS
const { evaluateFormula } = require('@rockn/vue-formula-editor/engine')
Props
| Prop | 类型 | 默认 | 说明 |
|---|---|---|---|
modelValue |
string |
'' |
公式文本(配合 v-model) |
variables |
VariableDef[] |
[] |
变量定义(支持枚举 / 键值对) |
context |
Record<string, unknown> |
{} |
测试值,用于实时求值 |
functions |
Record<string, (args: unknown[]) => unknown> |
{} |
自定义函数(参数已求值) |
functionSpecs |
Record<string, CustomFunctionSpec> |
{} |
自定义函数文档(悬停提示/函数面板) |
title / subtitle |
string |
默认 | 头部标题 |
placeholder |
string |
默认提示 | 占位文案 |
height |
string |
'340px' |
编辑区可视高度,超出后内部滚动 |
disabled / readonly |
boolean |
false |
禁用 / 只读 |
showVariablesPanel |
boolean |
true |
显示变量面板 |
showToolbar |
boolean |
true |
显示语法快捷工具条 |
showPreview |
boolean |
true |
显示实时求值条 |
theme |
'dark' | 'light' |
'dark' |
主题 |
Events
| 事件 | 参数 | 说明 |
|---|---|---|
update:modelValue |
string |
内容变化(v-model) |
change |
string |
内容变化(与上面同时触发) |
error |
ValidationResult |
校验结果变化({ ok, errors }) |
insert |
{ type, value } |
插入变量/函数/文本时触发 |
update:theme |
'dark' | 'light' |
主题切换 |
update:context |
Record<string, unknown> |
测试面板改测试值 |
暴露的实例方法(ref)
const editor = ref<InstanceType<typeof FormulaEditor>>()
// editor.value.validate() → ValidationResult
// editor.value.evaluate(ctx?) → EvalResult
// editor.value.insertText('{金额}') → 在光标处插入
// editor.value.focus()
公式语法速览
| 语法 | 示例 | 说明 |
|---|---|---|
| 变量 | {订单金额} |
花括号包裹,支持中文名 |
| 成员访问 | {订单}.金额 / {订单}['金额'] / {订单}.商品[0] |
键值对取字段,可链式 |
| 枚举比较 | {会员等级} == '金卡' |
写标签、算代码值,双向可匹配 |
| 字面量 | 1.5 '文本' true null undefined |
数字/字符串/布尔/空 |
| 算术 | + - * / % ** |
** 为幂运算,右结合 |
| 比较 | < <= > >= == != === !== |
== 宽松('5' == 5 为真) |
| 逻辑 | AND OR && || ! |
中缀 AND/OR 大小写不敏感 |
| 块状条件 | IF 条件 THEN 真值 ELSE 假值 |
支持多级 ELSE IF,短路求值 |
| 中文条件 | 如果 条件 那么 真值 否则 假值 |
否则如果 为 else-if |
| 函数 | ROUND({金额} * 0.9, 2) |
参数逗号分隔 |
文档
本地开发
npm install
npm run dev # 演示页 http://localhost:5162
npm run build # 类型检查 + 演示打包
npm run build:lib # 组件库打包(dist/,供发布)
npm run typecheck # 仅类型检查
npm run smoke # 引擎冒烟测试(152 项断言)
npm pack # 生成可发布的 tgz(会自动 build:lib)
发布
npm login # 登录你的 npm 账号(包名为 @rockn/vue-formula-editor)
npm run build:lib # 构建组件库
npm publish --access public
注意:Windows + Node 24 下
fs.rmSync与vite-plugin-dts存在原生崩溃(STATUS_STACK_BUFFER_OVERRUN)。本项目构建脚本已改用异步rm规避,声明文件由vue-tsc+ 手写types/生成。
许可
MIT
Related Packages
@agilehub/agile-latex-formula
Vue 3 LaTeX editor component with MathJax rendering, symbol library, and export...
0
0
Version History
| Version | Released | License |
|---|---|---|
| 1.0.9 | MIT | |
| 1.0.8 | MIT | |
| 1.0.7 | MIT | |
| 1.0.6 | MIT | |
| 1.0.5 | MIT | |
| 1.0.4 | MIT | |
| 1.0.3 | MIT | |
| 1.0.2 | MIT | |
| 1.0.1 | MIT | |
| 1.0.0 | MIT |