javascript - 在 Vuex Store 中构建状态

标签 javascript flux vuex

我最近开始学习 Vuex,我想了解如何正确构建类似 Vuex/Flux 的商店的状态

让我们看一下下面的例子

ProductStore

state: {
  name: 'some name',
  price: 'some price',
  variants: [],
  selectedVariant: {},
}

mutations: {
  [ADD_VARIANT] (state, newVariant) {
    state.variants.push(newVariant)
  }

  [DELETE_VARIANT] (state, deletedId) {
    state.variants = _.filter(state.variants, c => c.id == deleteID )
  }

  [EDIT_VARIANT] (state, editedComment) {
    //...
  }

  [EDIT_SELECTED_VARIANT_TYPE] (state, variantType) {
    state.selectedVariant.type = variantType
  }
}

当您有某种父组件(Product)并且还必须管理子组件状态(Variant)时,如何在上面的实例中构造状态>).

在我的特定实例中,我有一个 ProductPage。其中,我有一个 VariantTable。在 VariantTable 中选择一个项目会弹出一个 VariantModal,它允许您编辑应传播到父表的变体属性。

最佳答案

使您商店的状态正常化。如果 Product-Variant 关系是纯 1-n,则商店的状态可以是:

state: {
  name: 'some name',
  price: 'some price',
  variants: [
    { variantId: 'V1', ProductId: 'P1' },
    ...
  ],
  selectedVariant: {},
  products: [
    { productId: 'P1' },
    ...
  ]
}

然后用Vuex's action您可以添加一个操作来同时处理变体和产品的更新:

..., // state goes above
mutations: {
  ...
  [EDIT_PRODUCT] (args) => { ... }
},
actions: {
  [EDIT_PRODUCT_VARIANT] ({ commit, state }, editedComment) {
    // take extra data if need via state
    commit([EDIT_VARIANT], editedComment);
    commit([EDIT_PRODUCT], { productId: editedComment.ProductId })
  }
}

重点是尽可能避免数据重复和嵌套数据,同时允许数据快速高效地更新。

了解有关数据标准化的更多信息,请访问 normalizr

关于javascript - 在 Vuex Store 中构建状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47467409/

相关文章:

javascript - jquery ui 选项卡的主要样式更改

javascript - 使用 Javascript SDK 的 Facebook 请求对话框出错,第一次点击时不工作

javascript - 通用 React List 组件是否应该从父级接收 props 或 listeners?

javascript - 在 redux reducer 中更新状态的正确方法

vue.js - 如何在 vuex 中查看动态变量的属性?

javascript - 无法分配给的只读属性 '_id'

javascript - PouchDB 太多递归 - 远程连接上的 Stackoverflow

javascript - 在 ReactJS 中调用渲染内部的操作 - 无法在调度中间调度

vue.js - Nuxt/Vuex/Vue react 性问题增量

vue.js - 何时初始化 vue 和 vuex 状态