Rerender with New Properties — The Fix

DEX475 - Fields, Properties, and Attributes

📄 第 107 页 🎬 视频课程

课程章节介绍

同学们,我们来说说在 Lightning Web Components 里一个非常经典的小陷阱,以及它干干净净的修复方法。 你也许已经发现,如果你用 `@track` 标记了一个对象,比如 `this.obj = { name: 'Alice' }`,然后你直接在模板里展示它的属性,一切都很正常。但假如你突然想加一个新的属性,比如 `this.obj.age = 30`,你会发现:咦,界面怎么纹丝不动?这是因为 LWC 的变更检测,对于对象的内部属性变更,只会跟踪那些在渲染时已经被读取过的已知属性。你凭空塞进去一个新属性,框架根本不知道这件事发生了,自然不会去重新渲染。 那怎么解决呢?方法特别简单,而且是一种最佳实践:,不要直接在原对象上添加新属性,而是用一个全新的对象来替换它。, 具体怎么做呢?用 JavaScript 的,扩展运算符,,也就是那三个点 `...`。比如你原本的 `this.obj` 里有 `name`,现在想加个 `age`,你可以这样写: ```javascript this.obj = { ...this.obj, age: 30 }; ``` 我来一句一句解释给你听。`...this.obj` 会把原对象里所有可枚举的自有属性,一个一个复制到新对象的花括号里。然后后面紧跟着 `age: 30`,这就好比在新对象上又添加或者覆盖了这个 `age` 属性。最终,你得到了一个内容上包含了老属性加上新属性的对象,但是它是一个,全新的对象引用,。 这里最关键的就是“新的引用”。因为 `this.obj` 现在指向了一块全新的内存地址,LWC 框架会立刻检测到这个字段级别的变化。然后,它会重新计算所有依赖于 `this.obj` 的表达式,包括那些 `getter` 函数,比如你可能会用到的 `Object.entries` 去遍历它。现在 `getter` 重新运行,自然就能看到新加的属性了。 这种写法妙在哪里呢?它给了你两全其美的效果。平时你修改对象已有的属性值,比如 `this.obj.name = 'Bob'`,框架能够精准追踪,性能很高;一旦你需要改变对象的“形状”——也就是添加或者删除属性——你就用扩展运算符创建一个新对象,强制触发一次全面的重新评估。这样既保证了日常操作的轻快流畅,又有了应对结构变化时的清晰可控,代码还特别简洁。 所以记住这个模式:在 LWC 中,要让对象结构变化能被追踪到,就用 `this.obj = { ...this.obj, 新属性: 值 }` 这种不可变更新的方式。这会让你的组件反应更可靠,调试起来也省心得多。好了,这就是今天这个小技巧的全部内容,你学会了吗?

关键词

LWC Lightning Web Components Salesforce