# page.loadCompleted 事件逻辑说明文档

## 概述

`page.loadCompleted` 是一个页面加载完成事件,用于处理客户端或云渲染模式下的页面数据加载完成后的回调处理。该事件主要用于同步和存储页面加载数据,特别是世界对象(worldObjects)数据。

## 事件注册位置

**文件**: `src/store/modules/hybridStore/hybridStore.ts`

**方法**: `initHybridData()` (第114-297行)

**注册代码** (第127-146行):```typescriptpiclient.on('page.loadCompleted', '', (data:any) => {  // 如果是云渲染模式则执行  const hybridCloudStore = useHybridCloudStore()  if (hybridCloudStore.isCloud && data.params) {    hybridCloudStore.setPageLoadData(data)  } else if (hybridCloudStore.isCloud && data.params02){    hybridCloudStore.setWorldObjects(data)  }  if (data.params02) {    if (!this.piclient.worldObjects) {      this.piclient.worldObjects = data.params02.worldObjects    } else {      this.piclient.worldObjects = [        ...this.piclient.worldObjects,        ...data.params02.worldObjects,      ]    }  }  return})```

## 事件触发位置

### 1. 云渲染初始化完成时触发

**文件**: `src/store/modules/hybridStore/hybridStore.ts`

**方法**: `initCloudrender()` (第387-630行)

#### 预览模式触发 (第593行)```typescriptif (preview) {  useCustomEventHandler().initPageEvent()  this.initHybridData()  this.piclient.emit('mode.enterPlayMode')  this.piclient.emit('object.GetScreenInfo', {    target: 'SceneObject_8',  })    this.piclient.emit('page.loadCompleted', {})  // 触发事件  // ...}```

#### 编辑模式触发 (第619行)```typescriptelse {  this.initHybridData()  this.piclient.emit('page.loadCompleted', {})  // 触发事件}```

### 2. Mock 客户端模拟触发

**文件**: `src/views/editor/MockClient/index.vue`

**方法**: `eventHandler()` (第103-143行)

```typescriptif (param.action === 'page.loadCompleted') {  const mockBigWorldObjs = Array.from({ length: 100000 }).map(    (i, idx) => ({      name: 'SceneCamera_mock_' + idx,      displayName: genId() + '_mock_' + idx,      class: 'SceneCamera',    })  )

 cbParam.params = {    ...baseDb,    worldObjects: [...baseDb.worldObjects, ...mockBigWorldObjs],  }}```

## 事件处理流程

### 流程图

```page.loadCompleted 事件触发    ↓检查是否为云渲染模式 (hybridCloudStore.isCloud)    ↓┌─────────────────────────────────────┐│ 分支判断:                           ││                                     ││ 1. 云渲染模式 && data.params        ││    → setPageLoadData(data)          ││                                     ││ 2. 云渲染模式 && data.params02      ││    → setWorldObjects(data)          ││                                     ││ 3. 存在 data.params02               ││    → 更新 piclient.worldObjects     │└─────────────────────────────────────┘```

### 详细处理逻辑

#### 1. 云渲染模式 - 处理 params 数据

**条件**: `hybridCloudStore.isCloud && data.params`

**操作**: 调用 `hybridCloudStore.setPageLoadData(data)`

**实现位置**: `src/store/modules/hybridCloudStore/hybridCloudStore.ts` (第14-16行)

```typescriptsetPageLoadData(data: any) {  this.pageLoadData = data  this.setWorldObjects(data)}```

**作用**: - 存储完整的页面加载数据到 `pageLoadData`- 同时调用 `setWorldObjects` 处理世界对象数据

#### 2. 云渲染模式 - 处理 params02 数据

**条件**: `hybridCloudStore.isCloud && data.params02`

**操作**: 调用 `hybridCloudStore.setWorldObjects(data)`

**实现位置**: `src/store/modules/hybridCloudStore/hybridCloudStore.ts` (第18-46行)

```typescriptsetWorldObjects(data: any) {  if (data.params02) {    if (!this.pageLoadData.params.worldObjects) {      this.pageLoadData.params.worldObjects = data.params02.worldObjects    } else {      this.pageLoadData.params.worldObjects = [        ...this.pageLoadData.params.worldObjects,        ...data.params02.worldObjects,      ]    }  }}```

**作用**: - 合并世界对象数据到 `pageLoadData.params.worldObjects`- 如果已存在数据,则追加;否则直接赋值

#### 3. 更新 piclient.worldObjects

**条件**: `data.params02` 存在

**操作**: 更新 `this.piclient.worldObjects`

**逻辑**:```typescriptif (data.params02) {  if (!this.piclient.worldObjects) {    // 首次赋值    this.piclient.worldObjects = data.params02.worldObjects  } else {    // 追加数据    this.piclient.worldObjects = [      ...this.piclient.worldObjects,      ...data.params02.worldObjects,    ]  }}```

**作用**: - 在 `piclient` 实例上维护世界对象列表- 支持增量更新(追加模式)

