Vue + Element UI-Frontend (7): Kapselung funktionaler Komponenten

Komponentenkapselung

Um aufgeblähten Komponentencode zu vermeiden, werden hier die wichtigsten Funktionskomponenten gekapselt, um die Modularität und Einfachheit des Codes sicherzustellen.

Komponentenstruktur

Nach der Kapselung und Rekonstruktion der Komponenten ist die Komponentenstruktur wie in der folgenden Abbildung dargestellt

Codeübersicht

Die Home-Komponente ist vereinfacht und enthält drei Komponenten: Navigation, Kopfzeile und Hauptinhalt.

Home.vue

Code kopieren

<Vorlage>
  <div class="container">
      <!-- Navigationsmenüleiste -->
      <MenuBar></MenuBar>
      <!--Kopfbereich -->
      <HeadBar></HeadBar>
      <!-- Hauptinhaltsbereich -->
      <Main></Main>
  </div>
</template>

<script>
HeadBar aus „./HeadBar/HeadBar“ importieren
Importieren Sie MenuBar aus "./MenuBar/MenuBar"
importiere Main aus „./Main/Main“
Standard exportieren {
  Komponenten:{
        Kopfleiste,
        Menüleiste,
        Hauptsächlich
  }
};
</script>

<style Scoped lang="scss">
  .container {
    Position:absolut;
    oben: 0px;
    links: 0px;
    rechts: 0px;
    Hintergrund: #4b5f6e;
  }
</style>

Code kopieren

HeadBar.vue

Code kopieren

<Vorlage>
  <div class="container">
    <!-- Navigationsmenü Anzeigeschalter ausblenden -->
    <span class="collapse-switcher" @click.prevent="collapse">
      <i class="el-icon-menu"></i>
    </span>
    <!-- Navigationsmenü -->
    <span class="nav-bar">
      <el-menu :default-active="activeIndex" class="el-menu-demo" text-color="#fff"
          active-text-color="#ffd04b" mode="horizontal" @select="selectNavBar()">
        <el-menu-item index="1" @click="$router.push('/')">{
  
  {$t("common.home")}}</el-menu-item>
        <el-menu-item index="2">{
  
  {$t("common.doc")}}</el-menu-item>
        <el-menu-item index="3">{
  
  {$t("common.msgCenter")}}</el-menu-item>
      </el-menu>
    </span>
    <span class="tool-bar">
      <!-- Themenwechsel -->
      <ThemePicker class="theme-picker"></ThemePicker>
      <!-- Sprachumschaltung -->
      <LangSelector class="lang-selector"></LangSelector>   
      <!-- Benutzerinformationen -->
      <el-dropdown class="user-info-dropdown" trigger="hover">
        <span class="el-dropdown-link"><img :src="this.userAvatar" /> {
  
  {Benutzername}}</span>
        <el-dropdown-menu slots="dropdown">
          <el-dropdown-item>{
  
  {$t("common.myMsg")}}</el-dropdown-item>
          <el-dropdown-item>{
  
  {$t("common.config")}}</el-dropdown-item>
          <el-dropdown-item shared @click.native="logout">{
  
  {$t("common.logout")}}</el-dropdown-item>
        </el-dropdown-menu>
      </el-dropdown>
    </span>
  </div>
</template>

<script>
Mock aus „@/mock/index.js“ importieren;
ThemePicker aus „@/components/ThemePicker“ importieren
LangSelector aus „@/components/LangSelector“ importieren
Standard exportieren {
  Komponenten:{
        ThemePicker,
        LangSelector
  },
  Daten() {
    zurückkehren {
      isCollapse: falsch,
      Benutzername: "Louis",
      userAvatar: "",
      aktivIndex: '1'
    };
  },
  Methoden: {
    selectNavBar(key, keyPath) {
      console.log(key, keyPath)
    },
    // Sprachumschaltung
    handleCommand(Befehl) {
      let array = command.split(':')
      let lang = array[0] === '' ? 'zh_cn' : Array[0]
      let label = array[1]
      document.getElementById("Sprache").innerHTML = label
      this.$i18n.locale = lang
    },
    //Navigationsleiste einklappen
    kollabieren: function() {
      this.isCollapse = !this.isCollapse;
    },
    //Abmelden
    Abmelden: function() {
      var _this = this;
      this.$confirm("Zum Beenden bestätigen?", "Eingabeaufforderung", {
        Typ: "Warnung"
      })
      .then(() => {
        sessionStorage.removeItem("user");
        this.$router.push
        ("/login");
      })
      .catch(() => {});
    }
  },
  mount() {
    this.sysName = "Ich mag Kitty";
    var user = sessionStorage.getItem("user");
    if (Benutzer) {
      this.userName = Benutzer;
      this.userAvatar = require("@/assets/user.png");
    }
  }
};
</script>

