Skip to content

综合示例

用户管理页面

json
{
  "data": {
    "users": [],
    "loading": false,
    "pagination": { "page": 1, "size": 10, "total": 0 },
    "searchKeyword": "",
    "showModal": false,
    "editingUser": null,
    "form": { "name": "", "email": "", "role": "user" }
  },
  "computed": {
    "totalPages": "Math.ceil(pagination.total / pagination.size)",
    "isEditing": "editingUser !== null"
  },
  "methods": {
    "loadUsers": [
      { "set": "loading", "value": true },
      {
        "fetch": "/api/users?page={{ pagination.page }}&size={{ pagination.size }}&keyword={{ searchKeyword }}",
        "then": [
          { "set": "users", "value": "{{ $response.items }}" },
          { "set": "pagination.total", "value": "{{ $response.total }}" }
        ],
        "finally": { "set": "loading", "value": false }
      }
    ],
    "openCreateModal": [
      { "set": "editingUser", "value": null },
      { "set": "form", "value": "{{ { name: '', email: '', role: 'user' } }}" },
      { "set": "showModal", "value": true }
    ],
    "openEditModal": [
      { "set": "editingUser", "value": "{{ $event }}" },
      { "set": "form", "value": "{{ { name: $event.name, email: $event.email, role: $event.role } }}" },
      { "set": "showModal", "value": true }
    ],
    "closeModal": { "set": "showModal", "value": false },
    "saveUser": [
      {
        "if": "isEditing",
        "then": {
          "fetch": "/api/users/{{ editingUser.id }}",
          "method": "PUT",
          "body": "{{ form }}",
          "then": [
            { "call": "closeModal" },
            { "call": "loadUsers" }
          ]
        },
        "else": {
          "fetch": "/api/users",
          "method": "POST",
          "body": "{{ form }}",
          "then": [
            { "call": "closeModal" },
            { "call": "loadUsers" }
          ]
        }
      }
    ],
    "deleteUser": {
      "if": "confirm('确定要删除该用户吗?')",
      "then": {
        "fetch": "/api/users/{{ $event }}",
        "method": "DELETE",
        "then": { "call": "loadUsers" }
      }
    },
    "changePage": [
      { "set": "pagination.page", "value": "{{ $event }}" },
      { "call": "loadUsers" }
    ]
  },
  "onMounted": { "call": "loadUsers" },
  "com": "div",
  "props": { "class": "user-management" },
  "children": [
    {
      "com": "div",
      "props": { "class": "toolbar" },
      "children": [
        {
          "com": "input",
          "model": "searchKeyword",
          "props": { "placeholder": "搜索用户..." },
          "events": { "keyup.enter": { "call": "loadUsers" } }
        },
        {
          "com": "button",
          "events": { "click": { "call": "openCreateModal" } },
          "children": "新建用户"
        }
      ]
    },
    {
      "com": "div",
      "if": "loading",
      "children": "加载中..."
    },
    {
      "com": "table",
      "if": "!loading",
      "children": "..."
    },
    {
      "com": "div",
      "if": "showModal",
      "props": { "class": "modal-overlay" },
      "children": [
        {
          "com": "div",
          "props": { "class": "modal" },
          "children": [
            { "com": "h3", "children": "{{ isEditing ? '编辑用户' : '新建用户' }}" },
            {
              "com": "form",
              "events": { "submit.prevent": { "call": "saveUser" } },
              "children": [
                {
                  "com": "div",
                  "children": [
                    { "com": "label", "children": "姓名" },
                    { "com": "input", "model": "form.name" }
                  ]
                },
                {
                  "com": "div",
                  "children": [
                    { "com": "label", "children": "邮箱" },
                    { "com": "input", "model": "form.email", "props": { "type": "email" } }
                  ]
                },
                {
                  "com": "div",
                  "children": [
                    { "com": "button", "props": { "type": "submit" }, "children": "保存" },
                    {
                      "com": "button",
                      "props": { "type": "button" },
                      "events": { "click": { "call": "closeModal" } },
                      "children": "取消"
                    }
                  ]
                }
              ]
            }
          ]
        }
      ]
    }
  ]
}

实时聊天

json
{
  "data": {
    "messages": [],
    "newMessage": "",
    "connected": false,
    "username": "用户" + Math.floor(Math.random() * 1000)
  },
  "methods": {
    "sendMessage": {
      "if": "newMessage.trim() && connected",
      "then": [
        {
          "ws": "chat",
          "op": "send",
          "data": { "type": "message", "username": "{{ username }}", "content": "{{ newMessage }}" }
        },
        { "set": "newMessage", "value": "" }
      ]
    }
  },
  "onMounted": {
    "ws": "wss://example.com/chat",
    "op": "connect",
    "id": "chat",
    "onOpen": { "set": "connected", "value": true },
    "onMessage": {
      "set": "messages",
      "value": "{{ [...messages, $response].slice(-100) }}"
    },
    "onClose": { "set": "connected", "value": false }
  },
  "onUnmounted": { "ws": "chat", "op": "close" },
  "com": "div",
  "props": { "class": "chat-app" },
  "children": [
    {
      "com": "div",
      "props": { "class": "status" },
      "children": "{{ connected ? '已连接' : '未连接' }}"
    },
    {
      "com": "div",
      "props": { "class": "messages" },
      "children": [
        {
          "for": "msg in messages",
          "com": "div",
          "props": { "class": "message" },
          "children": "[{{ msg.username }}]: {{ msg.content }}"
        }
      ]
    },
    {
      "com": "div",
      "props": { "class": "input-area" },
      "children": [
        {
          "com": "input",
          "model": "newMessage",
          "props": { "placeholder": "输入消息...", "disabled": "{{ !connected }}" },
          "events": { "keyup.enter": { "call": "sendMessage" } }
        },
        {
          "com": "button",
          "props": { "disabled": "{{ !connected }}" },
          "events": { "click": { "call": "sendMessage" } },
          "children": "发送"
        }
      ]
    }
  ]
}

Released under the MIT License.