Vue.js 自定义组件中没有发生变异?
首先,这是我目前的结构Vue.js 自定义组件中没有发生变异?,vue.js,vuejs2,vue-component,vuex,Vue.js,Vuejs2,Vue Component,Vuex,首先,这是我目前的结构 子组件 // 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-fiel
子组件
// 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
}
}
// 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)
}
}
}
存储
\\ 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提到的键入(selectItems
而不是selectItems
)之外
我会给你一些提示,这些提示是文档推荐的,可以帮助你
mapGetters
可能是更好的选择。除此之外,mapActions
。因此,您可以使用组件中存储的直接值,而无需始终使用this.$store
您有几个语法错误:
- 在子组件的标记中传递一个
prop,它应该是selecItems
李>selectItems
- 您的子组件中有一个
函数,它应该是date
data
但根本问题是您没有修改父组件上的那些计算属性。您只是将它们传递给子组件。如果您希望在父级范围内更改变量以响应来自子组件的某个事件,则需要从子级发出该事件的事件,并在父级中侦听该事件 通常,您可以通过在子组件标记上使用。这样,当从子级发出
input
事件时,父级上的属性将自动更新(无需显式侦听父级中的@input
事件)
但是,由于您显然试图将两个单独的值绑定到子组件(selectedItem
和compVal
),因此当子组件上的任一相关数据属性更改时,您应该发出两个单独的事件:
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
方法,从而更新存储