Event Binding
This page covers wiring DOM events to handlers in the event option with @event.
Syntax
<div id="app">
<button @click="save">Save</button>
<input type="text" @input="typing" />
</div>
<script>
const app = new QUI({
id: "app",
data: { text: "" },
event: {
save: (e) => console.log("saved", app.data.text),
typing: (e) => {
app.data.text = e.target.value;
},
},
});
</script>
| Prefix | Example | Description |
|---|---|---|
@ |
@click |
Standard form |
qe- |
qe-click |
Equivalent form |
@click="save" becomes element.onclick = app.event.save, and the @click attribute is removed afterwards.
Rules
| Rule | Description |
|---|---|
| Event name | Must be a native event with a matching on* property on the element (click, input, change, submit, keyup and so on); custom events never fire |
| Handler arguments | Only the Event; with a function declaration, this is the element |
| One handler per event | Assigned as a property, so an element keeps only one handler per event |
| Name lookup | The value is first looked up as a data path and the result is used as the handler name; otherwise the value itself is the name |
| Unknown name | undefined is assigned; clicking does nothing and no error is raised |
:@click |
Not supported; the attribute is removed and nothing is bound |
Getting the Item Inside a Loop
Handlers do not receive the :for item, so put the identifier in a data-* attribute:
<li :for="user in users">
<button :data-id="user.id" @click="remove">Remove</button>
</li>
<script>
const app = new QUI({
id: "app",
data: { users: [{ id: 1 }, { id: 2 }] },
event: {
remove: (e) => {
const id = +e.target.dataset.id;
app.data.users = app.data.users.filter((u) => u.id !== id);
},
},
});
</script>
Using Handlers Outside QuickUI
app.event keeps the original function map, so handlers can be assigned to elements you create yourself:
const button = document.createElement("button");
button.onclick = app.event.save;
app.body.append(button);