-
Notifications
You must be signed in to change notification settings - Fork 2.9k
Description
Proposal by Apple - https://github.com/w3c/webcomponents/blob/gh-pages/proposals/Template-Instantiation.md
Proposal by Google - https://github.com/domenic/template-parts
This is a proposal on standardizing <template>
parser which would allow developers:
- put variables,
- use simple statements
- and attach event handlers when template Node generated/inserted into DOM
Current stage: Open Discussion about the HTML syntax and JS API
Why?
Templates finally standardized the way of making re-usable parts of HTML, templates for widgets/components, however, they are still weak and one of the most general use cases in templates is to put data into them which, currently, is not possible without using a 3rd party library (template engine) or a custom implementation.
This brings:
- too much diversity across the Web (everyone is doing the same but in a different way)
- code works slower because it is not a native code which is implemented by a browser.
- bundle size increases and in case of huge production apps with many 3rd party components it is often required to import also different template engines or frameworks.
What is needed to be discussed and standardized?
- How variables should be included inside a
<template>
. - How event handlers should be attached to elements inside a
<template>
. - Which statements (for example "if") are allowed and how they should be used inside a
<template>
1. Variables inside a <template>
I would +1 the most popular solution used across many template engines in many languages - variable name should be put inside a {{ }}. To make life even easier and faster it could be implemented as a simple string.replace. We may force developers to write a variable name without a spaces, i.e. {{ var }} will be invalid and {{var}} will work.
2. Attaching event handlers to a <template>
elements
I would propose here new handler="method"
attribute which would receive an Node when called.
Example HTML
<template id="card">
<card>
<h2>{{title}}</h2>
<div>{{description}}</div>
<a href="/card/{{id}}">Read more</a>
<button handler="onEdit">Edit</button>
</card>
</temlate>
Example JavaScript
In JS I would suggest just adding new function
Node parseTemplate(String id, Object data = {}, Object handlers = {})
because current syntax and manual clone/importNode is ridiculous. We already have functions parseInt, parseFloat, etc.
document.body.appendChild(parseTemplate('card', {
title: 'Card title',
description: 'Hello, World',
id: 42
}, {
onEdit(btn) {
btn.addEventListener('click', () => {
// ...
});
}
});
Currently I have no opinion on statements, may be, we could allow only simple inline statements like in ES6 template strings.