博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
webpack入坑之旅(六)配合vue-router实现SPA
阅读量:4085 次
发布时间:2019-05-25

本文共 15917 字,大约阅读时间需要 53 分钟。

这是一系列文章,此系列所有的练习都存在了我的github仓库中,在本人有了新的理解与认识之后,会对文章有不定时的更正与更新。下面是目前完成的列表:

在上面的练习当中我们已经成功的加载了一个.vue格式的单文件组件,并且实现了在使用vue情况下的自动刷新。

但是我们最终的目的还是要实现单页面应用程序,这个时候我们就必不可少的需要使用到路由管理器来进行SPA的开发,vue官方为我们提供了一个官方库,并且配有对应的。关于里面的内容大家自行前去观看。在这里,只会把我们需要的东西拿出来讲。

vue组件

Vue中定义一个组件非常简单,只需要一对自定义标签,在其中填入内容就可以进行我们的组件编写了,然后使用Vue.component()去注册我们的组件下面来看一个例子,来直观的看看vue的组件。

组件入门

1     
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
     

上面就是最简单的定义组件的方式,template属性中写的东西:就是<my-component>这个自定义标签渲染后展现出来的样式,这里渲染为:

1     
2
3
4

hello Vue component

hello Vue component

使用template标签

在上面这段代码中组件内的内容都被写在template属性中,如果组件中的内容继续增加,一堆的引号和加号来拼接这些字符串简直就是噩梦。所以Vue 引入了template标签(html5定义的,浏览器默认不去解析里面的内容)。<template> 不能用在 <table> 内下面来看看它的使用方法:

1     
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
     

可以看到在注册组件中,可以template可以使用选择器来获取到上面我们<template>标签中的内容。所以这里应该会被渲染为:

1     
2
3
4
5
6

This is Template

add ...

This is Template

add ...

组件的基础介绍就到这,更多详细内容请移步

vue-router

刚刚已经对于vue的组件有了一定的了解。现在来结合vue-router,来进行一下动态的切换。

首先是安装,如果使用npm的形式的话,直接运行npm install vue-router --save,就可以看到vue-router,已经被添加到了项目依赖中。直接上ES6的语法来进行引入

1     
2
3
import Vue       
from
"vue";
import VueRouter
from
"vue-router";
Vue.use(VueRouter);

起步

其实这一部分vue-router的中已经讲的非常详细了。。在这里与它不同的是它用的CommonJS的规范来进行模块安装,而我使用ES6的import,有兴趣自己去看- -。其他的内容我就直接扒下来了。

html:

1     
2
3
4
5
6
7
8
9
10

javascript:

1     
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
// 定义组件     
var Foo = Vue.extend({
template:
'

This is foo!

'
})
var Bar = Vue.extend({
template:
'

This is bar!

'
})
// 路由器需要一个根组件。
// 出于演示的目的,这里使用一个空的组件,直接使用 HTML 作为应用的模板
var App = Vue.extend({})
// 创建一个路由器实例
// 创建实例时可以传入配置参数进行定制,为保持简单,这里使用默认配置
var router =
new VueRouter()
// 定义路由规则
// 每条路由规则应该映射到一个组件。这里的“组件”可以是一个使用 Vue.extend
// 创建的组件构造函数,也可以是一个组件选项对象。
// 稍后我们会讲解嵌套路由
router.map({
'/foo': {
component: Foo
},
'/bar': {
component: Bar
}
})
// 现在我们可以启动应用了!
// 路由器会创建一个 App 实例,并且挂载到选择符 #app 匹配的元素上。
router.start(App,
'#app')

我个人感觉这部分还是很好理解的,官方也给了一个。很好的展现了它的路由切换。

简单的介绍到这,下面最重要的部分到了,看看如何结合我们定义的.vue单文件组件。

首先来看我们的文件目录结构:

定义路由规则

最主要是main.js的变化,直接在文件中讲解了:

1     
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
// 引入vue以及vue-router     
import Vue
from
"vue";
import VueRouter
from
"vue-router";
Vue.use(VueRouter);
// 引入组件!直接使用es6的语法
import index
from
'./components/app.vue';
import list
from
'./components/list.vue';
import hello
from
'./components/hello.vue';
//开启debug模式
Vue.config.debug =
true;
// new Vue(app);//这是上一篇用到的,新建一个vue实例,现在使用vue-router就不需要了。
// 路由器需要一个根组件。
var App = Vue.extend({});
// 创建一个路由器实例
var router =
new VueRouter();
// 每条路由规则应该映射到一个组件。这里的“组件”可以是一个使用 Vue.extend创建的组件构造函数,也可以是一个组件选项对象。
// 稍后我们会讲解嵌套路由
router.map({
//定义路由映射
'/index':{
//访问地址
name:
'index',
//定义路由的名字。方便使用。
component:index,
//引用的组件名称,对应上面使用`import`导入的组件
//component:require("components/app.vue")//还可以直接使用这样的方式也是没问题的。不过会没有import集中引入那么直观
},
'/list': {
name:
'list',
component: list
},
});
router.redirect({
//定义全局的重定向规则。全局的重定向会在匹配当前路径之前执行。
'*':
"/index"
//重定向任意未匹配路径到/index
});
// 现在我们可以启动应用了!
// 路由器会创建一个 App 实例,并且挂载到选择符 #app 匹配的元素上。
router.start(App,
'#app');

