English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Spiegazione dettagliata dell'uso di Vuex per la gestione del menu

L'virtù di vuex si manifesta solo nella gestione di stati complessi.

Se nel progetto ci sono menu multipli e diversi componenti distribuiti con menu dello stesso livello, in un momento dato, ogni livello di menu del progetto deve avere solo uno luminoso, quando si passa da un menu all'altro oltre alla modifica delle rotte, il menu corrispondente deve anche essere luminoso (il precedente deve tornare non luminoso), questo è un'ottima scena per l'uso di vuex.

Gestione del menu semplice tramite operazioni DOM

Gestione del menu tramite DOM, l'idea dietro di essa è: durante il clic del menu, passare l'oggetto evento all'elaboratore di eventi, per far sì che il menu attualmente luminoso non sia luminoso e che il menu cliccato diventi luminoso.

<div class="menu-url">
 <span class="active userList" @click="menuClicked($event, 'userList')">Registrazione</span>
 <span class="chargeList" @click="menuClicked($event, 'chargeList')">Ricarica</span>
 <span class="buyList" @click="menuClicked($event, 'buyList')">Acquisto</span>
 <span class="bangList" @click="menuClicked($event, 'bangList')">Scadenza</span>
 <span class="withDrawList" @click="menuClicked($event, 'withDrawList')">Ritiro</span>
</div>
menuClicked (event, url) {
 // Il menu highlightato corrente non è highlightato
 const currentActiveLink = this.querySelector('.active');
 currentActiveLink.classList.remove('active');
 // Highlight del menu cliccato corrente
 event.target.classList.add('active');
 // Transizione di rotta
 this.$router.push(`/panel/list/${url}`);
},

Così facendo, sebbene sia stato implementato il highlight del menu quando si fa clic per passare, c'è un bug: ogni volta che si inizializza, il menu predefinito diventa highlightato, se in quel momento si fa refresh del menu non highlightato dall'utente, può causare un errore di highlight del menu (ad esempio, dopo aver refreshato la pagina nella pagina buylist, il contenuto della pagina rimane ancora buylist, ma il menu highlightato diventa userlist).

Per risolvere questo bug, è necessario memorizzare localmente lo stato del menu (il refresh non cambia lo stato di memorizzazione), ci sono diverse soluzioni per la memorizzazione locale, che non verranno discusse qui, ma è certo che il metodo di controllo dell'highlight del menu tramite DOM + memorizzazione locale diventerà difficile da mantenere man mano che il progetto diventa più grande.

È giunto il momento dell'arrivo di vuex.

Gestione dei menu con vuex

Per gestire i menu con vuex è necessario pianificare la gerarchia dei menu prima della sviluppo, in modo da assegnare `state` e `mutations` in vuex.

Pianificazione della gerarchia

Determinare quali sono i menu di primo livello e quali sono i menu di secondo livello nel progetto, ecc. Ecco alcune cose da notare: per semplificare le operazioni, i menu dello stesso livello sono denominati in modo diverso, così in vuex non c'è bisogno di preoccuparsi di quale pagina appartiene al menu, è sufficiente concentrarsi sullo stato. La gerarchia dei menu di solito è come segue:

| |-root
| |
| |-first-menu1
| |   |- second-menu1
| |   |- second-menu2
| |   |- second-menu3
| |
| |-first-menu2
|    |- second-menu3
|    |- second-menu4
|    |- second-menu5

Assegnazione di `state` e `mutations` in vuex 

Ogni livello di menu occupa un singolo `state`, per quanto riguarda `mutations`, in questo esempio ogni `state` ha una `mutations` corrispondente. Nel lavoro pratico, per ridurre al minimo la ripetizione del codice, per la gestione dello stato del menu è possibile scrivere una singola `mutations`, utilizzando i parametri per determinare quale livello e quale menu deve essere modificato.

È importante notare che vuex riinizializza lo stato dopo il refresh della pagina, il che non corrisponde alle funzionalità necessarie per la gestione del menu (tranne per le operazioni attivate manualmente, altre operazioni non possono influenzare il menu). È possibilevuex-persistedstate Modifica il ciclo di vita predefinito di vuex, l'esempio di codice seguente tiene lo stato vuex memorizzato nei cookie:

js

