Skip to content

事件处理

JSON Schema 通过 events 配置事件处理,支持多种动作类型。

基本语法

json
{
  "com": "NButton",
  "events": {
    "click": { "动作类型": "参数" }
  }
}

动作类型

set - 设置数据

设置单个数据:

json
{
  "events": {
    "click": { "set": "count", "value": "{{ count + 1 }}" }
  }
}

设置嵌套数据:

json
{
  "events": {
    "click": { "set": "form.username", "value": "admin" }
  }
}

call - 调用方法

调用自定义方法:

json
{
  "methods": {
    "handleSubmit": [
      { "set": "loading", "value": true },
      { "fetch": "/api/submit" }
    ]
  },
  "events": {
    "click": { "call": "handleSubmit" }
  }
}

带参数调用:

json
{
  "events": {
    "click": { "call": "deleteItem", "args": ["{{ row.id }}"] }
  }
}

调用全局方法:

json
{
  "events": {
    "click": { "call": "$router.push", "args": ["/home"] }
  }
}
json
{
  "events": {
    "click": { "call": "$message.success", "args": ["操作成功"] }
  }
}

fetch - 发起请求

GET 请求:

json
{
  "events": {
    "click": {
      "fetch": "/api/users",
      "then": [
        { "set": "list", "value": "{{ $response }}" }
      ]
    }
  }
}

POST 请求:

json
{
  "events": {
    "click": {
      "fetch": "/api/user",
      "method": "POST",
      "body": "{{ form }}",
      "then": [
        { "call": "$message.success", "args": ["保存成功"] }
      ],
      "catch": [
        { "call": "$message.error", "args": ["保存失败"] }
      ]
    }
  }
}

script - 执行脚本

json
{
  "events": {
    "click": {
      "script": "console.log('clicked'); state.count++;"
    }
  }
}

访问状态和方法:

json
{
  "events": {
    "click": {
      "script": "if (state.form.username) { await $methods.submit(); } else { window.$message?.warning('请输入用户名'); }"
    }
  }
}

emit - 触发事件

json
{
  "events": {
    "click": { "emit": "custom-event", "payload": "{{ selectedItem }}" }
  }
}

多个动作

使用数组执行多个动作:

json
{
  "events": {
    "click": [
      { "set": "loading", "value": true },
      { "fetch": "/api/data" },
      { "set": "loading", "value": false },
      { "call": "$message.success", "args": ["加载完成"] }
    ]
  }
}

条件动作

if-then-else

json
{
  "events": {
    "click": {
      "if": "form.username && form.password",
      "then": { "call": "login" },
      "else": { "call": "$message.warning", "args": ["请填写完整信息"] }
    }
  }
}

嵌套条件:

json
{
  "events": {
    "click": {
      "if": "!form.phone",
      "then": { "call": "$message.warning", "args": ["请输入手机号"] },
      "else": {
        "if": "!/^1[3-9]\\d{9}$/.test(form.phone)",
        "then": { "call": "$message.warning", "args": ["手机号格式不正确"] },
        "else": { "call": "sendCode" }
      }
    }
  }
}

常用事件

点击事件

json
{
  "com": "NButton",
  "events": {
    "click": { "call": "handleClick" }
  }
}

输入事件

json
{
  "com": "NInput",
  "events": {
    "input": { "set": "searchText", "value": "{{ $args[0] }}" },
    "blur": { "call": "validate" },
    "focus": { "set": "focused", "value": true }
  }
}

选择事件

json
{
  "com": "NSelect",
  "events": {
    "update:value": { "set": "selectedValue", "value": "{{ $args[0] }}" }
  }
}

表单事件

json
{
  "com": "NForm",
  "events": {
    "submit": { "call": "handleSubmit" }
  }
}

表格事件

json
{
  "com": "NDataTable",
  "events": {
    "update:checked-row-keys": { "set": "selectedKeys", "value": "{{ $args[0] }}" },
    "update:page": { "call": "handlePageChange", "args": ["{{ $args[0] }}"] }
  }
}

事件参数

$args

事件回调的参数数组:

json
{
  "events": {
    "update:value": { "set": "value", "value": "{{ $args[0] }}" }
  }
}

$event

原生 DOM 事件对象:

json
{
  "events": {
    "click": { "script": "console.log($event.target)" }
  }
}

row

表格行数据(在表格列渲染中):

json
{
  "events": {
    "click": { "call": "editRow", "args": ["{{ row }}"] }
  }
}

阻止默认行为

json
{
  "events": {
    "click": {
      "script": "$event.preventDefault(); $event.stopPropagation();"
    }
  }
}

防抖和节流

使用 script 实现:

json
{
  "data": {
    "searchTimer": null
  },
  "events": {
    "input": {
      "script": "clearTimeout(state.searchTimer); state.searchTimer = setTimeout(() => { $methods.search(); }, 300);"
    }
  }
}

示例:完整表单

json
{
  "data": {
    "form": { "username": "", "password": "" },
    "loading": false,
    "rules": {
      "username": [{ "required": true, "message": "请输入用户名" }],
      "password": [{ "required": true, "message": "请输入密码" }]
    }
  },
  "methods": {
    "handleSubmit": [
      { "set": "loading", "value": true },
      {
        "fetch": "/api/login",
        "method": "POST",
        "body": "{{ form }}",
        "then": [
          { "call": "$message.success", "args": ["登录成功"] },
          { "call": "$router.push", "args": ["/home"] }
        ],
        "catch": [
          { "call": "$message.error", "args": ["登录失败"] }
        ],
        "finally": [
          { "set": "loading", "value": false }
        ]
      }
    ]
  },
  "com": "NForm",
  "props": { "model": "{{ form }}", "rules": "{{ rules }}" },
  "children": [
    {
      "com": "NFormItem",
      "props": { "path": "username", "label": "用户名" },
      "children": [{ "com": "NInput", "model": "form.username" }]
    },
    {
      "com": "NFormItem",
      "props": { "path": "password", "label": "密码" },
      "children": [{ "com": "NInput", "model": "form.password", "props": { "type": "password" } }]
    },
    {
      "com": "NButton",
      "props": { "type": "primary", "loading": "{{ loading }}" },
      "events": { "click": { "call": "handleSubmit" } },
      "children": "登录"
    }
  ]
}

基于 MIT 许可发布