返回

Ionic Vuex 状态管理:应对表格覆盖和检查 ID 显示的解决方案

vue.js

Ionic 中 Vuex 存储管理下覆盖表格的解决方案

在 Ionic 应用中使用 Vuex 进行状态管理时,您可能会遇到表格数据被覆盖的问题,以及在详情视图中仅显示第一项检查项的材料和状态。本文将详细探讨这些问题,并提供逐步解决方案。

问题 1:表格数据覆盖

此问题源于在返回详情视图时错误地使用 Vuex store.commit() 函数。为了正确存储所选项目的 inspectionId,我们需要更新代码:

this.$store.commit('updateSelectedInspection', selectedInspection);

问题 2:仅显示检查 ID

该问题是由直接使用 getters 获取详情引起的。我们需要创建计算属性来获取当前所选检查项的材料和状态:

// 组件中的计算属性
computed: {
  selectedInspectionDetails() {
    const selectedInspection = this.$store.getters['selectedInspection'];
    return {
      material: selectedInspection.material,
      status: selectedInspection.status,
    };
  },
},

解决方案

完整代码

为了解决这两个问题,请使用以下完整代码:

// Vuex 存储
export function inspectionReducer(state = initialState, action) {
  switch (action.type) {
    case 'UPDATE_SELECTED_INSPECTION':
      return state.map(inspection => {
        if (inspection.inspectionId === action.payload.inspectionId) {
          return action.payload;
        }
        return inspection;
      });
    default:
      return state;
  }
}

// HomePage
selectInspection(inspection: Inspection) {
  this.store.dispatch({ type: 'UPDATE_SELECTED_INSPECTION', payload: inspection });
  this.router.navigateByUrl(`/detail/${inspection.inspectionId}`);
}

// DetailPage
ngOnInit() {
  this.store.select('inspections').subscribe(inspections => {
    this.selectedInspection = inspections.find(inspection => inspection.inspectionId === +this.router.url.split('/').pop());
  });
}

// HTML
// home.page.html
<ion-item *ngFor="let inspection of inspections" (click)="selectInspection(inspection)">
  <ion-label>
    <h2>{{ inspection.inspectionId }}</h2>
    <p>{{ inspection.material }}</p>
    <p>{{ inspection.status }}</p>
  </ion-label>
</ion-item>

// detail.page.html
<ion-item>
  <ion-label>
    <h2>{{ selectedInspection?.inspectionId }}</h2>
    <p>{{ selectedInspection?.material }}</p>
    <p>{{ selectedInspection?.status }}</p>
  </ion-label>
</ion-item>

结论

通过实施这些修改,表格数据将不再被覆盖,详情视图将正确显示所有选定检查项的详细信息。

常见问题解答

1. 为什么使用 Vuex 进行状态管理?
Vuex 提供了集中式存储和管理应用程序状态的功能,从而简化了数据管理并提高了应用程序的可维护性。

2. 为什么 store.commit() 函数而不是 store.dispatch() 函数?
store.commit() 直接修改存储,而 store.dispatch() 派发一个操作,该操作可能执行异步操作并最终调用 store.commit()

3. 如何自定义检查项列表的外观?
您可以使用 CSS 或 Ionic 组件自定义 ion-listion-item 的样式。

4. 如何向存储添加更多状态?
可以向存储添加额外的属性和操作,以管理其他应用程序数据,例如用户设置或错误消息。

5. 为什么使用计算属性?
计算属性提供了一个反应式的方式来访问派生数据,从而简化了代码并提高了性能。