Fields, Properties, and Attributes — Overview

DEX475 - Fields, Properties, and Attributes

📄 第 97 页 🎬 视频课程

课程章节介绍

同学们好,今天我们来聊聊 LWC 里几个特别基础,但又很容易混淆的概念——字段、属性,还有它们背后的反应性系统。咱们慢慢来,把它讲透。 首先,假设你正在写一个 Lightning Web 组件,需要在画面上动态显示一些文字,比如一段欢迎语。这时候你会在组件的 JavaScript 类里面声明一个变量,我们管它叫“字段”,比如 `message = 'Hello'`。然后在模板里用花括号 `{message}` 引用它,页面就会显示“Hello”。当你用代码修改 `this.message = 'Hi'` 时,神奇的事情发生了——画面自动更新成“Hi”。这就是 LWC 的反应性系统在工作,它会追踪字段的值,一旦变化就去更新界面。 那么,“字段”和“属性”又是什么关系呢?从写组件的人(组件作者)的角度看,你在类里声明的变量就叫字段。但这个类的实例一旦生成,实例上的这些变量就变成了属性。对于使用你组件的人(消费者)来说,他们只看得见那些被你用 `@api` 装饰过的字段,这些字段摇身一变成了公开的“属性”,允许父组件传值或者外部读取。可以这么说:内部声明叫字段,对外暴露叫属性。只有加了 `@api` 的字段,才会作为对象的属性提供给消费者使用,组件内部没加 `@api` 的字段是私有的,外面碰不到。 记住,反应性系统不光看公开属性,内部字段的值变了,它也会重新渲染模板,让组件始终保持最新的样子。 接下来还要澄清一对容易犯晕的概念——HTML 里的“属性”和 JavaScript 里的“属性”。你可能会两处都听到“属性”这两个字,但其实在英文里它们分别是 attribute 和 property。举个简单的例子,一个 `
`,这里面的 `class` 就是 HTML attribute;而用 JavaScript 拿到这个 div 后,你通过 `div.className` 去访问,这就是在操作 property。在 LWC 中,组件会自动把很多标准的 JavaScript property 映射(或者说“反映”)成 HTML attribute,比如你设置了 `this.tabIndex = 0`,渲染出来的标签上就会出现 `tabindex="0"`,这对无障碍访问特别重要。而且,对于你用 `@api` 公开的 JavaScript 属性,还可以通过一些配置来控制它到底要不要表现为 HTML 里的 attribute,比如有些纯逻辑属性不需要出现在生成的 HTML 上,就可以关闭这个映射。 总之,这节课我们了解了三个点:第一,在类里声明字段,模板用花括号绑定,反应性系统自动更新;第二,用 `@api` 装饰才能让字段变成公开属性给外界用;第三,JavaScript property 和 HTML attribute 虽然有区别但往往互相反映,为了让屏幕阅读器等辅助技术好的,我们可以控制这个行为。 好了,今天就到这儿,下节课我们会接着深入,看看 LWC 怎么优雅地处理事件和数据流。

关键词

LWC Lightning Web Components Salesforce