<style Scoped lang="scss">
.container {
  Position: absolut;
  links: 200px;
  rechts: 0px;
  Höhe: 60px;
  Zeilenhöhe: 60px;
  .collapse-switcher {
    Breite: 40px;
    schweben: links;
    Cursor: Zeiger;
    Rahmenfarbe: rgba(111, 123, 131, 0,8);
    Rand-Links-Breite: 1px;
    border-left-style: solide;
    Rand-Rechts-Breite: 1px;
    border-right-style: solide;
    Farbe weiß;
    Hintergrund: #504e6180;
  }
  .nav-bar {
    margin-left: auto;
    schweben: links;
    .das Menü {
      Hintergrund: #504e6180;
    }
  }
  .tool-bar {
    schweben rechts;
    .theme-picker {
      padding-right: 10px;
    }
    .lang-selector {
      padding-right: 10px;
      Schriftgröße: 15px;
      Farbe: #fff;
      Cursor: Zeiger;
    }
    .user-info-dropdown {
      Schriftgröße: 20px;
      padding-right: 20px;
      Farbe: #fff;
      Cursor: Zeiger;
      img {
        Breite: 40px;
        Höhe: 40px;
        Randradius: 10px;
        Rand: 10px 0px 10px 10px;
        schweben rechts;
      }
    }
  }
}
</style>

Code kopieren

MenuBar.vue

Code kopieren

<Vorlage>
    <div class="menu-bar-container">
    <!-- logo -->
    <div class="logo" :class="isCollapse?'menu-bar-collapse-width':'menu-bar-width'">
        <img :src="this.logo" /> <div>{
  
  {isCollapse?'':sysName}}</div>
    </div>
    <!-- Navigationsmenü -->
    <el-menu default-active="1-1" :class="isCollapse?'menu-bar-collapse-width':'menu-bar-width'" @open="handleopen" @close="handleclose" @select="handleselect" :collapse="isCollapse">
      <el-submenu index="1">
        <template slots="title">
          <i class="el-icon-location"></i>
          <span slots="title">{
  
  {$t("sys.sysMng")}}</span>
        </template>
        <el-menu-item index="1-1" @click="$router.push('user')">{
  
  {$t("sys.userMng")}}</el-menu-item>
        <el-menu-item index="1-2" @click="$router.push('dept')">{
  
  {$t("sys.deptMng")}}</el-menu-item>
        <el-menu-item index="1-3" @click="$router.push('role')">{
  
  {$t("sys.roleMng")}}</el-menu-item>
        <el-menu-item index="1-4" @click="$router.push('menu')">{
  
  {$t("sys.menuMng")}}</el-menu-item>
        <el-menu-item index="1-5" @click="$router.push('log')">{
  
  {$t("sys.logMng")}}</el-menu-item>
      </el-submenu>
      <el-submenu index="2">
        <template slots="title">
          <i class="el-icon-location"></i>
          <span slots="title">{
  
  {$t("sys.sysMonitor")}}</span>
        </template>
      </el-submenu>
      <el-menu-item index="3" deaktiviert>
        <i class="el-icon-document"></i>
        <span slots="title">{
  
  {$t("sys.nav3")}}</span>
      </el-menu-item>
      <el-menu-item index="4">
        <i class="el-icon-setting"></i>
        <span slots="title">{
  
  {$t("sys.nv4")}}</span>
      </el-menu-item>
    </el-menu>
    </div>
</template>

<script>
Standard exportieren {
  Daten() {
    zurückkehren {
      isCollapse: falsch,
      sysName: "",
      Logo: "",
    };
  },
  Methoden: {
    handleopen() {
      console.log('handleopen');
    },
    handleclose() {
      console.log('handleclose');
    },
    handleselect(a, b) {
      console.log('handleselect');
    }
  },
  mount() {
    this.sysName = "Ich mag Kitty";
    this.logo = require("@/assets/logo.png");
  }
};
</script>

<style Scoped lang="scss">
.menu-bar-container {
  .das Menü {
    Position:absolut;
    oben: 60px;
    unten: 0px;
    Textausrichtung: links;
  }
  .logo {
    Position:absolut;
    oben: 0px;
    Höhe: 60px;   
    Zeilenhöhe: 60px;
    Hintergrund: #4b5f6e;
    img {
        Breite: 40px;
        Höhe: 40px;
        Randradius: 0px;
        Rand: 10px 10px 10px 10px;
        schweben: links;
    }
    div {
      Schriftgröße: 22px;
      Farbe weiß;
      Textausrichtung: links;
    }
  }
  .menu-bar-width {
    Breite: 200px;
  }
  .menu-bar-collapse-width {
    Breite: 65px;
  }
}
</style>

Code kopieren

Hauptansicht

Code kopieren

<Vorlage>
  <div class="container">
    <el-breadcrumb separator="/" class="breadcrumb">
      <el-breadcrumb-item v-for="item in $route.matched" :key="item.path">
        <a href="www.baidu.com">{
  
  { item.name }}</a>
      </el-breadcrumb-item>
    </el-breadcrumb>
    <transition name="fade" mode="out-in">
      <router-view></router-view>
    </transition>
  </div>
