J'ai une application d'une seule page avec une barre de navigation latérale qui contient un ensemble de balises d'ancrage dans une liste.
Je souhaite afficher le contenu à afficher dans la page en fonction de la valeur de la variable selectedPage
. En plus de changer la valeur de selectedPage
en fonction du lien cliqué dans la barre latérale.
Même en incluant .prevent sur l'événement click, le code ci-dessous ne modifie pas la valeur de la variable. Y a-t-il une autre condition que je devrais utiliser à la place
MaPage.html
#Navbar for selecting content
<div id="sidebar-wrapper">
<ul class="sidebar-nav">
<li><a href="#" @click.prevent="selectedPage ='Foo'">Foo</a></li>
<li><a href="#" @click.prevent="selectedPage ='Bar'">Bar</a></li>
</ul>
</div>
#Page content
<div id="page-content-wrapper">
<div class="main-content" id="app" v-cloak>
<div class="container-fluid" v-if="selectedPage === 'Foo'">
<h3 class="page-title">{{selectedPage}}</h3>
</div>
<div class="container-fluid" v-if="selectedPage === 'Bar'">
<h3 class="page-title">{{selectedPage}}</h3>
</div>
</div>
</div>
App.js
new Vue({
el: '#app',
data: {
selectedPage: 'Foo',
}
})
Cela fonctionne comme je l'espère. ça marche comme vous vous y attendez?
new Vue({
el: '#app',
data: {
selectedPage: 'Foo'
}
});
#app {
display: flex;
}
#sidebar-wrapper {
border-right: solid thin black;
margin-right: 15px;
padding-right: 15px;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.3.4/vue.min.js"></script>
<div id="app">
<div id="sidebar-wrapper">
<ul class="sidebar-nav">
<li><a href="#" @click.prevent="selectedPage ='Foo'">Foo</a></li>
<li><a href="#" @click.prevent="selectedPage ='Bar'">Bar</a></li>
</ul>
</div>
#Page content
<div id="page-content-wrapper">
<div class="main-content" id="app" v-cloak>
<div class="container-fluid" v-if="selectedPage === 'Foo'">
<h3 class="page-title">{{selectedPage}}</h3>
Foo section
</div>
<div class="container-fluid" v-if="selectedPage === 'Bar'">
<h3 class="page-title">{{selectedPage}}</h3>
Bar section
</div>
</div>
</div>
</div>
J'ai juste eu un scénario intéressant où je faisais fonctionner le bouton avec le clavier uniquement pour a11y .
J'ai fait ça et ça a très bien marché:
En cliquant sur le bouton, un popover apparaît via vue-popperjs
, qui doit être ignoré après le clic sur l'élément de menu. Je vais montrer le balisage entier et en discuter après:
<template>
<v-popper trigger="click" :options="{ placement: 'bottom' }" enter-active-class="shadow-lg">
<div class="popper">
<div class="flex flex-col text-left p-2">
<span class="text-pink font-bold py-2 px-8">Download</span>
<a
:href="defaultAction"
class="no-underline text-grey-darkest hover:bg-pink-lighter py-2 px-8"
@click="$refs.downloadButton.click()"
>
CSV
</a>
<a
:href="urlsAction"
class="no-underline text-grey-darkest hover:bg-pink-lighter py-2 px-8"
@click="$refs.downloadButton.click()"
>
CSV with URLs
</a>
</div>
</div>
<button
ref="downloadButton"
slot="reference"
class="flex items-center justify-center text-center no-underline rounded-full w-8 h-8 text-grey-darker hover:text-pink active:text-pink-darker mr-2"
title="Download CSV"
>
<i class="fas fa-download"></i>
</button>
</v-popper>
</template>
Il y a deux choses clés qui se passent ici:
Placez une ref
sur le bouton
Feu $ref.downloadButton.click()
lorsque l'utilisateur clique sur la balise <a>
Ceci fermera la fenêtre lorsque les éléments du menu sont cliqués, vous donnant une UX malade.