## 数据结构

### 事件数据格式 (data)

```typescript{  params?: {    worldObjects?: Array<WorldObject>,    actions?: Array<any>,    classes?: Array<any>,    // ... 其他页面数据  },  params02?: {    worldObjects: Array<WorldObject>  }}```

### WorldObject 对象结构

```typescript{  name: string,           // 对象名称,如 'SceneCamera_0'  displayName: string,    // 显示名称  class: string          // 对象类型,如 'SceneCamera'}```

## 相关 Store 和状态

### 1. hybridStore (useHybridStore)

**状态**:- `piclient: PiClient | null` - PiClient 实例- `piclient.worldObjects` - 世界对象数组(动态添加的属性)

**方法**:- `initHybridData()` - 初始化交互数据,注册事件监听- `initCloudrender()` - 初始化云渲染,完成后触发事件

### 2. hybridCloudStore (useHybridCloudStore)

**状态**:- `isCloud: boolean` - 云渲染开关标识- `pageLoadData: any` - 页面加载数据  - `pageLoadData.params.worldObjects` - 世界对象数组

**方法**:- `setPageLoadData(data)` - 设置页面加载数据- `setWorldObjects(data)` - 设置/合并世界对象- `setIsCloud(bool)` - 设置云渲染状态

## 数据流向

```云渲染初始化完成    ↓触发 page.loadCompleted 事件    ↓┌──────────────────────────────────────┐│ 事件处理器 (hybridStore.ts:127)      │└──────────────────────────────────────┘    ↓┌──────────────────────────────────────┐│ 判断云渲染模式                        ││ - isCloud && params → setPageLoadData││ - isCloud && params02 → setWorldObjects│└──────────────────────────────────────┘    ↓┌──────────────────────────────────────┐│ 更新数据存储                          ││ - hybridCloudStore.pageLoadData       ││ - piclient.worldObjects               │└──────────────────────────────────────┘    ↓┌──────────────────────────────────────┐│ 数据使用场景                          ││ - 编辑器对象选择                      ││ - 事件配置                            ││ - 客户端交互                          │└──────────────────────────────────────┘```

## 使用场景

### 1. 编辑器中的对象选择

**文件**: `src/store/modules/hybridStore/hybridStore.ts` (第679-699行)

```typescriptsetSelectedObjs(objs: []) {  const worldObjs = this.getClientData(PiclientDataEnum.WORLD)  // worldObjs 来自 piclient.worldObjects 或 pageLoadData.params.worldObjects  // ...}```

### 2. 事件配置中的对象列表

**文件**: `src/views/editor/ContentConfigs/components/ConfigEvent/components/EventCustomHandle/EventEdit/useEventModal.ts` (第94-102行)

```typescriptconst worldObjs = computed(() => {  if (hybridStore.getInClient || hybridStore.getIsCloud) {    return hybridStore.getClientData(PiclientDataEnum.WORLD) || []  } else if (hybridCloudStore.isCloud) {    return hybridCloudStore.pageLoadData?.params.worldObjects || []  }  return hybridStore.getClientData(PiclientDataEnum.WORLD) || []})```

## 注意事项

1. **事件注册时机**: 事件在 `initHybridData()` 中注册,该方法通过 `hybridInited` 标志防止重复注册

2. **数据合并策略**:    - `worldObjects` 采用追加模式,新数据会合并到现有数组中   - 首次加载时直接赋值,后续加载时追加

3. **云渲染模式判断**:    - 通过 `hybridCloudStore.isCloud` 判断是否为云渲染模式   - 云渲染模式下数据存储在 `hybridCloudStore.pageLoadData`   - 非云渲染模式下数据存储在 `piclient` 实例上

4. **数据获取优先级**:    - 优先使用 `piclient` 上的数据   - 云渲染模式下使用 `hybridCloudStore.pageLoadData`

5. **事件触发时机**:    - 云渲染初始化完成后自动触发   - 预览模式和编辑模式都会触发

## 相关文件清单

- `src/store/modules/hybridStore/hybridStore.ts` - 事件注册和处理- `src/store/modules/hybridCloudStore/hybridCloudStore.ts` - 云渲染数据存储- `src/store/modules/hybridStore/hybridStore.d.ts` - 类型定义- `src/views/editor/MockClient/index.vue` - Mock 客户端模拟- `src/views/editor/ContentConfigs/components/ConfigEvent/components/EventCustomHandle/EventEdit/useEventModal.ts` - 事件配置中使用

## 总结

`page.loadCompleted` 事件是页面加载完成后的关键回调,主要负责:

1. **数据同步**: 将客户端/云渲染的页面数据同步到前端状态管理2. **对象管理**: 维护世界对象列表,支持增量更新3. **模式适配**: 区分客户端模式和云渲染模式,采用不同的数据存储策略4. **初始化完成**: 标记页面加载完成,触发后续的交互初始化

该事件是连接客户端/云渲染与前端应用的重要桥梁,确保数据能够正确同步和使用。