首先,这是我目前的结构
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显式放在父组件中。一切都很完美。
当我使用组件结构时,所有输入和选择的变异都没有发生。它只有初始状态值。
那我在这里做错了什么?为什么事情在没有组件结构但没有组件结构的情况下工作?
答案 0 :(得分:1)
您有几个语法错误:
selecItems
道具,它应该是selectItems
。 date
函数,应该是data
但根本问题是您没有修改父组件上的计算属性。您只需将它们传递给子组件即可。如果您希望变量在父范围内更改以响应子组件中的某些事件,则您需要从子组件中为该事件发出事件并在父组件中侦听该事件。 / p>
通常,您可以使用子组件标记上的v-model
directive来执行此操作。这样,当从子节点发出input
事件时,父节点上的属性将自动更新(无需显式侦听父节点中的@input
事件)。
但是,由于您显然正在尝试将两个单独的值绑定到子组件(selectedItem
和compVal
),因此当子项上的相关数据属性发生更改时,您应该发出两个单独的事件: / p>
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);
}
}
然后,在父级上侦听这些事件并更新相应的属性:
<component
:selecItems="selectItems"
:selectedItem="selectOneItem"
:compVal="compOneVal"
@selectedItemInput="selectOneItem = $event"
@compValInput="compOneVal = $event"
></component>
现在,只要子组件的selectedItemModel
或compValModel
数据属性发生更改,父级的相应属性就会更新,触发各自的计算属性set
方法,从而更新商店。
答案 1 :(得分:0)
除了@thanksd提到的拼写错误(selecItems
而不是selectItems
)
我会向您提供一些可以提供帮助的文档推荐的提示
mapGetters
可能是更好的选择。除此之外,mapActions
。因此,您可以在组件中使用商店中的直接值,而无需始终使用this.$store