</template>

<script>
Standard exportieren {
  Daten() {
    zurückkehren {
    };
  },
  Methoden: {

  },
  mount() {

  }
};
</script>

<style Scoped lang="scss">
.container {
  Position: absolut;
  oben: 60px;
  unten: 0px;
  links: 200px;
  rechts: 0px;
  .breadcrumb {
    Polsterung: 10px;  
    Rahmenfarbe: rgba(38, 86, 114, 0,2);
    Rand-Bottom-Breite: 1px;
    border-bottom-style: solide;
    Hintergrund: rgba(138, 158, 170, 0,2);
  }
}
</style>

Code kopieren

Auch die internationale Sprachumschaltung wurde in der Komponente LangSelector gekapselt

LangSelector/index.js

Code kopieren

<Vorlage>
  <el-dropdown class="lang-selector" @command="handleCommand">
    <span class="el-dropdown-link">
      <span id="Sprache">中文</span><i class="el-icon-arrow-down el-icon--right"></i>
    </span>
    <el-dropdown-menu slots="dropdown">
      <el-dropdown-item command="zh_cn:中文">中文</el-dropdown-item>
      <el-dropdown-item command="en_us:English">English</el-dropdown-item>
    </el-dropdown-menu>
  </el-dropdown>
</template>

<script>
  Standard exportieren {
    Methoden: {
      // Sprachumschaltung
      handleCommand(Befehl) {
        let array = command.split(':')
        let lang = array[0] === '' ? 'zh_cn' : Array[0]
        let label = array[1]
        document.getElementById("Sprache").innerHTML = label
        this.$i18n.locale = lang
      }
    }
  }
</script>

Code kopieren

Nach der Kapselung und Rekonstruktion der Komponenten wird gleichzeitig die Routing-Konfiguration geändert.

Code kopieren

Vue aus „vue“ importieren
Importieren Sie den Router aus „vue-router“.
Login aus '@/views/Login' importieren
Importieren Sie NotFound aus '@/views/404'
Startseite aus '@/views/Home' importieren
Importieren Sie Intro aus '@/views/Intro'
Benutzer aus „@/views/SysMng/User“ importieren
Importieren Sie Dept aus '@/views/SysMng/Dept'
Importieren Sie die Rolle aus '@/views/SysMng/Role'
Importieren Sie das Menü aus „@/views/SysMng/Menu“.
Importieren Sie das Protokoll aus „@/views/SysMng/Log“.

Vue.use(Router)

const router = neuer Router({
  Routen: [
    {
      Pfad: '/',
      Name: 'Homepage',
      Komponente: Zuhause,
      Kinder: [
        { Pfad: '', Komponente: Intro, Name: 'Systemeinführung' },
        { Pfad: '/user', Komponente: Benutzer, Name: 'Benutzerverwaltung' },
        { Pfad: '/dept', Komponente: Dept, Name: 'Organisationsmanagement' },
        { Pfad: '/role', Komponente: Rolle, Name: 'Rollenverwaltung' },
        { Pfad: '/menu', Komponente: Menü, Name: 'Menüverwaltung' },
        { Pfad: '/log', Komponente: Log, Name: 'Log Management' }
      ]
    },
    {
      Pfad: '/login',
      Name: 'Anmelden',
      Komponente: Anmelden
    }
    ,{
      Pfad: '/404',
      Name: 'notFound',
      Komponente: NotFound
    }
  ]
})

router.beforeEach((to, from, next) => {
  // Nach erfolgreicher Anmeldung an der Anmeldeschnittstelle werden die Benutzerinformationen in der Sitzung gespeichert
  // Die Existenzzeit ist der Sitzungslebenszyklus und läuft ab, wenn die Seite geschlossen wird.
  let user = sessionStorage.getItem('user');
  if (to.path == '/login') {
    // Wenn Sie auf die Anmeldeschnittstelle zugreifen und die Benutzersitzungsinformationen vorhanden sind, bedeutet dies, dass Sie sich angemeldet haben und zur Startseite springen.
    if(Benutzer) {
      next({ Pfad: '/' })
    } anders {
      nächste()
    }
  } anders {
    // Wenn Sie auf die Nicht-Anmeldeschnittstelle zugreifen und die Benutzersitzungsinformationen nicht vorhanden sind, bedeutet dies, dass Sie nicht angemeldet sind und zur Anmeldeschnittstelle springen.
    if (!user) {
      next({ Pfad: '/login' })
    } anders {
      nächste()
    }
  }
})

Standardrouter exportieren

Code kopieren

Testeffekt

Nach der Kapselung und Rekonstruktion unterscheidet sich die Startschnittstelle kaum von zuvor.

Supongo que te gusta

Origin blog.csdn.net/y19910825/article/details/132696802
Recomendado
Clasificación