Vue(4)

2019-04-08  本文已影响0人  一颗脑袋

这里说的Vue中的路由是指前端路由,与后端路由有所区别。我们可以使用url来获取服务器的资源,而这种url与资源的映射关系就是我们所说的路由。对于单页面程序来说,我们使用url时常常通过hash的方法切换页面,即我们常用的锚点。比如:

<a href="#here">click me</a> /*跳转到对应的锚点*/

<!-- ... -->

<div id="here">you find me</div> /*设置锚点*/

而请求路径中的hash不会传到后端,所以常常被用作前端切换页面的方法,即在同一服务器资源下对页面进行切换。

下面分别从Node和Vue中使用路由,来感受具体的区别。

一、使用Node中的路由:express自带ruoter

先看一下需要完成的效果:

当我们点击页面上的Home和About按钮是会跳转到对应的服务器资源页面。

首先安装必要的模块,创建文件目录结构和前端资源文件。

# 初始化目录
npm init -y
# 安装需要的模块
npm install express art-template express-art-template

其他资源页面可以在参考这里(可直接下载运行)

二、使用Vue中的路由:VueRouter

我们使用官方路由来创建一个简单的单页面应用:

1、VueRouter的简单入门

首先我们需要安装Vue.js和VueRouter.js

<script src="https://unpkg.com/vue/dist/vue.js"></script>
<script src="https://unpkg.com/vue-router/dist/vue-router.js"></script>

2、router-link

<router-link> 组件支持用户在具有路由功能的应用中 (点击) 导航。
通过 to 属性指定目标地址,默认渲染成带有正确链接的 <a> 标签,可以通过配置 tag 属性生成别的标签.。另外,当目标路由成功激活时,链接元素自动设置一个表示激活的 CSS 类名。

3、router-view

<router-view> 组件是一个 functional 组件,渲染路径匹配到的视图组件。<router-view> 渲染的组件还可以内嵌自己的 <router-view>,根据嵌套路径,渲染嵌套组件。

4、路由构建选项

在创建路由是可传入的参数,上面的实例中我们传入了路由规则信息的routes,此外还有其他参数。

此外还有一些其他可供选择的项,这里不再一一赘述。更多细节请参考:Vue-router官方文档

5、路由实例属性

6、 路由对象

一个路由对象 (route object) 表示当前激活的路由的状态信息,包含了当前 URL 解析得到的信息,还有 URL 匹配到的路由记录 (route records)

路由对象是不可变 (immutable) 的,每次成功的导航后都会产生一个新的对象。

路由对象可以出现在多个地方,自如组件内:this.$route。(注意是$route而不是$router,前者是路由对象,后者是路由实例)。

路由对象有以下属性:

更多细节请参考:Vue-router官方文档

7、一些简单的例子

#路由对象的使用
<p>
    <!--注意:这里如果没有 / 就会变成append模式 ,即在当前连接下添加连接-->
    <router-link to="/query?id='123'&name='jinx'">Query</router-link>
    <router-link to="/params/456/yasuo">Params</router-link>
</p>
<router-view></router-view>
//1、创建路由视图组件:在模版中掉用路由对象
var query = {template: '<h3>this is query: id=<em>{{$route.query.id}}</em>&name=<em>{{$route.query.name}}</em></h3>'};
var params = {template: '<h3>This is params: id=<em>{{$route.params.id}}</em>, name=<em>{{$route.params.name}}</em></h3>'};

//2、创建路由规则
var routes = [
    {path: '/query', component: query},
    {path: '/params/:id/:name', component: params}
];

//3、创建一个路由实例
var router  = new VueRouter({
    routes: routes
});
//4、将路由搭载到Vue实例中
new Vue({
    el: '#app',
    router: router
});
#路由嵌套
<div id="app">
<!--路由-->
<router-link to="/">Home</router-link>
<router-link to="/account">Account</router-link>
<router-view></router-view>
<!--模板-->
<script type="text/template" id="account-template">
    <div>
        <h3>用户操作界面</h3>
        <!--子路由-->
        <router-link to="/account/login">login</router-link>
        <router-link to="/account/register">register</router-link>
        <router-view></router-view>
    </div>
</script>
</div>
//1、创建路由视图组件
var home = {template: '<h3>home page</h3>'};
var account = {template: '#account-template'};//可以导入模板(这里使用template标签的使用有bug不知道什么原因)
var login = {template: '<h3>登陆</h3>'};
var register = {template: '<h3>注册</h3>'};
//2、创建路由规则
var routes = [
    {path: '/', component: home},
    {path: '/account',
    component: account, 
    children: [
        {path: '/account/login', component: login},
        {path: '/account/register', component: register}
    ]
    },
];

//3、创建一个路由实例
var router  = new VueRouter({
    routes: routes
});
//4、将路由搭载到Vue实例中
new Vue({
    el: '#app',
    router: router
});

可以尝试一下如果子路由也写在外部routes的效果(当写在外部就会共用router-view标签)。关于模板需要注意的是,可以使用类似script这样的标签来包裹模板,然后根据id进行引用即可,另外,模板只能有一个根元素。关于模板标签的使用可以参考这篇文章:HTML5 template 标签元素简介

#命名视图组件

目前我们都只是用了一个router-view标签,如果我们需要使用多个,那我们就需要对组件进行命名,否则无法找到要渲染的位置。注意,使用的是conponents而非component

比如下面的例子:

<div id="app">
<!--对路由视图进行命名-->
<router-view></router-view>
<div style="display: flex;height: 800px;">
    <router-view name="left"></router-view>
    <router-view name="main"></router-view>
</div>
</div>
//1、创建路由视图组件
var header = {template: '<div class="header">header</div>'};
var left = {template: '<div class="left">left</div>'};
var main = {template: '<div class="main">main</div>'};
//2、创建路由规则
var routes = [
    {path: '/',
    components: {
        default: header,
        left: left,
        main: main
    }//命名视图组件
}];

//3、创建一个路由实例
var router  = new VueRouter({
    routes: routes
});
//4、将路由搭载到Vue实例中
new Vue({
    el: '#app',
    router: router
});

再添加一下样式:

body{
    margin: 0px;
    padding: 0px;
}
.header{
    background-color: #6aa4d2;
    height: 100px;
}
.left{
    background-color: #999ddd;
    flex: 2;
}
.main{
    background-color: #b6b985;
    flex: 8;
}

就可以看到以下布局效果:

上一篇下一篇

猜你喜欢

热点阅读