课程章节介绍
同学们,我们接着来看这个 slide 里讲的一个非常重要的安全机制:传递给组件的非原始值,像是对象和数组,它们的只读性质到底是怎么被 LWC 框架强制执行的。
想象一下,父组件把一个对象——比如一个用户信息对象——传给子组件,子组件非常自然就想直接修改里面的某个属性,比如把用户名改掉。但在 LWC 里,如果你不加处理直接这么干,框架会直接给你报一个错误。这是为什么呢?
答案就藏在一个叫 ,JavaScript 代理, 的东西里。当我们把对象或数组从父组件传到子组件的时候,LWC 框架并不会直接把原始数据交过去,而是悄悄地在外面包了一层 ,Proxy,。这层代理就像一个严格的保安,它会拦截所有试图在嵌套属性上进行的赋值操作。一旦你尝试去修改对象的某个属性,比如直接写 `this.user.name = '新名字'`,这个保安就会立刻跳出来,抛出一个错误,阻止修改。
那么,如果你确实需要更新这个数据,该怎么办呢?唯一的办法就是:对整个属性重新赋一个新值。这里的关键是“整个属性”,而不是去动它里面的某个字段。
你可以怎么做呢?要么你从头创建一个全新的对象,比如 `this.user = { name: '新名字', age: 30 }`;要么用我们熟悉的展开运算符,也就是 spread 操作符,做一个浅拷贝,像这样:`this.user = { ...this.user, name: '新名字' }`。这里要特别提醒一下,这种浅拷贝只复制顶层属性,如果对象里面还嵌套着别的对象,那么这些嵌套对象依然是原来的引用,它们并没有被复制。
拥有数据的组件,也就是最初创建这个对象或数组的那个组件,才有权利自由地重新给这个属性赋值。子组件只是接收方,并不拥有数据,所以不能偷偷去改内部细节。这个限制听起来有点麻烦,但它其实是 LWC 安全架构里非常关键的一环。有了这一层基于代理的保护,整个组件树的数据完整性就被牢牢锁住了,不会因为某个小组件的无心之失,把其他组件依赖的数据悄悄改坏,让整个应用变得难以排查。
所以,大家只要记住:,传入的对象是只读的,想更新就整个换掉,浅拷贝只复制第一层,。这样写出来的组件才安全、可预测,也更符合 LWC 最佳实践。好,这个 slide 的内容我们就先讲到这里。
关键词
LWC
Lightning Web Components
Salesforce