组件声明
- 在
/src/main.js
声明全局组件
// 1.导入子组件
import HelloWorld from './components/HelloWorld'
// 2.创建全局组件
Vue.component('hello-world', HelloWorld);
// 3.使用:在App.vue中直接使用<hello-world/>
- 子父组件之间的互相调用
App.vue
<template>
<HelloWorldmsg="满身泥的猪儿" :title="title"></HelloWorld>
</template>
<script>
import HelloWorld from './components/HelloWorld.vue'
export default {
// 定义当前组件名称
name:'app',
components:{
//声明子组件
HelloWorld,
},
data() {
return {
title: '测试游记'
}
}
}
</script>
HelloWord.vue
<template>
<div class="hello">
<h1>{{ msg }}</h1>
<h2>{{ title }}</h2>
</div>
</template>
<script>
export default {
name: 'HelloWorld',
props: {
//从父组件获取msg
msg: String,
title: Number,
}
}
</script>
路由
一、常见应用场景
- 需求一:后台系统最常见的,就是点击左边的导航栏的页面1,右边就会显示页面1的内容,然后刷新的话,页面依旧停留在页面1,而不是跳到默认首页去。
- 需求二:一个页面中,有几个不同的画面来回点击进行切换
二、准备工作
Vue.js的路由模块是vue-route
- 安装下载
1.npm:cnpm install vue-router
(推荐)
2.直接下载:https://unpkg.com/vue-router/dist/vue-router.js
实例
1、不使用Vue的组件/模块化机制使用路由(例子直接copy的菜鸟教程,很完整了)
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Vue 测试实例 - 菜鸟教程(runoob.com)</title>
<script src="https://cdn.staticfile.org/vue/2.4.2/vue.min.js"></script>
<script src="https://cdn.staticfile.org/vue-router/2.7.0/vue-router.min.js"></script>
</head>
<body>
<div id="app">
<h1>Hello App!</h1>
<p>
<!-- 使用 router-link 组件来导航. -->
<!-- 通过传入 `to` 属性指定链接. -->
<!-- <router-link> 默认会被渲染成一个 `<a>` 标签 -->
<router-link to="/foo">Go to Foo</router-link>
<router-link to="/bar">Go to Bar</router-link>
</p>
<!-- 路由出口 -->
<!-- 路由匹配到的组件将渲染在这里 -->
<router-view></router-view>
</div>
<script>
// 1. 定义(路由)组件。
// 可以从其他文件 import 进来
const Foo = { template: '<div>foo</div>' }
const Bar = { template: '<div>bar</div>' }
// 2. 定义路由
// 每个路由应该映射一个组件。 其中"component" 可以是
// 通过 Vue.extend() 创建的组件构造器,
// 或者,只是一个组件配置对象。
// 我们晚点再讨论嵌套路由。
const routes = [
{ path: '/foo', component: Foo },
{ path: '/bar', component: Bar }
]
// 3. 创建 router 实例,然后传 `routes` 配置
// 你还可以传别的配置参数, 不过先这么简单着吧。
const router = new VueRouter({
routes // (缩写)相当于 routes: routes
})
// 4. 创建和挂载根实例。
// 记得要通过 router 配置参数注入路由,
// 从而让整个应用都有路由功能
const app = new Vue({
router
}).$mount('#app')
// 现在,应用已经启动了!
</script>
</body>
</html>
2、使用Vue的组件/模块化机制进行编程(重点)
- 在src目录下创建/router/index.js,内容如下:
// 使用模块化机制进行编程
// 1.导入vue;安装并导入vue-router
import Vue from 'vue'
import VueRouter from 'vue-router'
// 2.使用组件
Vue.use(VueRouter);
// 3.定义路由组件
// 导入组件(这里使用之前创建过的vue组件进行演示)
import One from '../components/one'
import HelloWorld from '../components/HelloWorld'
import Vfor from '../components/v-for'
// 4.创建路由
const router = new VueRouter(
{
mode: 'history',
// 4.1.定义路由数组
routes: [
// 每个路由映射一个组件,
// path:组件的映射链接
// component:可以是Vue组件,也可以是一个组件配置对象
// name:路由的名称,调用的时候可直接写名字即可
{path: '/first', component: HelloWorld, name:"first"},
{path: "/second", component: One, name:"one"},
{path: "/third", component: Vfor},
]
}
);
// 5.导出路由
export default router
- 修改/src/main.js的内容:
import Vue from 'vue'
import App from './App.vue'
// 6.导入 vue router对象,注意import的名字要和index.js中导出路由中export default的名字一样,否则找不到
import router from './router/index'
new Vue({
router, // 7.调用router
render: h => h(App), //渲染App根组件
}).$mount('#app')
- 在/src/components创建一个r-route.vue(此步骤可以直接在APP.vue添加内容也可以,只是不想APP.vue太多内容才这样写)
<template>
<div>
<!--
8.使用router-link组件进行导航
to属性:指向一个具体的链接,链接的内容会被渲染到router-view标签
router-link:会被渲染成a标签,比如:<a href="#/first">
-->
<ul>
<router-link to="/first">首页</router-link><br>
<!-- component:这里使用路由对应的name来调用 -->
<router-link to="{name:'one'}">One页</router-link><br>
<router-link to="/third">Vfor页</router-link>
</ul>
</div>
</template>
<script>
export default {
name: "r-router"
}
</script>
<style scoped>
</style>
- 在/src/APP.vue配置路由出口,以及使用上面创建的r-route.vue组件
<template>
<div id="app">
<img alt="Vue logo" src="./assets/logo.png">
<HelloWorld msg="满身泥的猪儿"/>
<!-- 使用组件 -->
<Vrouter></Vrouter>
<!-- 9.路由出口:路由匹配到的组件将渲染到这里 -->
<router-view></router-view>
</div>
</template>
<script>
import HelloWorld from "@/components/HelloWorld.vue";
// 使用组件,导入组件
import Vrouter from '@/components/r-router'
export default {
name: 'app',
components: {
HelloWorld,
// 使用组件
Vrouter
}
}
</script>
<!-- 样式渲染 -->
<style>
#app {
font-family: 'Avenir', Helvetica, Arial, sans-serif;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
text-align: center;
color: #2c3e50;
margin-top: 60px;
}
</style>
结果:刷新也会停留在当前页面
三、重定向
在定义routes
数组时,可以指定页面的重定向链接。
- 比如,当打开配置了路由的页面时,自动跳转到
/first
页面:
{ path: '/', redirect: '/first'},
四、<router-link>
标签一些属性介绍(来源菜鸟教程)
1.to
- 表示目标路由的链接。 当所在的
<router-link>
被点击后,内部会立刻把to
的值传到router.push()
,所以这个值可以是一个字符串或者是描述目标位置的对象。
<!-- 字符串 -->
<router-link to="home">Home</router-link>
<!-- 渲染结果 -->
<a href="home">Home</a>
<!-- 使用 v-bind 的 JS 表达式 -->
<router-link v-bind:to="'home'">Home</router-link>
<!-- 不写 v-bind 也可以,就像绑定别的属性一样 -->
<router-link :to="'home'">Home</router-link>
<!-- 同上 -->
<router-link :to="{ path: 'home' }">Home</router-link>
<!-- 命名的路由 -->
<router-link :to="{ name: 'user', params: { userId: 123 }}">User</router-link>
<!-- 带查询参数,下面的结果为 /register?plan=private -->
<router-link :to="{ path: 'register', query: { plan: 'private' }}">Register</router-link>
2.replace
- 设置了
replace
属性后,当所在的<router-link>
被点击后,会调用router.replace()
而不是router.push()
,导航后不会留下 历史记录。
<router-link :to="{ path: '/abc'}" replace></router-link>
3.append
- 设置
append
属性后,则在当前 (相对) 路径前添加基路径。例如,我们从 /a导航到一个相对路径 b,如果没有配置append
,则路径为/b,如果配了,则为/a/b
<router-link :to="{ path: 'relative/path'}" append></router-link>
4.tag
- 有时候想要把
<router-link>
渲染成指定标签,例如<li>
。 于是我们使用tag prop
类指定何种标签,同样它还是会监听点击事件,然后触发导航。
<router-link to="/foo" tag="li">foo</router-link>
<!-- 渲染结果 -->
<li>foo</li>
5.active-calss
- 设置
<router-link>
的链接被激活时使用的 CSS 类名。可以通过以下代码来替代。
<style>
._active{
background-color : red;
}
</style>
<p>
<router-link v-bind:to = "{ path: '/route1'}" active-class = "_active">Router Link 1</router-link>
<router-link v-bind:to = "{ path: '/route2'}" tag = "span">Router Link 2</router-link>
</p>
注意这里class
使用active_class="_active"
6.exact-active-class
- 配置当
<router-link>
的链接被精确匹配的时候应该激活的 class。可以通过以下代码来替代
<router-link v-bind:to = "{ path: '/route1'}" event = "mouseover">Router Link 1</router-link>
7.event
- 配置可以用来触发导航的事件。可以是一个字符串或是一个包含字符串的数组。
<router-link v-bind:to = "{ path: '/route1'}" event = "mouseover">Router Link 1</router-link>
以上代码设置了event
为mouseover
,那么当鼠标移动到Router Link 1
上时导航的HTML
内容会发生改变。
五、获取路由路径中的查询字符串参数
查询字符串参数例子:http://127.0.0.1/input?name=xx&age=18
中的name
和age
就是查询字符串参数。
在组件当中可以使用this.$route.query
获取到[name:xx,age:xx]
,可以通过this.$route.query.name
获取到name的值
1、one.vue
:
<template>
<div id="one">
我是one.vue的查询参数:{{ search }}
我是one.vue的路径参数:{{ message }}
<p />
<p1>
{{ rdata }}
</p1>
</div>
</template>
<script>
export default {
'name': 'one',
props: {
'rdata': String
},
data() {
return {
<!-- 获取查询字符串参数中的name参数的值 -->
search: this.$route.query.name,
message: this.$route.params.id
}
},
}
</script>
<style>
</style>
六、获取路由路径中的路径参数
路径参数例子:http://127.0.0.1/input/100
中的100
就是路径参数
1、定义包含路径参数的路由router/index.js
import Vue from 'vue'
import VueRouter from 'vue-router'
Vue.use(VueRouter);
import One from '../components/one.vue'
import HelloWorld from '../components/HelloWorld.vue'
import elelogin from '../components/elelogin.vue'
const router = new VueRouter(
{
mode: 'history',
routes: [
{path: '/first', component: HelloWorld, name:"firstname"},
//定义路径路由,格式是 xxx/:字段名
{path: "/second/:id", component: One},
{path: "/third", component: elelogin}
]
}
);
2、one.vue
的内容如步骤五:在组件当中可以使用this.$route.params
获取到路径参数的key-value,可以通过this.$route.query.id
获取到id的值100
<template>
<div id="one">
我是one.vue的查询参数:{{ search }}
我是one.vue的路径参数:{{ message }}
<p />
<p1>
{{ rdata }}
</p1>
</div>
</template>
<script>
export default {
'name': 'one',
props: {
'rdata': String
},
data() {
return {
search: this.$route.query.name,
<!-- 获取路径参数中的id参数的值 -->
message: this.$route.params.id
}
},
}
</script>
<style>
</style>
七、嵌套路由
在一个路由下,可以定义多个子路由。当访问子路由路径时,会先加载主路由内容,再加载子路由。可用于多个子页面有自己的子导航栏,但是拥有同一个主导航栏这种场景(还有更多)
语法和例子:
1.修改之前的route/index.js
,具体语法看代码
import Vue from 'vue'
import VueRouter from 'vue-router'
Vue.use(VueRouter);
import p from '../components/proute.vue'
import c from '../components/croute.vue'
import n from '../components/nroute.vue'
const router = new VueRouter(
{
mode: 'history',
routes: [
{path:'/p', component: p,
//children:子路由,列表
children:[
{
//路径中带/
path:'/c', component: c
},
{
//路径中不带/
path:'c', component:n
}
]
}
]
}
);
// 5.导出路由
export default router
- 新创建三个路由vue文件,内容如下:
1.主路由界面proute.vue
<template>
<div>
<p>我是主路由的内容</p>
<!-- 加载路由视图,否则子路由内容不会显示-->
<router-view></router-view>
</div>
</template>
<script>
</script>
<style>
</style>
2.子路由界面1,对应path
不带/
的页面:nroute.vue
<template>
<div>
<p>我是不带/路径的子路由的内容</p>
</div>
</template>
<script>
</script>
<style>
</style>
3.子路由界面2,对应path
带/
的页面:croute.vue
<template>
<div>
<p>我是带/路径的子路由的内容</p>
</div>
</template>
<script>
</script>
<style>
</style>
- 访问
1.访问主路由路径http://localhost:8080/p
2.访问完整的子路由路径http://localhost:8080/p/c、http://localhost:8080/p/c/,页面显示的是不带/路径的子路由的内容
3.访问只有子路由路径的路径http://localhost:8080/c
- 再创建一个对应空路径子路由的情况
4.nullroute.vue
<template>
<div>
<p>我是空路径子路由的内容</p>
<router-view></router-view>
</div>
</template>
<script>
</script>
<style>
</style>
5.修改route/index.js
,增加一个空路径的子路由
{path:'/p', component: p,
children:[
{
path:'/c', component: c
},
{
path:'c', component:n
},
{
path:"", component:nu
}
]
}
6.访问主路由路径http://localhost:8080/p
PS.如果主路由下有空路径的子路由,那么访问主路由时,也会把该空路径的子路由的内容给加载出来