自定义组件中没有发生突变?

Mutation is not happening in custom component?

首先,这是我目前的结构

CHILD COMPONENT

// HTML
<v-select
 v-bind:items="selectItems"
 v-model="selectedItemModel"
 label="Category"
 item-value="text"
></v-select>
<v-text-field
 label="Enter Value"
 type="number"
 v-model="compValModel"
></v-text-field>

// JS
props: {
 selectItems: {
  type: Array,
  required: true
 },
 selectedItem: {
  type: String
 },
 compVal: {
  type: Number
 },
}
date () {
 return {
  selectedItemModel: this.selectedItem,
  compValModel: this.compVal
 }
}

PARENT COMPONENT

// HTML

<component :selecItems="selectItems" :selectedItem="selectOneItem" 
:compVal="compOneVal"></component>

<component :selecItems="selectItems" :selectedItem="selectTwoItem" 
:compVal="compTwoVal"></component>

// JS
data () {
 return {
  selectItems: [some array]
 }
},
computed: {
 selectedOneItem: {
  get () {
    return this.$store.state.selectedOneItem
  },
  set (value) {
    this.$store.commit('selectedOneItem', value)
  }
 },
 selectedTwoItem: {
  get () {
    return this.$store.state.selectedTwoItem
  },
  set (value) {
    this.$store.commit('selectedTwoItem', value)
  }
 },
 compValOne: {
  get () {
    return this.$store.state.compValOne
  },
  set (value) {
    this.$store.commit('compValOne', value)
  }
 },
 compValTwo: {
  get () {
    return this.$store.state.compValTwo
  },
  set (value) {
    this.$store.commit('compValTwo', value)
  }
 }
}

Store

\ STATE
compOneVal: 0,
compValTwo: 0,
selectedOneItem: null,
selectedTwoItem: null

\ GETTER
compOneVal: (state) => state.compOneVal
compTwoVal: (state) => state.compTwoVal
selectedOneItem: (state) => state.selectedOneItem
selectedTwoItem: (state) => state.selectedTwoItem

\ MUTATION
compOneVal (state, v) {
 state.compOneVal = v
},
compTwoVal (state, v) {
 state.compTwoVal = v
},
selectedOneItem (state, v) {
 state.selectedOneItem = v
},
selectedTwoItem (state, v) {
 state.selectedTwoItem = v
}

什么在起作用?

当我不使用组件结构时,通过将 html 显式放置在父组件中。一切正常。

什么不起作用?

当我使用组件结构时,所有输入和选择的变化都没有发生。它只有初始状态值。

那我做错了什么?为什么没有组件结构但没有组件结构却不行?

除了@thanksd

提到的错字(selecItems而不是selectItems

我会给你一些文档推荐的可以帮助你的提示

  1. 使用操作触发突变,而不是直接提交。
  2. 你的状态应该用你希望的类型初始化,例如:空数组、对象或字符串
  3. 如果您正在访问子组件的存储值,请直接执行(访问子组件中的存储)。除非确实需要,否则不要传递 props,例如:您可能想传递一个与商店中不同的值,或者在 parent
  4. 上使用相同的值
  5. 如果你有吸气剂,也许使用 mapGetters 可能是更好的选择。与此同时,mapActions。因此,您可以在组件中使用存储中的直接值,而无需一直使用 this.$store

您有几个语法错误:

  • 你在 child 组件的标签中传递了一个 selecItems 属性,它应该是 selectItems
  • 你的 child 组件中有一个 date 函数,它应该是 data

但根本问题是您没有修改 parent 组件上的那些计算属性。您只是将它们传递给 child 组件。如果您希望变量在 parent 的范围内更改以响应来自 child 组件的某些事件,您需要从 child 发出一个事件并监听parent.

中的那个事件

通常,您可以通过在 child 组件标签上使用 v-model directive 来实现。这样,当从 child 发出 input 事件时,parent 上的 属性 将自动更新(无需显式监听 @input 事件在 parent) 中。

但是,由于您 apparently 试图将两个单独的值绑定到 child 组件(selectedItemcompVal),您应该发出两个单独的值child 上的任一相关数据 属性 更改时的事件:

props: {
  selectItems: {
    type: Array,
    required: true
  },
  selectedItem: {
    type: String
  },
  compVal: {
    type: Number
  },
}
data() {
  return {
    selectedItemModel: this.selectedItem,
    compValModel: this.compVal
  }
},
watch: {
  selectedItemModel(value) {
    this.$emit('selectedItemInput', value);
  },
  compValModel(value) {
    this.$emit('compValInput', value);
  }
}

然后,监听 parent 上的那些事件并更新相应的属性:

<component 
  :selecItems="selectItems" 
  :selectedItem="selectOneItem" 
  :compVal="compOneVal"
  @selectedItemInput="selectOneItem = $event"
  @compValInput="compOneVal = $event"
></component>

所以现在,每当 child 组件的 selectedItemModelcompValModel 数据属性发生变化时,parent 各自的属性将更新,触发它们各自的计算属性 set 方法,从而更新商店。