课程章节介绍
好,我们来看一下这个关于有线服务数据生命周期的内容。我会一条一条地给你讲清楚,让你理解框架是怎么帮我们管理数据的,我们写组件的时候需要注意什么。
首先,这句话很重要:有线服务的数据生命周期是由框架来管理的,而不是由我们自己的组件来管理。也就是说,我们不用操心什么时候去请求数据、什么时候更新,这些框架都帮我们做好了,我们只需要声明这个组件需要哪些数据就行。这样一来,代码就简单多了,也减少了出错的可能。
接着看这里,有线适配器只有在所有动态参数,也就是那些以美元符号开头的参数,都已经定义了值的时候,才会真正去触发。比如,你的组件有一个 `@wire` 需要 `recordId`,但是这个 `recordId` 可能是从父组件传进来的。如果父组件还没传过来,它的值就是 undefined,那么有线服务就会一直等待,直到 `recordId` 有了具体的值,才会去取数据。这也是一种保护,防止我们用不完整的参数去请求数据,得到一个错误的结果。
然后,我们看一下它初始的状态。在组件构造完成、但是数据还没到的时候,`@wire` 提供给组件的数据对象长这样:`{ data: undefined, error: undefined }`。也就是说,我们可以直接根据 `data` 是不是 undefined 来判断数据到了没有,如果 `error` 不是 undefined,那肯定是出错了。我们可以在模板里或者方法里用这个来做条件渲染,比如显示一个加载的提示。
接下来这段话提醒我们,数据到达的时间是不确定的。如果数据已经在缓存里了,那几乎是瞬间就到了;如果缓存里没有,那就得等服务器来回的时间,可能需要一两秒。所以,我们不能假设数据一定会在某个特定的生命周期钩子到达,比如不能认为在 `connectedCallback` 里就一定能拿到数据,或者认为在 `renderedCallback` 里数据一定是最新的。永远不要写那种依赖数据到达时机的代码,那样会导致有时能运行有时不能的 bug。我们要做的是,响应式的处理数据的变化:当 `data` 改变时,框架会通知我们,我们再去更新界面。
另外,一个有线连接可以在生命周期内多次发出请求,而不需要我们去更改什么配置。比如,底层缓存失效了,或者我们做了一些引起数据变化的操作,LDS(Lightning Data Service)就会自动帮我们刷新数据,这和组件的生命周期钩子没有直接关系。我们不需要手动去重新连接,只要安心等着数据更新就行。
再强调一次,有线适配器的调用是异步的,除非有缓存的情况。因为有缓存的时候可能直接返回数据,所以响应返回的顺序可能不是按调用顺序来的。如果你连续发出两个请求,有可能后一个请求先返回,这种情况是可能发生的。我们不能假定响应的顺序就是调用的顺序,处理逻辑时要考虑到这一点。
有的时候,我们可能需要手动刷新数据,比如做了一个 mutation(像更新记录)之后。框架提供了两个方法来手动刷新:对于 Apex 方法的有线连接,使用 `refreshApex()`;对于 GraphQL 的有线连接,使用 `refreshGraphQL()`。调用它们应该在 mutation 完成后调用一次就好,千万不要把它放在定时轮询的循环里去不停刷新,那样会消耗大量的服务器资源,而且不是有线的设计初衷。想让数据自动定时间隔刷新,应该用别的方式,而不是不停调用 refresh。
最后一点,要注意,服务器端同步发生的更改,比如触发器或者流程自动更新了记录,并不会触发你有线服务重新获取数据。LDS 是基于缓存和通知机制的,像这种在服务器后台直接改的数据,没有通过 UI API 的变更通知,所以本地缓存不知道已经变了。如果你需要拿到这种及时的更新,可能需要考虑用别的方式,比如定时刷新(但要小心使用),或者用 Streaming API 来订阅变更。
好了,简单总结一下:有线服务让数据管理变得省心,但我们要理解它的异步特性、缓存机制和刷新规则。记住,不要依赖数据的到达时机,写响应式的代码,在 mutation 后调用一次 refresh,但别在轮循环里用。理解了这些,就能更好地驾驭 LWC 的数据绑定了。
这些就是今天这个 slide 的重点内容,有没有什么地方需要我再详细解释一下的?
关键词
LWC
Lightning Web Components
Salesforce