Jadual Kandungan
1. Tentukan data
2. Komponen mengekap
Rumah hujung hadapan web View.js Bagaimana untuk merangkum komponen menu tanpa had Vue3 Element-plus dan el-menu

Bagaimana untuk merangkum komponen menu tanpa had Vue3 Element-plus dan el-menu

May 14, 2023 pm 02:49 PM
vue3 element-plus el-menu

Komponen el-menu yang diberikan kepada kami dalam elemen boleh mencapai sehingga tiga peringkat sarang Jika terdapat satu lapisan data lagi, anda hanya boleh menambah satu lapisan sendiri melalui pembolehubah. ia selalunya OK. Ia tidak berfungsi, jadi kami hanya boleh merangkumnya

Bagaimana untuk merangkum komponen menu tanpa had Vue3 Element-plus dan el-menu
Rendering

1. Tentukan data

MenuData.ts

export default [
    {
        id: "1",
        name: "第一级菜单",
        level: '1',
        child: [
            {
                id: "11",
                name: "第二级菜单",
                level: '1-1',
                child: [
                    {
                        id: "111",
                        name: "第三级菜单",
                        level: '1-1-1',
                        child: [
                            {
                                id: "1111",
                                name: "第四级菜单",
                                level: '1-1-1-1',
                                child: [
                                    {
                                        id: "11111",
                                        name: "第五级菜单",
                                        level: '1-1-1-1-1',
                                        child: []
                                    }
                                ]
                            }
                        ]
                    }]
            }
        ]
    },
    {
        id: "2",
        name: "第一级同级菜单",
        level: '2',
        child: []
    }
 
]
Salin selepas log masuk

2. Komponen mengekap

Idea pembungkusan:

1. Kitar semula komponen anda sendiri, jika ada subset, gunakan anda komponen sendiri untuk menghantar data anak kepada diri sendiri

2. Jika tiada subset, gunakan el-menu-item

Kod berikut melaksanakan fungsi setup() dan setup syntax sugar masing-masing

persediaan gula sintaks

<template>
  <el-menu
    :default-active="defaultActive"
    :unique-opened="true"
    class="el-menu-vertical-demo"
  >
    <template v-for="item in menu">
      <!-- 如果有子集 -->
      <template v-if="item.child && item.child.length > 0">
        <el-sub-menu
          :key="item.id"
          :index="item.level"
          :disabled="item.meta?.disabled"
          :popper-append-to-body="false"
        >
          <template #title>
            <i :class="[item.meta?.icon]"></i>
            <!-- 添加空格 表示下级-->
            <span> {{ generateSpaces(item.level) }} </span>
            <span slot="title"> {{ item.name }}</span>
          </template>
          <MenuTree
            :menu="item.child"
            :defaultActive="defaultActive"
            @clickItem="clickItemHandle"
          />
        </el-sub-menu>
      </template>
      <!-- 如果没有子集 -->
      <template v-else>
        <el-menu-item
          :key="item.id"
          :index="item.level"
          :disabled="item.meta?.disabled"
          :popper-append-to-body="false"
          @click="clickItemHandle(item)"
        >
          <i :class="[item.meta?.icon]"></i>
          <!-- 添加空格 表示下级-->
          <span> {{ generateSpaces(item.level) }} </span>
          <span slot="title">{{ item.name }}</span>
        </el-menu-item>
      </template>
    </template>
  </el-menu>
</template>
 
<script lang="ts" name="MenuTree" setup>
// 把下面代码变成setup语法糖的形式 
import type { PropType } from "vue";
import type { MenuItem } from "@/types/lesson";
// type 为了方便写成这样 可以根据自己项目设定type
 defineProps({
  menu: {
    type: Array as unknown as PropType<any[]>,
    required: true,
    default: () => [],
  },
  defaultActive: {
    type: String as unknown as PropType<string>,
    required: true,
    default: [],
  },
});
 
const emit = defineEmits(["update-active-path", "clickItem"]);
 
// 返回的空格字符串 用于显示菜单层级 
const generateSpaces = (level: string) => {
  let str = "";
  level.split("")  .filter((it) => it != "-") .forEach(() => {
      str += " ";
  });
  return str;
};
 