在index.html需要有用于渲染匹配的组件,如下

1     
2
3

现在当我们运行 npm start 进入http://localhost:8080/就会自动跳转到http://localhost:8080/#!/index,并且读取里面的内容。

实现路由跳转

主要抽出app.vue中的内容来讲解,的内容是:(list.vue里面的内容自行设置查看吧)

1     
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26

因为自刷新的缘故,直接切换到浏览器。

点击上面使用的v-link,与router.go的方式都可以跳转到list定义的路由。(观察浏览器地址栏的变化)在这里我们使用的{name:"list"},使用{ path: '/list' }会有同样的效果。

引用Vue组件

在第一小点里面我们看到了在页面内的组件的使用方法,第二小点中学习到了vue-router的制定路由规则。

看过这两个地方之后,我们把思维发散开来,应该就能触类旁通的想到如何在页面中嵌套加载别的组件了。

我们创建一个hello.vue ,里面内容随意。现在我们如果要在app.vue中加载它,那么只需要在app.vue中使用import hello from "./hello.vue"(其实这个达到了使用require两步的效果。引入赋值)。

引入之后,只需要如下注册:

1     
2
3
4
5
6
export       
default {
//其它的就
components:{
hello
//若还有更多的组件,只需要在import的情况下,以逗号分割,继续注册就好
}
}

最后在app.vue中添加<hello></hello>这一对自定义标签,就可以实现加载hello.vue中的内容。

组件的嵌套也就是这样,很简单的描述完了,但是怎么样去抽离组件,在工作中积累可以复用的组件才是我们真正需要去思考的。

那么先到这,关于组件之间通信的问题,留到以后慢慢了解。

路由嵌套

还是刚刚的代码与目录结构,我们已经实现了组件之间的嵌套,但是有时并不希望组件直接就加载进来,而是在用户点击后才展现在页面中,这是就需要使用到路由嵌套。

为了偷懒,这里就直接使用hello.vue。实现嵌套路由主要有以下几步:

第一步:制定嵌套路由规则:

main.js下面这部分的代码:

1     
2
3
4
5
6
7
8
9
10
11
12
13
14
15
router.map({     
'/index':{
name:
'index',
component:index,
// 在/index下设置一个子路由
subRoutes:{
// 当匹配到/index/hello时,会在index的
内渲染
'/hello':{
name:
'hello',
//可有可无,主要是为了方便使用
// 一个hello组件
component:hello
}
}
},
});

第二步:在组件中添加<router-view>

来自官网的解释:<router-view> 用于渲染匹配的组件,它基于Vue的动态组件系统,所以它继承了一个正常动态组件的很多特性。

<router-view>写在app.vue<template></template>标签中。

第三步:写入跳转路径

还是在app.vue中:

1     
2
3
回去主页      
嵌套的路由

,切换到浏览器,点击该嵌套的路由即可让hello.vue中的展现出来,在这里直接使用了v-link来实现跳转(知道为什么要写name了吧。。如果使用path会是这样的{ path: '/index/hello' }- -。 ) ,当然router.go同理。(注意在点击两个不同的文字时,地址栏的变化,以及展现内容的切换)

注意:

在我的源码中是在<style scoped></style>标签中定义样式的,请注意scoped的使用,它表示在该style中定义的样式只会在当前的组件中起到效果,而不会去影响全局的css样式。

最简单的理解应该就是:

未写该scoped属性的所有组件中的样式,在经过vue-loader编译之后拥有全局作用域。相当于共用一份css样式表。

而写了该属性的的组件中定义的样式,拥有独立作用域。相当于除去引入了公用的一份css样式表外,但单独拥有一份css的样式表。

好了,先到这。讲的有些凌乱,下次见

转载地址:http://czeni.baihongyu.com/

你可能感兴趣的文章
Cache —— 替换算法和写策略
查看>>
应用AI芯片加速 Hadoop 3.0 纠删码的计算性能
查看>>
Hadoop 3.0 纠删码技术分析(Erasure Coding)
查看>>
Hadoop EC的一个实现:
查看>>
hadoop3 EC测试
查看>>
HDFS 纠删码
查看>>
基于柯西矩阵的Erasure Code技术详解
查看>>
基于范德蒙矩阵的Erasure code技术详解
查看>>
一个IO的传奇一生(12)-- 磁盘阵列1
查看>>
主定理的证明及应用举例
查看>>
线性判别分析(Linear Discriminant Analysis,LDA) 简单分析
查看>>
leetcode刷题(五):分治算法
查看>>
【算法】动态规划算法—买卖股票的最佳时机系列(1-4)
查看>>
想从事分布式系统,计算,hadoop等方面,需要哪些基础,推荐哪些书籍?--转自知乎
查看>>
【经验总结】如何找方向相关(计算机)的论文
查看>>
计算机论文查找
查看>>
计算机方向学术入门经验
查看>>
大牛博士是如何进行文献检索和阅读(好习惯受益终生)
查看>>
【转】台湾教授-如何阅读科研论文
查看>>
《如何写好科研论文》
查看>>