Skip to content

Advanced Examples

Real-time Chat

json
{
  "data": {
    "messages": [],
    "newMessage": "",
    "connected": false,
    "username": "User" + 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",
  "children": [
    { "com": "div", "children": "{{ connected ? 'Connected' : 'Disconnected' }}" },
    {
      "com": "div",
      "children": [
        {
          "for": "msg in messages",
          "com": "div",
          "children": "[{{ msg.username }}]: {{ msg.content }}"
        }
      ]
    },
    {
      "com": "div",
      "children": [
        {
          "com": "input",
          "model": "newMessage",
          "props": { "placeholder": "Type message...", "disabled": "{{ !connected }}" },
          "events": { "keyup.enter": { "call": "sendMessage" } }
        },
        {
          "com": "button",
          "props": { "disabled": "{{ !connected }}" },
          "events": { "click": { "call": "sendMessage" } },
          "children": "Send"
        }
      ]
    }
  ]
}

Paginated List

json
{
  "data": {
    "items": [],
    "loading": false,
    "pagination": { "page": 1, "size": 10, "total": 0 }
  },
  "computed": { "totalPages": "Math.ceil(pagination.total / pagination.size)" },
  "methods": {
    "loadData": [
      { "set": "loading", "value": true },
      {
        "fetch": "/api/items?page={{ pagination.page }}&size={{ pagination.size }}",
        "then": [
          { "set": "items", "value": "{{ $response.items }}" },
          { "set": "pagination.total", "value": "{{ $response.total }}" }
        ],
        "finally": { "set": "loading", "value": false }
      }
    ],
    "changePage": [
      { "set": "pagination.page", "value": "{{ $event }}" },
      { "call": "loadData" }
    ]
  },
  "onMounted": { "call": "loadData" },
  "com": "div",
  "children": "..."
}

Released under the MIT License.