// 点击当前菜单项
const clickItemHandle = (item: MenuItem) => {
  emit("clickItem", item);
};
</script>
 
<style scoped lang="less">
.el-menu {
  width: 288px;
}
</style>
Salin selepas log masuk

Fungsi persediaan

<template>
  <el-menu :default-active="defaultActive"  :unique-opened="true"   class="el-menu-vertical-demo"  >
    <template v-for="item in menu">
        <template v-if="item.child && item.child.length > 0">
          <el-sub-menu 
            :key="item.id"
            :index="item.level"
            :disabled="item.meta?.disabled"
            :popper-append-to-body="false"
          >
            <template #title>
              <i :class="[item.meta?.icon]"></i>
              <!-- 添加空格 表示下级-->
              <span> {{ generateSpaces(item.level) }} </span>
              <span slot="title"> {{ item.name }}</span>
            </template>
            <MenuTree :menu="item.child" :defaultActive="defaultActive"  @clickItem="clickItemHandle"  />
          </el-sub-menu>
        </template>
        <template v-else>
          <el-menu-item 
            :key="item.id"
            :index="item.level"
            :disabled="item.meta?.disabled"
            :popper-append-to-body="false"
            @click="clickItemHandle(item)"
          >
            <i :class="[item.meta?.icon]"></i>
            <!-- 添加空格 表示下级-->
            <span> {{ generateSpaces(item.level) }} </span>
            <span slot="title">{{ item.name }}</span>
          </el-menu-item>
        </template>
      </template>
  </el-menu>
</template>
 
