独立使用 lit-html
Lit 将 LitElement 的组件模型与基于 JavaScript 模板字面量的渲染结合成一个易于使用的包。然而,Lit 的模板部分被分解为一个名为 lit-html 的独立库,它可以在 Lit 组件模型之外的任何需要高效渲染和更新 HTML 的地方使用。
lit-html 独立包
Permalink to "lit-html 独立包"lit-html 包可以与 lit 分开安装:
npm install lit-html主要导入是 html 和 render:
import {html, render} from 'lit-html';独立的 lit-html 包还包括完整 Lit 开发者指南中描述的以下功能的模块:
lit-html/directives/*- 内置指令lit-html/directive.js- 自定义指令lit-html/async-directive.js- 自定义异步指令lit-html/directive-helpers.js- 用于命令式更新的指令辅助函数lit-html/static.js- 静态 html 标签lit-html/polyfill-support.js- 支持与 Web 组件 polyfills 的接口(参见 样式和 lit-html 模板)
渲染 lit-html 模板
Permalink to "渲染 lit-html 模板"Lit 模板使用带有 html 标签的 JavaScript 模板字面量编写。字面量的内容大多是普通的声明式 HTML,可能包含表达式来插入和更新模板的动态部分(完整的 Lit 模板语法参考见 模板)。
html`<h1>Hello ${name}</h1>`lit-html 模板表达式不会导致任何 DOM 被创建或更新。它只是 DOM 的一个描述,称为 TemplateResult。要实际创建或更新 DOM,你需要将 TemplateResult 传递给 render() 函数,以及要渲染到的容器:
import {html, render} from 'lit-html';
const name = 'world';const sayHi = html`<h1>Hello ${name}</h1>`;render(sayHi, document.body);渲染动态数据
Permalink to "渲染动态数据"要使你的模板动态化,你可以创建一个_模板函数_。每当你的数据发生变化时,调用模板函数。
import {html, render} from 'lit-html';
// 定义一个模板函数const myTemplate = (name) => html`<div>Hello ${name}</div>`;
// 用一些数据渲染模板render(myTemplate('earth'), document.body);
// ... 稍后 ...// 用不同的数据渲染模板render(myTemplate('mars'), document.body);当你调用模板函数时,lit-html 会捕获当前的表达式值。模板函数不会创建任何 DOM 节点,所以它快速且开销小。
模板函数返回一个包含模板和输入数据的 TemplateResult。这是使用 lit-html 背后的主要原则之一:将 UI 创建为状态的_函数_。
当你调用 render 时,lit-html 只更新自上次渲染以来已更改的模板部分。 这使得 lit-html 更新非常快速。
render 方法还接受一个 options 参数,允许你指定以下选项:
host:调用用@eventName语法注册的事件监听器时使用的this值。此选项仅适用于你将事件监听器指定为普通函数时。如果你使用事件监听器对象指定事件监听器,则监听器对象用作this值。有关事件监听器的更多信息,请参阅 事件监听器表达式。renderBefore:容器内的可选引用节点,lit-html 将在其之前进行渲染。默认情况下,lit-html 将附加到容器的末尾。设置renderBefore允许渲染到容器内的特定位置。creationScope:当克隆模板时,lit-html 将在其上调用importNode的对象(默认为document)。这是为高级用例提供的。
例如,如果你是独立使用 lit-html,你可能会这样使用渲染选项:
<div id="container"> <header>My Site</header> <footer>Copyright 2021</footer></div>const template = () => html`...`;const container = document.getElementById('container');const renderBefore = container.querySelector('footer');render(template(), container, {renderBefore});上面的例子会在 <header> 和 <footer> 元素之间渲染模板。
渲染选项必须是常量。 渲染选项不应在后续 render 调用之间改变。
样式和 lit-html 模板
Permalink to "样式和 lit-html 模板"lit-html 专注于一件事:渲染 HTML。如何将样式应用于 lit-html 创建的 HTML 取决于你如何使用它——例如,如果你在 LitElement 之类的组件系统中使用 lit-html,你可以遵循该组件系统使用的模式。
一般来说,如何给 HTML 添加样式将取决于你是否使用 shadow DOM:
- 如果你不是渲染到 shadow DOM,你可以使用全局样式表给 HTML 添加样式。
- 如果你是渲染到 shadow DOM,那么你可以在 shadow root 内渲染
<style>标签。
在传统浏览器上样式化 shadow roots 需要 polyfills。 在独立的 lit-html 中使用 ShadyCSS polyfill 需要加载 lit-html/polyfill-support.js 并在 RenderOptions 中传递带有用于作用域渲染内容的主机标签名的 scope 选项。虽然这种方法是可能的,但如果你想支持在传统浏览器上将 lit-html 模板渲染到 shadow DOM,我们建议使用 LitElement。
为了帮助动态样式,lit-html 提供了两个用于操作元素的 class 和 style 属性的指令: