vuex - 如何通过以原子设计模式发射从 vuetify select 中获得更改的值?
问题描述
我试图vuetify v-select
通过 using获得更改的值,$emit
但它不起作用。我通过应用原子设计模式(原子(子组件,不与存储连接),有机体(父组件))和 vuex 存储来划分组件。我认为 $emit data 没问题,但在此过程之后任何事情都不起作用。
这是用于管理页面的新应用程序,使用vue, vuex, vuetify,
原子设计连接到 API 服务器。
成分
子组件 - 在 atom 文件夹中
<template>
<v-select
:items="list"
:label="label"
v-model="selected"
item-value="id"
item-text="name"
return-object
@change="changeSelected"
></v-select>
</template>
<script>
export default {
props: ["list", "label", "defaultSelected"],
data() {
return {
selected: this.defaultSelected
};
},
methods: {
changeSelected(newValue) {
console.log(newValue); // display changed new data
this.$emit("changeSelected", newValue);
}
}
};
</script>
父组件 - 在生物文件夹中
<template>
<v-select-child
:select-label="label"
:select-list="list"
:default-selected="selected"
@change-selected="changeSelected" // problem issue?
>
</v-select-child>
</template>
<script>
import { mapState } from "vuex";
export default {
data() {
...
},
computed: {
...mapState({
list: state => state.list
})
},
methods: {
changeSelected() {
console.log("changeSelected"); // doesn't work
this.$store.dispatch("setSelected", { payload: this.selected });
}
}
};
</script>
vuex 商店
index.js
export default new Vuex.Store({
modules: {
xxx
},
state: {
list: [
{
name: "aaaaa",
id: "001"
},
{
name: "bbbbb",
id: "002"
}
]
},
getters: {},
mutations: {},
actions: {}
});
xxx.js
export default {
selected: { id: "001" }
},
getters: {
//
},
mutations: {
updateSelected(state, payload) {
console.log("payload"); // doesn't work
console.log(payload);
state.selected = payload;
console.log(state.selected);
}
},
actions: {
setSelected({ commit }, payload) {
console.log("Action"); // doesn't work
commit("updateSelected", payload);
}
}
};
它不会在changeSelected
函数后打印任何控制台日志。
解决方案
我在下面找到了一个解决方案:
子组件
<template>
<v-select
:label="label"
:items="list"
v-model="selected"
item-value="id"
item-text="name"
return-object
></v-select>
</template>
<script>
export default {
props: ["list", "label", "defaultSelected"],
computed: {
selected: {
get() {
return this.defaultSelected;
},
set(newVal) {
if (this.selected !== newVal) {
this.$emit("changeSelected", newVal);
}
}
}
}
};
</script>
父组件
<template>
<v-select-child
:label="label"
:list="list"
:defaultSelected="selected"
@changeSelected="changeSelected" // fix the property using camelCase
></v-select-child>
</template>
<script>
import { mapState } from "vuex";
export default {
data() {
...
},
computed: {
...mapState({
list: state => state.list
})
},
methods: {
changeSelected(val) { // val: changed object value
this.$store.dispatch("setSelected", { id:val.id });
}
}
};
</script>
推荐阅读
- r - 要使用 depmixs4 找到最适合的 HMM,我需要执行多少次 set.seed 和 fit.mod?
- python - Tkinter StringVar() 显示空白
- azure - 在 ASE ILB 中创建同名的 Azure Web 应用程序,不会警告资源已存在,也不会创建 2 个同名的 Web 应用程序
- curl - QueryDict 不会从 PATCH 请求中拆分 json 数据
- spring-boot - 在 SpringBoot 中使用 @ConfigurationProperties 设置超时
- angular - 将 LoginGuard 的输出设置为 false
- javascript - React- Lodash without() 方法在状态更改后呈现为空?
- android-studio - Android Studio 不接受 Android SDK 位置
- php - 如何在查询中添加 where between?
- python - 一起训练多个 tensorflow NN