分支与切换:模式选择器

上一节是一个场景内的协同。现实中有多个场景需要在同一空间内切换——这时候用 select 实现分支。

核心思想:UI = f(state)。切换 mode 状态变量,整个视图区域自动切换。

slex: "0.1",
  namespace: "learn_tabs_branching",
  g: {
    mode: "length",
    value: 100,
    convert: function () {
      if (this.mode === "length") return (this.value / 100).toFixed(2) + " m";
      if (this.mode === "weight") return (this.value * 2.20462).toFixed(2) + " 磅 (lbs)";
      if (this.mode === "temp") return (this.value * 9 / 5 + 32).toFixed(1) + " °F";
      return "—";
    },
    label: function () {
      if (this.mode === "length") return "厘米转米";
      if (this.mode === "weight") return "公斤转磅";
      return "摄氏度转华氏度";
    }
  },
  layout: {
    "section:branching": {
      eyebrow: "入门教程 · 4/4",
      title: "分支与切换:模式选择器",
      subtitle: "切换下面的模式,输入的参数和计算结果会跟着变化。一种模式 = 一种 UI 状态。",
      "select:mode": {
        label: "转换模式",
        "$value": "g.mode",
        options: [
          { label: "长度 (cm → m)", value: "length" },
          { label: "重量 (kg → lbs)", value: "weight" },
          { label: "温度 (°C → °F)", value: "temp" }
        ],
        onchange: "g.mode = String($event)"
      },
      "input:value": { label: "输入值", "$value": "g.value", type: "number", onchange: "g.value = Number($event || 0)" },
      "stat:result": { "$label": "g.label()", "$value": "g.convert()" },
      "callout:guide": {
        "$tone": "g.mode === 'temp' ? 'warning' : 'info'",
        "$text": "g.mode === 'length' ? '1 米 = 100 厘米,除以 100 即可。' : g.mode === 'weight' ? '1 公斤 ≈ 2.20462 磅。' : '°F = °C × 9/5 + 32。华氏度范围更大,注意精度。'"
      }
    }
  }
}