菜单

属性与绑定

相关源文件

本文档说明了 Svelte 在编译器和运行时如何处理元素属性和数据绑定。它涵盖了 Svelte 在编译过程中如何处理属性,在运行时如何将它们设置在 DOM 元素上,以及如何处理组件状态和 DOM 之间的双向数据绑定。有关事件和事件处理的信息,请参阅 Events and Event Handling

概述

在 Svelte 中,属性和绑定提供了 DOM 操作和数据同步的主要机制。

  • 属性允许设置元素属性、HTML 属性、类名和样式。
  • 绑定支持组件状态和 DOM 元素之间的双向数据流。

属性和绑定流程

来源

属性处理

Svelte 中的属性包括标准的 HTML 属性、DOM 属性、类名、样式以及特殊的 Svelte 指令。

属性类型

Svelte 处理多种类型的属性

类型示例实现目的
标准 HTML 属性<div id="main">set_attribute设置为 DOM 属性
DOM 属性<input value="text">直接属性访问设置为 JavaScript 属性
<div class="foo">set_class优化的类名处理
风格<div style="color: red">set_style优化的样式处理
展开属性<div {...props}>set_attributes应用多个属性
布尔属性<button disabled>特殊处理正确的布尔属性处理
自定义元素数据<custom-element prop={value}>set_custom_element_data用于 Web Components

来源

属性设置过程

来源

在运行时设置属性

设置单个属性的主要函数是 set_attribute

来源

对于展开属性和多个属性,Svelte 使用 set_attributes,它能一次高效地处理多个属性。

来源

绑定系统

绑定支持组件状态和 DOM 元素之间的双向数据流,允许用户输入自动更新组件状态。

绑定类型

Svelte 为不同元素支持多种绑定类型。

类别示例实现函数
输入元素bind:valuebind:checkedbind_valuebind_checked
分组任务bind:groupbind_group
内容bind:innerHTMLbind:textContentbind_content_editable
媒体bind:currentTimebind:volumebind_current_timebind_volume
尺寸bind:clientWidthbind:offsetHeight窗口大小观察者绑定
组件引用bind:thisbind_this
特殊元素bind:scrollYbind:online窗口/文档绑定

来源

绑定数据流

来源

绑定实现

让我们以输入元素的 bind:value 为例,看看典型的绑定实现。

来源

编译过程

在编译 Svelte 组件时,属性和绑定会被转换为高效的 JavaScript,以便在运行时执行。

属性编译过程

对于静态属性,Svelte 会直接将它们包含在模板字符串中。

对于动态属性,Svelte 会生成 JavaScript 代码来更新它们。

来源

绑定编译过程

Svelte 会分析绑定表达式并生成相应的绑定代码。

来源

特殊属性情况

Svelte 对需要独特行为的某些属性情况进行了特殊处理。

类名和样式处理

类名和样式有专门的处理函数。

来源

特殊元素值

某些元素对 value 属性有特殊处理。

元素特殊行为
<option>同时设置 value__value 属性。
<select>需要 select_option 函数来正确更新选中的选项。
<input>根据输入类型(数字、复选框等)有不同的处理方式。
<textarea>需要处理子内容与 value 属性之间的关系。

来源

通用绑定

Svelte 支持多种元素类型的绑定。

输入元素绑定

来源

媒体元素绑定

来源

窗口和文档绑定

来源

性能优化

Svelte 包含一系列用于高效处理属性和绑定的优化措施

  1. 静态属性内联:将静态属性直接包含在 HTML 模板字符串中
  2. 更改跟踪:仅在值实际更改时才更新属性
  3. 智能的属性与特性选择:在适当的时候使用 DOM 特性以获得更好的性能
  4. 批量更新:将相关的更新组合在一起以提高效率
  5. 专用处理:针对 `class` 和 `style` 等常见属性的自定义代码路径

来源

水合处理

在水合过程中(当客户端 JavaScript 接管服务器渲染的 HTML 时),会特别注意避免不必要的 DOM 操作

来源

结论

Svelte 的属性和绑定系统提供了一种强大而高效的方式来管理 DOM 更新和数据同步。编译器会分析组件模板,并将属性和绑定转换为优化的 JavaScript,从而最大限度地减少 DOM 操作,同时保持响应性。

运行时函数协同工作,确保组件状态与 DOM 保持同步,从而轻松地用最少的样板代码构建交互式用户界面。