You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

重复使用组件时如何合理构建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。

三、优化建议

  1. 简化store结构:只在state中存储initialItems,过滤后的数组通过getter实时计算,无需单独存到state。
  2. 复用组件(若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>
  1. 动态过滤逻辑:如果过滤条件需要动态变化,可把条件存到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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 14:12:15