当前位置:首页 > VUE

vue实现主从表

2026-02-19 10:30:17VUE

Vue 实现主从表

主从表是一种常见的数据展示方式,通常用于展示一对多的关系。Vue 提供了灵活的方式来实现主从表,以下是几种常见的方法。

使用 v-for 嵌套循环

通过嵌套 v-for 可以轻松实现主从表的结构。主表数据通常是一个数组,每个主表项包含一个子表数据的数组。

<template>
  <div>
    <div v-for="(masterItem, index) in masterData" :key="index">
      <h3>{{ masterItem.name }}</h3>
      <ul>
        <li v-for="(detailItem, detailIndex) in masterItem.details" :key="detailIndex">
          {{ detailItem.name }}
        </li>
      </ul>
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      masterData: [
        {
          name: '主表项1',
          details: [
            { name: '子表项1-1' },
            { name: '子表项1-2' }
          ]
        },
        {
          name: '主表项2',
          details: [
            { name: '子表项2-1' },
            { name: '子表项2-2' }
          ]
        }
      ]
    };
  }
};
</script>

使用组件拆分

将主表和子表拆分为独立的组件,可以提高代码的可维护性和复用性。

<template>
  <div>
    <MasterTable :items="masterData" />
  </div>
</template>

<script>
import MasterTable from './MasterTable.vue';

export default {
  components: { MasterTable },
  data() {
    return {
      masterData: [
        {
          name: '主表项1',
          details: [
            { name: '子表项1-1' },
            { name: '子表项1-2' }
          ]
        },
        {
          name: '主表项2',
          details: [
            { name: '子表项2-1' },
            { name: '子表项2-2' }
          ]
        }
      ]
    };
  }
};
</script>

MasterTable.vue 中:

vue实现主从表

<template>
  <div>
    <div v-for="(item, index) in items" :key="index">
      <h3>{{ item.name }}</h3>
      <DetailTable :items="item.details" />
    </div>
  </div>
</template>

<script>
import DetailTable from './DetailTable.vue';

export default {
  props: ['items'],
  components: { DetailTable }
};
</script>

DetailTable.vue 中:

<template>
  <ul>
    <li v-for="(item, index) in items" :key="index">
      {{ item.name }}
    </li>
  </ul>
</template>

<script>
export default {
  props: ['items']
};
</script>

使用动态加载子表数据

如果子表数据量较大,可以通过异步加载的方式优化性能。

vue实现主从表

<template>
  <div>
    <div v-for="(masterItem, index) in masterData" :key="index">
      <h3 @click="loadDetails(masterItem.id)">{{ masterItem.name }}</h3>
      <ul v-if="masterItem.details">
        <li v-for="(detailItem, detailIndex) in masterItem.details" :key="detailIndex">
          {{ detailItem.name }}
        </li>
      </ul>
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      masterData: [
        { id: 1, name: '主表项1' },
        { id: 2, name: '主表项2' }
      ]
    };
  },
  methods: {
    async loadDetails(id) {
      const response = await fetch(`/api/details/${id}`);
      const details = await response.json();
      const item = this.masterData.find(item => item.id === id);
      this.$set(item, 'details', details);
    }
  }
};
</script>

使用表格样式

如果需要以表格形式展示主从表,可以结合 table 标签和 v-for 实现。

<template>
  <table>
    <thead>
      <tr>
        <th>主表名称</th>
        <th>子表项</th>
      </tr>
    </thead>
    <tbody>
      <tr v-for="(masterItem, index) in masterData" :key="index">
        <td>{{ masterItem.name }}</td>
        <td>
          <table>
            <tr v-for="(detailItem, detailIndex) in masterItem.details" :key="detailIndex">
              <td>{{ detailItem.name }}</td>
            </tr>
          </table>
        </td>
      </tr>
    </tbody>
  </table>
</template>

<script>
export default {
  data() {
    return {
      masterData: [
        {
          name: '主表项1',
          details: [
            { name: '子表项1-1' },
            { name: '子表项1-2' }
          ]
        },
        {
          name: '主表项2',
          details: [
            { name: '子表项2-1' },
            { name: '子表项2-2' }
          ]
        }
      ]
    };
  }
};
</script>

使用第三方库

如果需要更复杂的功能(如排序、分页等),可以使用第三方表格库,如 Element UIVuetify

Element UI 为例:

<template>
  <el-table :data="masterData" style="width: 100%">
    <el-table-column prop="name" label="主表名称"></el-table-column>
    <el-table-column label="子表项">
      <template #default="scope">
        <el-table :data="scope.row.details" style="width: 100%">
          <el-table-column prop="name" label="子表名称"></el-table-column>
        </el-table>
      </template>
    </el-table-column>
  </el-table>
</template>

<script>
export default {
  data() {
    return {
      masterData: [
        {
          name: '主表项1',
          details: [
            { name: '子表项1-1' },
            { name: '子表项1-2' }
          ]
        },
        {
          name: '主表项2',
          details: [
            { name: '子表项2-1' },
            { name: '子表项2-2' }
          ]
        }
      ]
    };
  }
};
</script>

以上方法可以根据实际需求选择适合的方式实现主从表功能。

标签: 主从vue
分享给朋友:

相关文章

vue实现菜单调用

vue实现菜单调用

Vue 实现动态菜单的常见方法 基于路由配置生成菜单 Vue Router 的路由配置可以天然转化为菜单结构,适合权限与路由绑定的系统: // router/index.js const rout…

vue实现多用户登录

vue实现多用户登录

实现多用户登录的基本思路 在Vue中实现多用户登录通常需要结合后端API完成身份验证,并通过前端路由、状态管理(如Vuex或Pinia)和本地存储(如localStorage)来管理用户会话。以下是关…

vue前端实现下载进度

vue前端实现下载进度

实现下载进度条的基本思路 在Vue中实现下载进度条,通常需要结合XMLHttpRequest或Fetch API来监听下载进度事件。通过计算已下载数据与总数据的比例,动态更新进度条的显示。 使用XM…

vue实现选择

vue实现选择

Vue 实现选择功能的方法 在 Vue 中实现选择功能可以通过多种方式完成,以下介绍几种常见的实现方法。 使用 v-model 绑定单选 通过 v-model 可以轻松实现单选功能。以下是一个简单的…

vue实现系统

vue实现系统

Vue 实现系统的核心方法 使用 Vue.js 构建系统时,需结合其响应式特性与组件化开发模式。以下为关键实现路径: 项目初始化与工程配置 通过 Vue CLI 或 Vite 创建项目骨架,推荐选…

vue实现京东

vue实现京东

Vue 实现京东电商网站的关键步骤 项目搭建与基础配置 使用 Vue CLI 或 Vite 初始化项目,安装 Vue Router 管理路由,Vuex/Pinia 管理状态。配置基础 UI 框架如 E…