大家应该也发现到了,目前点选 Navbar 项目并没有任何反应;但是点选公版中的 Home 和 About 时:
之前有介绍过 App.vue 是整个专案的核心主件,并且会在此处进行切换路由元件及渲染相应页面,因此仔细观察 App.vue,我们可以发现与两个 router 相关的关键字—— <router-link>
和 <router-view>
元件。
<div id="app">
<Navbar />
<div id="nav">
<router-link to="/">Home</router-link> |
<router-link to="/about">About</router-link>
</div>
<router-view />
</div>
<router-link>
:导航<router-link>
是个提供使用者在具有路由功能的应用程序中,能透过点击事件触发导航功能的元件,利用 prop to
导向指定的目标路由,渲染结果预设为 <a>
标签。(aria-current 为无障碍网页属性)
<!-- template -->
<router-link to="/">Home</router-link>
<!-- render -->
<a href="/" class="router-link-active" aria-current="page">Home</a>
如欲指定渲染结果的标签,则可使用 tag
变更指定,且仍然保有监听点击事件而触发路由切换的效果。
<!-- template -->
<router-link to="/" tag="li">Home</router-link>
<!-- render -->
<li class="router-link-active">Home</li>
prop to
为必填项目,其所指定的路径透过触发点击事件後传递给 router.push()
方法进行路由切换。该值可以是字串或描述目标位址的路由物件:
字串型别
<router-link to="/">Home</router-link>
绑定路由物件
<router-link :to="{ path: '/' }">Home</router-link>
<router-link :to="{ name: 'About' }">About</router-link>
<router-view>
:路由出口<router-view>
则是个功能元件,其随着 <router-link>
的路径切换,负责显示出匹配当前路径的元件内容。以 App.vue 为例,当路径切换至「/about」时,<router-view>
就会将画面内容在其范围内渲染成当前路径 About.vue 的元件内容。
<router-view>
唯一的 prop 就是 name
,用来为自己命名,有了指定名称之後,<router-view>
就只会显示对应的元件内容。例如在同一个页面中需要同时显示两个区块——主要区块和侧边栏,此时就可以在同一个路由中设置 components
物件(特别注意 component 的结尾要加上代表复数的「s」),接着在 components
里各别设定 <router-view>
所对应的元件,name
作为 key(若无指定名称则预设为 default),元件名称作为 value。
<router-view class="view main" />
<router-view class="view sidebar" name="aside" />
const router = new VueRouter({
routes: [
{
path: '/',
components: {
default: Main,
aside: Sidebar,
}
}
]
})
接着来厘清这三个相似名词的含义:
由於 router 实例在 main.js 挂载到 Vue 实例中,所以在每个元件里都可以使用下列属性:
this.$route
:代表当前的路由物件(The Route Object),其包含一些唯读属性解析该路由的相关信息,例如路径(path)、路由参数(params)、查询参数(query)等。this.$router
:代表 router 实例,其包含的设置更多,如建构选项(Construction Options)、实例属性(Properties)及方法(Methods)。两种属性各司其职,但以下方式则会指向同一个路由物件:
this.$router.currentRoute
=this.$route
试着在 <script> 写个 console 观察结果就知道了!
mounted() {
console.log("router: ", this.$router.currentRoute);
console.log("route: ", this.$route);
},
了解 router 规则之後,现在来改写我们的 Navbar 路由吧!
首先,四个 navItem 分别要在 router/index.js 中新增路由配置,以及在 views 资料夹中新增对应的 .vue 档案,才能在路径切换时找到元件渲染内容。
原始结构
<b-navbar-nav
class="my_navbar_item"
v-for="navItem in navList"
:key="navItem.id"
>
<b-nav-item href="#">{{ navItem.item }}</b-nav-item>
</b-navbar-nav>
data() {
return {
navList: [
{ id: 1, item: "全部书单" },
{ id: 2, item: "七折区" },
{ id: 3, item: "五折区" },
{ id: 4, item: "iT邦帮忙铁人赛系列书" },
],
};
},
改写方式:在 data
中新增 name,以供 to
绑定。
data() {
return {
navList: [
{ id: 1, item: "全部书单", name: "All" },
{ id: 2, item: "七折区", name: "Discount30" },
{ id: 3, item: "五折区", name: "Discount50" },
{ id: 4, item: "iT邦帮忙铁人赛系列书", name: "Ithelp" },
],
};
},
方法1:透过 router 实例方法 router.push()
维持 BootstrapVue 元件结构,在 <b-nav-item> 上新增 click 事件,於触发点击事件时使用 router.push()
方法导向指定路由位址。
<b-navbar-nav
class="my_navbar_item"
v-for="navItem in navList"
:key="navItem.id"
>
<b-nav-item href="#" @click="$router.push({ name: navItem.name })">
{{ navItem.item }}
</b-nav-item>
</b-navbar-nav>
顺手一起改写 <b-navbar-brand>,使得点击「天珑书单」时导向首页位址。
<b-navbar-brand href="#" @click="$router.push('/')">
天珑书单
</b-navbar-brand>
方法2:使用 <router-link>
元件
因为 <b-nav-item> 已是巢状结构中的最子层,所以在此处直接用 <router-link>
元件来取代,另加上原本在 <b-nav-item> 上的 class="nav-link"
以渲染出 BootstrapVue 元件样式。
<b-navbar-nav
class="my_navbar_item"
v-for="navItem in navList"
:key="navItem.id"
>
<router-link :to="{ name: navItem.name }" class="nav-link">
{{ navItem.item }}
</router-link>
</b-navbar-nav>
试试看点击每个 Navbar 项目是否都能成功跳转了呢~
<<: Windows系统权限--传说的至高无上SYSTEM和虚拟高阶TrustedInstaller
>>: Day12:12 - 商品服务(3) - 後端 & 前端 - 商品详情API
1. select语句的case表达式,都会在选择之前,先被求值。 2. case表达式,求值的顺序...
When you are troubling to access your PST file due...
第一天主要想表达以下内容: 一.我是谁? 其实我只是一个普通的大学生,我的科系不全然是资工,但也有涉...
介绍 Artisan 是 Laravel 里的指令列介面名称,当开发应用程序时,它提供了许多有用的指...
这里我使用之前安装wsl2的虚拟机来进行,打开Ubuntu,首先进行安装nginx: sudo ap...