<script lang="ts">
import { defineComponent, toRefs } from &#39;vue&#39;;
import type { PropType } from &#39;vue&#39;
import type {MenuItem} from &#39;@/types/lesson&#39;
export default defineComponent({
  name: &#39;MenuTree&#39;,
  props: {
    menu: {
      type: Array as unknown as PropType<any[]>,
      required: true,
      default: () => [],
    },
    defaultActive: {
      type: String as unknown as PropType<string>,
      required: true,
      default: &#39;&#39;,
    },
  },
  emits: [&#39;update-active-path&#39;,&#39;clickItem&#39;],
  setup(props, context) {
    const { menu, defaultActive } = toRefs(props);
 
    const generateSpaces = (level:string) => {
      let str = &#39;&#39;
      level.split(&#39;&#39;).filter(it=>it!=&#39;-&#39;).forEach(() => {
        str += &#39; &#39;
      })
      return str
    }
 
    const clickItemHandle = (item:MenuItem) => {
      context.emit(&#39;clickItem&#39;, item)
    }
 
   
    return {
      clickItemHandle,
      menu,
      defaultActive,
      generateSpaces,
    }
  },
});
</script>
 
<style scoped lang="less">
  .el-menu {
    width: 288px;
  }
</style>
Salin selepas log masuk

jenis tidak ditambah. 🎜> 3. Gunakan komponen

<template>
 <MenuTree
        :menu="menuList"
        :defaultActive="defaultActive"
        @clickItem="handleMenuClick"
        :update-click="handleMenuClick"
      />
</template>
 
<script setup lang="ts">
import MenuTree from "./components/MenuTree.vue";
import type {MenuItem} from &#39;@/types/lesson&#39;
import menuData from &#39;./MenuData&#39;
 
const defaultActive = ref<string>(&#39;&#39;); // "1-1-1-1" 默认选中的数据
const menuList = ref(menuData)
 
const handleMenuClick = (item:MenuItem) => {
  console.log(&#39;父组件&#39;,item);
};
</script>
Salin selepas log masuk

untuk menambah pembolehubah lalai -aktif

, jika anda ingin mengklik pada lapisan pertama data secara lalai pada mulanya, anda perlu mencari corak untuk mendapatkan semua peringkat, dan mengembalikannya kepada anda melalui antara muka untuk mendapatkan semua peringkat atau

Sebagai contoh, format data:

let arr = [  "1-1",
  "1-1-1",
  "1-1-1-1",
  "1-1-1-2",
  "1-1-1-3",
  "1-1-1-4",
  "1-1-1-5",
  "1-1-1-6",
  "1-1-2",
  "1-1-2-1"
]
Salin selepas log masuk

Yang dikehendaki. hasilnya ialah elemen terpanjang dengan nombor paling sama 1-1-1-1

arr.sort((a,b)=> b.split(&#39;-&#39;).length - a.split(&#39;-&#39;).length)[0]
Salin selepas log masuk

Gunakan belah untuk menghalang beberapa Rentetan ialah nombor dua digit 10 dan 11

Atas ialah kandungan terperinci Bagaimana untuk merangkum komponen menu tanpa had Vue3 Element-plus dan el-menu. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

Video Face Swap

Video Face Swap

Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas

Tutorial Java
1658
14
Tutorial PHP
1257
29
Tutorial C#
1231
24
Cara melaksanakan kebolehsuntingan jadual dan pemilihan baris melalui vue dan Element-plus Cara melaksanakan kebolehsuntingan jadual dan pemilihan baris melalui vue dan Element-plus Jul 17, 2023 am 09:43 AM

Cara melaksanakan keboleheditan jadual dan pemilihan baris melalui vue dan Element-plus Pengenalan: Jadual ialah salah satu komponen yang kerap digunakan semasa membangunkan aplikasi web. Kebolehsuntingan jadual dan fungsi pemilihan baris adalah keperluan biasa dan praktikal. Dalam rangka kerja Vue.js, kedua-dua fungsi ini boleh dicapai dengan mudah dengan menggabungkan perpustakaan komponen Element-plus. Artikel ini akan memperkenalkan cara melaksanakan fungsi keboleheditan jadual dan pemilihan baris melalui Vue dan Element-plus, serta menyediakan contoh kod yang sepadan. 1. Ketepatan projek

Cara menggunakan vue dan Element-plus untuk melaksanakan borang langkah demi langkah dan pengesahan borang Cara menggunakan vue dan Element-plus untuk melaksanakan borang langkah demi langkah dan pengesahan borang Jul 17, 2023 pm 10:43 PM

Cara menggunakan Vue dan ElementPlus untuk melaksanakan borang langkah demi langkah dan pengesahan borang Dalam pembangunan web, borang ialah salah satu komponen interaksi pengguna yang paling biasa. Untuk borang yang kompleks, kita selalunya perlu melaksanakan pengisian langkah demi langkah dan fungsi pengesahan borang. Artikel ini akan memperkenalkan cara menggunakan rangka kerja Vue dan ElementPlus untuk mencapai kedua-dua fungsi ini. 1. Borang langkah demi langkah Borang langkah demi langkah merujuk kepada membahagikan borang besar kepada beberapa langkah kecil, dan pengguna perlu mengisi langkah mengikut langkah. Kami boleh memanfaatkan komponenisasi dan penghalaan Vue

Cara menggunakan vue dan Element-plus untuk melaksanakan fungsi muat naik dan memuat turun fail Cara menggunakan vue dan Element-plus untuk melaksanakan fungsi muat naik dan memuat turun fail Jul 18, 2023 pm 12:28 PM

Cara menggunakan Vue dan ElementPlus untuk melaksanakan fungsi muat naik dan muat turun fail Pengenalan: Dalam aplikasi web, fungsi muat naik dan muat turun fail adalah perkara biasa. Artikel ini akan memperkenalkan cara menggunakan Vue dan ElementPlus untuk melaksanakan fungsi muat naik dan muat turun fail. Melalui kod sampel, anda boleh dengan mudah dan intuitif memahami cara menggunakan Vue dan ElementPlus untuk melaksanakan fungsi ini. 1. Pasang dan import ElementPlus Pasang ElementPlus dalam projek Vue.

Cara memuat semula sebahagian kandungan halaman dalam Vue3 Cara memuat semula sebahagian kandungan halaman dalam Vue3 May 26, 2023 pm 05:31 PM

Untuk mencapai muat semula separa halaman, kami hanya perlu melaksanakan pemaparan semula komponen setempat (dom). Dalam Vue, cara paling mudah untuk mencapai kesan ini ialah menggunakan arahan v-if. Dalam Vue2, selain menggunakan arahan v-if untuk memaparkan semula dom setempat, kami juga boleh mencipta komponen kosong baharu Apabila kami perlu memuat semula halaman setempat, lompat ke halaman komponen kosong ini dan kemudian masuk semula pengawal beforeRouteEnter dalam komponen kosong. Seperti yang ditunjukkan dalam rajah di bawah, cara mengklik butang muat semula dalam Vue3.X untuk memuatkan semula DOM dalam kotak merah dan memaparkan status pemuatan yang sepadan. Memandangkan pengawal dalam komponen dalam sintaks persediaan skrip dalam Vue3.X hanya mempunyai o

vue3+vite: Bagaimana untuk menyelesaikan ralat apabila menggunakan memerlukan untuk mengimport imej secara dinamik dalam src vue3+vite: Bagaimana untuk menyelesaikan ralat apabila menggunakan memerlukan untuk mengimport imej secara dinamik dalam src May 21, 2023 pm 03:16 PM

Penggunaan vue3+vite:src memerlukan pengimportan imej secara dinamik dan laporan ralat dan penyelesaian vue3+vite secara dinamik Jika vue3 dibangunkan menggunakan skrip taip, akan terdapat mesej ralat untuk keperluan untuk memperkenalkan imej tidak boleh digunakan :require(' .../assets/test.png') diimport kerana typescript tidak menyokong require, jadi import digunakan Berikut ialah cara menyelesaikannya: gunakan awaitimport

Cara menggunakan vue dan Element-plus untuk melaksanakan pemberitahuan mesej dan gesaan pop timbul Cara menggunakan vue dan Element-plus untuk melaksanakan pemberitahuan mesej dan gesaan pop timbul Jul 17, 2023 pm 10:42 PM

Pengenalan kepada cara menggunakan Vue dan ElementPlus untuk melaksanakan pemberitahuan mesej dan gesaan pop timbul: Dalam pembangunan aplikasi web, pemberitahuan mesej dan gesaan pop timbul adalah salah satu fungsi yang sangat penting. Sebagai rangka kerja bahagian hadapan yang popular, Vue, digabungkan dengan ElementPlus, perpustakaan UI yang sangat baik, boleh melaksanakan pelbagai gesaan pop timbul dan fungsi pemberitahuan mesej dengan mudah. Artikel ini akan memperkenalkan cara menggunakan perpustakaan komponen ElementPlus dalam projek Vue untuk melaksanakan pemberitahuan mesej dan fungsi gesaan pop timbul, dan melampirkan contoh kod yang berkaitan.

Cara menggunakan vue dan Element-plus untuk mengeksport dan mencetak data Cara menggunakan vue dan Element-plus untuk mengeksport dan mencetak data Jul 18, 2023 am 09:13 AM

Cara menggunakan Vue dan ElementPlus untuk melaksanakan fungsi eksport dan cetakan data Dalam beberapa tahun kebelakangan ini, dengan perkembangan pesat pembangunan bahagian hadapan, semakin banyak aplikasi web perlu menyediakan fungsi eksport dan cetakan data untuk memenuhi keperluan pengguna yang pelbagai untuk penggunaan data. . Sebagai rangka kerja JavaScript yang popular, Vue boleh melaksanakan fungsi eksport dan pencetakan data dengan mudah apabila digunakan dengan pustaka komponen ElementPlus. Artikel ini akan memperkenalkan eksport data dan

Bagaimana untuk memilih avatar dan memangkasnya dalam Vue3 Bagaimana untuk memilih avatar dan memangkasnya dalam Vue3 May 29, 2023 am 10:22 AM

Kesan terakhir ialah memasang komponen VueCropper yarnaddvue-cropper@next Nilai pemasangan di atas adalah untuk Vue3 Jika ia adalah Vue2 atau anda ingin menggunakan kaedah lain untuk merujuk, sila lawati alamat npm rasminya. Ia juga sangat mudah untuk merujuk dan menggunakannya dalam komponen Anda hanya perlu memperkenalkan komponen yang sepadan dan fail gayanya. Saya tidak merujuknya secara global di sini, tetapi hanya memperkenalkan import{userInfoByRequest}from'../js/api. ' dalam fail komponen saya import{VueCropper}dari'vue-cropper&

See all articles