---
title: Formula 公式
description:
type: 0
group: null
menuName: Formula
icon:
order: 22
---

可以设置公式，将公式结果设置到指定表单项上。

> 该表单项是隐藏的

## 基本用法

```schema: scope="body"
{
  "type": "form",
  "controls": [
  {
    "type": "number",
    "name": "a",
    "label": "A"
  },
  {
    "type": "number",
    "name": "b",
    "label": "B"
  },
  {
    "type": "number",
    "name": "sum",
    "label": "和",
    "disabled": true,
    "description": "自动计算 A + B"
  },
  {
    "type": "formula",
    "name": "sum",
    "value": 0,
    "formula": "a + b"
  }
]
}
```

## 自动应用

```schema: scope="body"
{
  "type": "form",
  "controls": [
    {
        "type": "number",
        "name": "a",
        "label": "A"
    },
    {
        "type": "number",
        "name": "b",
        "label": "B"
    },
    {
        "type": "number",
        "name": "sum",
        "label": "和",
        "disabled": true,
        "description": "自动计算 A + B"
    },
    {
        "type": "formula",
        "name": "sum",
        "value": 0,
        "formula": "a + b"
    }
]
}
```

## 手动应用

配置`"autoSet": false`，然后按钮上配置`target`，配置值为`formula`的`id`值，就可以实现手动触发公式应用

```schema: scope="body"
{
  "type": "form",
  "controls": [
    {
        "type": "number",
        "name": "a",
        "label": "A"
    },
    {
        "type": "number",
        "name": "b",
        "label": "B"
    },
    {
        "type": "group",
        "controls": [
            {
                "type": "number",
                "name": "sum",
                "label": "和",
                "disabled": true,
                "columnClassName": "col-sm-11"
            },
            {
                "type": "button",
                "label": "计算",
                "columnClassName": "col-sm-1 v-bottom",
                "target": "theFormula"
            }
        ]
    },
    {
        "type": "formula",
        "name": "sum",
        "id": "theFormula",
        "value": 0,
        "formula": "a + b",
        "initSet": false,
        "autoSet": false
    }
]
}
```

> 为什么设置`id`而不是设置`name`?
>
> 因为`name`值已经用来设置目标变量名了，这个表单项肯定已经存在了，所以不是唯一了，不能够被按钮指定。

## 条件应用

可以配置`condition`用来指定作用条件，有两种写法：

- 用 tpl 语法，把关联的字段写上如： `${xxx} ${yyy}` 意思是当 xxx 和 yyy 的取值结果变化了就再应用一次公式结果。
- 自己写判断如: `this.xxx == "a" && this.xxx !== this.__prev.xxx` 当 xxx 变化了，且新的值是字符 "a" 时应用，可以写更加复杂的判断。

```schema: scope="body"
{
  "type": "form",
  "controls": [
    {
      "type": "radios",
      "name": "radios",
      "label": "radios",
      "options": [
        {
          "label": "a",
          "value": "a"
        },
        {
          "label": "b",
          "value": "b"
        }
      ],
      "description": "radios 变化会自动清空 B"
    },
    {
      "type": "text",
      "name": "b",
      "label": "B"
    },
    {
      "type": "formula",
      "name": "b",
      "value": "some string",
      "formula": "''",
      "condition": "${radios}",
      "initSet": false
    }
  ]
}
```

## 属性表

| 属性名    | 类型                                | 默认值 | 说明                                                                                                           |
| --------- | ----------------------------------- | ------ | -------------------------------------------------------------------------------------------------------------- |
| name      | `string`                            |        | 需要应用的表单项`name`值，公式结果将作用到此处指定的变量中去。                                                 |
| formula   | [表达式](../../concepts/expression) |        | 应用的公式                                                                                                     |
| condition | [表达式](../../concepts/expression) |        | 公式作用条件                                                                                                   |
| initSet   | `boolean`                           | `true` | 初始化时是否设置                                                                                               |
| autoSet   | `boolean`                           | `true` | 观察公式结果，如果计算结果有变化，则自动应用到变量上                                                           |
| id        | `boolean`                           | `true` | 定义个名字，当某个按钮的目标指定为此值后，会触发一次公式应用。这个机制可以在 `autoSet` 为 false 时用来手动触发 |
