vue.js - Vue如何在视图级别自定义全局导航栏
问题描述
我对 Vue 超级陌生。我有一个 Vue-CLI 应用程序,它有一个导航栏和内容。导航栏对所有页面都是通用的,但我想在每个页面中自定义一些额外的内容。
例子:
常见-> 首页 | 关于
查看主页 -> 主页 | 关于 | 你在家里
查看关于 -> 主页 | 关于 | 你在看
路由器/index.js
import Vue from 'vue';
import VueRouter from 'vue-router';
import Home from '../views/Home.vue';
import NavBar from '@/components/NavBar.vue';
Vue.use(VueRouter);
Vue.component('nav-bar', NavBar);
//...
组件/导航栏.vue
<template>
<div>
<b-nav-item to="/">home</b-nav-item>
<b-nav-item to="/about">about</b-nav-item>
{{customContent}}
</div>
</template>
<script>
export default {
name: 'NavBar',
props: {
customContent: {
type: String,
default: 'default Content',
},
},
};
</script>
应用程序.vue
<template>
<div id="app">
<nav-bar />
<div class="container-fluid">
<router-view />
</div>
</div>
</template>
意见/home.vue
<template>
<div class="row">
<div class="col-12">
<image-card :images="images"/>
</div>
</div>
</template>
<script>
//how can i customize here the navbar by adding for example 'your are in view home'???
</script>
非常感谢!
解决方案
有几种方法可以解决这个问题。我将列出其中两个。
1. 通过 $route 更新 NavBar
在这种方法中,NavBar
组件已经包含所有可能的组合,并将根据$route
包含的内容显示相关部分。
这是一些伪代码:
导航栏.vue
<template>
<div class="navbar">
<div class="navbar-left>
APPNAME
</div>
<div v-if="name === 'landing'">
...
</div>
<div v-else-if="name === 'room'">
...
</div>
</div>
</template>
应用程序.vue
<template>
<div id="app">
<NavBar :name="$route.name"/>
<main>
<router-view/>
</main>
</div>
</template>
在这个例子中,NavBar
组件是非常僵化的,并不能真正地让自己重用。但是,它确实封装了与导航栏相关的所有相关代码。
2. 带插槽的可扩展导航栏
在这种方法中,NavBar
只提供了创建导航栏的最低要求。其余特定于路线的元素将由视图填充。
导航栏.vue
<template>
<div class="navbar">
<div class="navbar-left">
<div class="navbar-brand">
APPNAME
</div>
<slot name="left"></slot>
</div>
<div class="navbar-right">
<slot name="right"></slot>
</div>
</div>
</template>
应用程序.vue
<template>
<div id="app">
<router-view/>
</div>
</template>
登陆.vue
<template>
<div>
<header>
<NavBar>
<template slot="right">
<span>
<div class="navbar-item">
<div class="buttons">
<button class="button" @click="...">Start Watching</button>
</div>
</div>
</span>
</template>
</NavBar>
</header>
<main>
...
</main>
</div>
</template>
NavBar
这种方法在 DOM 元素方面有一些重复,但为您提供了一个可以由每个视图自定义的极其灵活的方法。
您要使用的方法取决于对您来说重要的内容。
如果您想要严格封装,那么您可能需要使用方法 1,因为所有与 -NavBar
相关的代码都包含在单个文件中。但是,如果您认为有重用的潜力,或者如果您希望所有与视图相关的代码都放在一个地方,那么使用并根据每个视图slots
的需要扩展它是有意义的。NavBar
推荐阅读
- android - 反应本机签名的 apk 构建失败 lint 错误
- php - 为什么 $registrationDetails 显示一个空集合而不是包含 2 个项目的集合?
- python - Tkinter:如何通过函数将两个命令分配给按钮?
- php - Wordpress Nav - 带下拉菜单的水平导航
- java - 尝试使用 Secretkey 解密数据时返回的错误
- redux-form - 带有输入组件的 Redux-form 字段在第一个字符上重新呈现,导致键盘折叠
- angular - @angular-devkit/build-angular (nodeSassConfig) 无法通过 npm 下载
- ms-access - Ms Access 2010 DMax 来自另一个表(MS Access 找不到您的表达式中引用的字段“|1”)
- django - 使用 Wagtail API 从页面 slug 返回所有字段
- php - 使用 PHP 在 FTP 帐户上打开文本文件