const store = new Vuex.Store({
 state: {
  // Inizializzazione
  activeFirstMenu: 'firstMenu1',
  activeSecondMenu : 'secondMenu1',
 },
 mutations: {
  // Modifica il menu di primo livello
  changeFirstActiveMenu (state, menu) {
   state.activeFirstMenu = menu;
  },
  // Modifica il menu di secondo livello
  changeSecondActiveMenu (state, menu) {
   state.activeSecondMenu = menu;
  }
 },
});

Renderizzazione nel componente

Nel template caricare dinamicamente la classe evidenziata, controllata tramite lo stato di vuex:

<div class="subMenu">
 <span :class="{ activeSecondMenu: activeMenu.secondMenu1 }" @click="menuClicked('secondMenu1')">secondMenu1</span>
</div>
<div class="subMenu">
 <span :class="{ activeSecondMenu: activeMenu.secondMenu2 }" @click="menuClicked('secondMenu2')">secondMenu2</span>
</div>
<div class="subMenu">
 <span :class="{ activeSecondMenu: activeMenu.secondMenu3 }" @click="menuClicked('secondMenu3')">secondMenu3</span>
</div>

Un trucco per scrivere js: il path di rotta e il nome del menu evidenziato devono essere gli stessi, poiché la transizione di rotta e l'evidenziazione del menu sono direttamente correlate; questo riduce un parametro:

data () {
 return {
  // Inizializzazione
  activeMenu: {
   // I nomi del menu sono uguali e corrispondono al path del percorso corrispondente
   secondMenu1: '',
   secondMenu2: '',
   secondMenu3: '',
  },
 };
},
computed: {
 activeMenuName () {
  // Verifica le variazioni di activeSecondMenu nello stato vuex
  return this.$store.state.activeSecondMenu;
 }
},
methods: {
 menuClicked(path) {
  // Annulla l'evidenziazione del tab corrente
  this.activeMenu[this.activeMenuName] = false;
  // Aggiorna lo stato vuex e l'evidenziazione del menu
  this.$store.commit("changeSecondActiveMenu", path);
  this.activeMenu[this.activeMenuName] = true;
  // La transizione di rotta path e il nome del menu corrispondono 
  this.$router.push(`/somePath/${path}`);
 },
 init () {
  // Aggiorna la pagina per ripristinare il tab del menu evidenziato correttamente
  this.activeMenu[this.activeMenuName] = true;
 },
},
mounted: {}}
 this.init();
},

Altri

Ottimizzazione di Vuex

Come già discusso, nella pratica lavorativa, per una maggiore realizzazione della ripetibilità del codice, per la gestione dello stato di una certa categoria può essere scritta solo una mutations, tramite la trasmissione di parametri (Payload )giudizio del contenuto modificato. Prendiamo ad esempio la gestione del menu, è possibile ottimizzare come segue:

Vuex ottimizzato come segue:

const store = new Vuex.Store({
 // Altri codici omessi
 mutations: {
  // Codice ottimizzato, fusione di changeFirstActiveMenu e changeSecondActiveMenu
  changeActiveMenu (state, menuInfo) {
   state[menuInfo.menuHierarchy] = menuInfo.name;
  }
 }
});

La parte di codice JavaScript del componente ottimizzata è la seguente:

methods: {
 menuClicked(path) {
  // Altri codici omessi in evidenza
  // Codice ottimizzato: modifica il trigger del mutation per il menu di primo e secondo livello
  this.$store.commit("changeActiveMenu", {
   menuHierarchy: 'activeFirstMenu',
   name: path,
  });
  this.$store.commit("changeActiveMenu", {
   menuHierarchy: 'activeSecondMenu',
   name: path,
  });
  // Altri codici omessi
 },
},

Questo è tutto il contenuto dell'articolo, speriamo che sia utile per la tua apprendimento e che tu supporti fortemente il tutorial di grido.

Dichiarazione: il contenuto di questo articolo è stato raccolto da Internet, di proprietà dei rispettivi autori, il contenuto è stato contribuito e caricato autonomamente dagli utenti di Internet, questo sito non detiene i diritti di proprietà, non è stato editato manualmente e non assume alcuna responsabilità legale. Se trovi contenuti sospetti di copyright, ti preghiamo di inviare una e-mail a: notice#oldtoolbag.com (al momento dell'invio dell'e-mail, sostituisci # con @) per segnalare il problema e fornire prove pertinenti. Una volta verificata, questo sito eliminerà immediatamente il contenuto sospetto di violazione del copyright.

Ti potrebbe interessare