重复使用组件时如何合理构建Vuex可视化数据项目架构?
Vue项目架构合理性与DRY原则分析
一、当前架构逻辑的合理性
你的基础思路可行,但存在优化空间:
- 目前把过滤后的数组存在state里会产生冗余数据——
filteredItems是initialItems的衍生数据,没必要单独存在state中,state应该存储原始数据源,衍生数据更适合用getter实时计算。 - 你的getter写法有误,正确的getter是基于state计算返回值,而非直接修改state,示例如下:
// 正确的getter写法 getters: { initialItems: state => state.initialItems, filteredItems: (state) => { // 直接基于原始数组计算过滤结果,而非修改state return state.initialItems.filter(item => /* 过滤逻辑 */) } }
- 用mutation生成过滤数组的方式没必要,过滤属于纯计算逻辑,不需要修改state,直接在getter中处理更高效。
二、是否违反DRY原则?
单独创建第二个组件不一定违反DRY,核心看组件内容差异:
- 如果两个组件的模板、交互逻辑几乎一致,只是数据源不同,那确实违反DRY——完全可以复用同一个组件,通过props传入不同的数据源即可。
- 如果两个组件的UI展示、交互逻辑差异很大,那单独创建组件是合理的,不算违反DRY。
三、优化建议
- 简化store结构:只在state中存储
initialItems,过滤后的数组通过getter实时计算,无需单独存到state。 - 复用组件(若UI一致):创建通用列表组件,通过props接收数据源:
<!-- 通用列表组件 ListItem.vue --> <template> <div v-for="item in items" :key="item.id"> <!-- 统一的item展示内容 --> {{ item.name }} ... </div> </template> <script> export default { props: { items: { type: Array, required: true } } } </script>
在父组件中复用:
<!-- 父组件 --> <template> <div> <!-- 原始列表 --> <ListItem :items="initialItems" /> <!-- 过滤后的列表 --> <ListItem :items="filteredItems" /> </div> </template> <script> import ListItem from './ListItem.vue' export default { components: { ListItem }, computed: { initialItems() { return this.$store.getters.initialItems }, filteredItems() { return this.$store.getters.filteredItems } } } </script>
- 动态过滤逻辑:如果过滤条件需要动态变化,可把条件存到state中,getter根据条件实时计算:
// store.js state: { initialItems: [], filterCondition: '' // 比如搜索关键词 }, mutations: { UPDATE_FILTER_CONDITION(state, condition) { state.filterCondition = condition } }, getters: { filteredItems: (state) => { return state.initialItems.filter(item => item.name.includes(state.filterCondition)) } }
内容的提问来源于stack exchange,提问作者user21728832
相关产品推荐
相关产品推荐

