课程章节介绍
好,我们来看这个例子,它非常清楚地展示了浅层反应性和深层反应性到底差在哪里。
在标准的、默认的浅层跟踪机制下,框架只检查属性本身有没有被替换掉。如果只是修改了对象里面的某个字段,它是“看不见”的。
你看,这里第一行,把 `bool` 改成 `true` —— 这是一个全新的原始值,所以被检测到了。
第二行,把 `number` 又赋值为 `42`,因为跟之前的值完全相等,比较下来没变化,所以没有触发任何更新。
第三行,改为 `43`,值不同了,立刻被检测到。
最关键的是对象的情况。
当我们写 `this.obj.name = 'Bob'` 的时候,实际上只改了对象里面的一个嵌套属性,`obj` 这个引用本身还是原来的那个对象,因此浅层检查认为“没变”,没有反应。
可是,一旦我们给它换成一个全新的对象,比如 `this.obj = { Name: 'John' }`,哪怕内容看起来一样,因为引用变了,框架立即就能发现。
后面这个 `this.obj = { ...this.obj, title: "CEO" }` 也是同样的道理,展开运算符会创建一个全新的对象,所以同样会触发反应。
那如果我们确实希望只改嵌套字段、又不想反复创建新对象的时候,该怎么办呢?
这就需要用到 `@track` 装饰器了。给属性加上 `@track`,就可以启用深层跟踪,让框架能够注意到对象内部的变化,而不用你每次手动复制出一个新对象。
这样是不是一下就清晰多了?浅层默认看“外壳”变没变,而 `@track` 能让它“看进里面去”。
关键词
LWC
Lightning Web Components
Salesforce