首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Vuex状态下使用Javascript类对象可以吗?

在Vuex状态下使用Javascript类对象可以吗?
EN

Stack Overflow用户
提问于 2018-11-25 17:28:31
回答 1查看 4.6K关注 0票数 12

假设我有一个简单的Vuex状态来保存食谱:

代码语言:javascript
复制
const state = {
    recipe: {
        id: '',
        name: "",
        ingredients : [],
    }
};

相反,创建一个包含相同数据的食谱类,然后在状态中将其声明为类的一个实例,这是一个很好的实践吗?

代码语言:javascript
复制
const state = {
    recipe: new Recipe()
};

如果菜谱类有方法,是应该通过vuex存储上的getter/突变来代理这些方法,还是可以直接调用这些方法?

EN

回答 1

Stack Overflow用户

发布于 2021-03-04 06:48:48

虽然我不能给出一个权威的答案,但我会说是的,你应该在这个州使用类。我认为这种良好做法符合分离关注设计原则。但是,在这些类上不应该有直接调用的方法。

tl;dr;

  • 使用类作为DTO或模型
  • 保持状态干净的方法,但您可以添加一些“本地计算的状态”,如果需要。
  • 在突变中尽可能多地变异数据,如果需要的话,甚至从上面突变一些“本地计算的状态”。
  • 如果需要,使用特定的getter选择特定的数据,可能为相同的基础数据有许多getter。
  • 如果需要,在状态、getter和突变之外实现单独的代码,而不是直接在这些方法中实现。

示例

在我的应用程序中,使用vuex打字脚本,我编写了一个“API模型”,它代表了API响应和请求的各个部分,还有一些是unitTree.ts助手类代码,负责处理状态的enterpriseUnitsTree部分,这是caseFullData的一个本地子集。

下面是我如何在state.ts (简化)中这样做的:

代码语言:javascript
复制
import { ICaseFullDataViewModel, CaseFullDataViewModel, CaseApprovalDto, ICaseApprovalDto } from '@/api-model';
import { IEnterpriseUnitDataObjectTree } from '../code/unitTree';

export interface IEntryState {
    caseValidationMessages: string[];
    caseFullData: ICaseFullDataViewModel;
    enterpriseUnitsTree: Array<IEnterpriseUnitDataObjectTree>;
    caseApproval: ICaseApprovalDto;
}

export const state: IEntryState = {
    caseValidationMessages: null,
    caseFullData: new CaseFullDataViewModel(),
    enterpriseUnitsTree: null,
    caseApproval: new CaseApprovalDto()
};

至于获取数据,我建议为您所需的每个方面设置一组完整的getter。它使状态保持干净,因为它实际上只是一个状态,而不是业务/用例本身。有关上述数据的部分内容,请参见下面的一些getter。例如,我正在使用unitTree.ts中的外部代码从商店中提取特定的enterpriseUnitsTree项。

下面是我在getters.ts (简化)中的代码:

代码语言:javascript
复制
import { IRootState } from '@/store';
import { GetterTree } from 'vuex';
import { unitTree } from '../code/unitTree';
import { IEntryState } from './state';

export const CASE_ID = 'caseId';
export const CASE_FULL_DATA = 'caseFullData';
export const UNITS_SORTED_AS_TREE = 'unitsSortedAsTree';
export const FIRST_UNIT = 'firstUnit';


export const getters: GetterTree<IEntryState, IRootState> = {
    [CASE_ID]: state => state.caseFullData?.caseId,  
    [CASE_FULL_DATA]: state => state.caseFullData,
    [UNITS_SORTED_AS_TREE]: state => {
        return state.enterpriseUnitsTree;
    },
    [FIRST_UNIT]: state => () => {        
        const indexMap = unitTree.getIndexMap(state.enterpriseUnitsTree);
        const firstUnitIdentifier = indexMap.get(0);        
        return firstUnitIdentifier;
    }
    //.... 
};

mutations.ts中,当接收到相应数据的提交时,我会根据需要对enterpriseUnitsTree进行变异:

下面是我在mutations.ts (简化)中的代码:

代码语言:javascript
复制
import { MutationTree } from 'vuex';
import {
    ICaseFullDataViewModel    
} from '@/api-viewmodel';
import { IEntryState } from './state';
import { unitTree } from '../code/unitTree';

export const MAPCASEFULLDATA = 'mapCaseFullData';
//....

export const mutations: MutationTree<IEntryState> = {
    [MAPCASEFULLDATA](state, value: ICaseFullDataViewModel) {
        state.caseFullData = value;
        //... some sorting and tree building using code from unitTree
        state.enterpriseUnitsTree = sortedEnterpriseUnits;
    },
    //.......
};
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53470027

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档