动态组件:< component :is=‘’>
keep-alive include exclude max
插槽:
匿名插槽 default
具名插槽
作用域插槽
v-slot:name=‘obj’ # < template>
自定义指令:directive
局部:directives 当前组件范围内
对象式:对象的名字就是指令的名字
bind(), 当指令跟DOM元素绑定的时候
inserted(),当DOM元素插入结构中的时候
update()当数据发生更新时执行
函数式:函数的名字就是指令的名字
全局:main.js中 Vue.directive
渲染:
举个栗子:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JrteIv8T-1655272924474)(assets/image-20220226140815179.png)]
对来说路由器:路由就是 一个路由接口对应一台终端设备。key===value
< component :is=‘aaa’>aaa === AAA.vue
< iframe name=‘aaa’ > < a href=“独立的 html 页面” target=‘aaa’>
Vue Router 是 Vue.js 官方的路由管理器。Vue.js 路由允许我们通过不同的 URL 访问不同的内容。根据 url 锚点路径,在容器中加载不同的模块,本质作用是做页面导航。
路由的本质就是一种对应关系,比如说我们在url地址中输入我们要访问的url地址之后,浏览器要去请求这个url地址对应的资源。 那么url地址和真实的资源之间就有一种对应的关系,就是路由。
路由:实际上就是一组对应关系。
一个路径对应一个路由组件。 这个路径表示的仅仅是纯前端级 组件跳转。类似于锚点。
主要目的:就是为了开发SPA应用
SPA: single page web application。单页Web应用(single page web application,SPA),就是只有一张Web页面的应用。单页应用程序 (SPA) 是加载单个HTML 页面并在用户与应用程序交互时动态更新该页面的Web应用程序。 [1] 浏览器一开始会加载必需的HTML、CSS和JavaScript,所有的操作都在这张页面上完成,都由JavaScript来控制。因此,对单页应用来说模块化的开发和设计显得相当重要。
速度:更好的用户体验,让用户在web app感受native app的速度和流畅,
·MVVM:经典MVVM开发模式,前后端各负其责。
·ajax:重前端,业务逻辑全部在本地操作,数据都需要通过AJAX同步、提交。
·路由:在URL中采用#号来作为当前视图的地址,改变#号后的参数,页面并不会重载。
通过 Vue.js 可以实现多视图的单页Web应用(single page web application,SPA)(单页面应用开发)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SuaeCTGo-1655272924476)(assets/image-20220225221554642.png)]
路由渲染的本质其实是超链接锚点:通过location.href
可以获取到当前的路径地址,通过location.hash
可以获得锚点的名字内容,也就是#name
。
当用户点击了页面中的路由链接时,会使链接的地址发生改变,相当于点击页面中的超链接时,链接的锚点发生改变,也叫做hash值 。路由会监听这个地址的变化,从而把这个地址对应的组件渲染到页面上。
这就意味着,我们要实时的监听浏览器地址栏中的内容,只要地址栏的内容发生了改变,我们就要获取到 地址栏中末尾位置的路径地址 然后根据这个路径地址 来渲染出不同的组件。需要监听事件onhashChange
只要地址发生改变 这个事件就可以触发。
<template>
<div id="app">
<div>
<a href="#/aaa">AAA</a>
<a href="#/bbb">BBB</a>
<a href="#/ccc">CCC</a>
</div>
<div>
<component :is='name'></component>
</div>
</div>
</template>
<script>
import aaa from './components/AAA.vue'
import bbb from './components/BBB.vue'
import ccc from './components/CCC.vue'
export default {
data () {
return {
name:'aaa'
}
},
name: 'App',
components: {
aaa,bbb,ccc
},
created () {
//onhashchange 监听地址栏 只要地址栏发生了改变 就会触发这个事件
window.onhashchange =()=>{
console.log('1111',location.hash)
switch(location.hash){
case "#/aaa":
this.name = "aaa"
break
case "#/bbb":
this.name = "bbb"
break
case "#/ccc":
this.name = "ccc"
break
}
}
}
}
</script>
npm install vue-router@3/@4
//1.导入vue和vue-router模块
import Vue from 'vue'
import VueRouter from 'vue-router'
//使用路由模块 注册路由模块
Vue.use(VueRouter)
//2.导入我们自己需要的组件 路由组件
import Student from '../views/Student.vue'
//import Subject from '../views/Subject.vue'
//3.配置路由规则 映射关系/对应关系
const routes = [
{ path: '/stu', component: Student },
{ path: '/sub', component: ()=>import('../views/Subject.vue') },
]
//4.创建路由器对象,向外暴漏
export default new VueRouter({
routes
})
import Vue from 'vue'
import App from './App.vue'
//导入路由
import router from './router/index.js'
Vue.config.productionTip = false
new Vue({
router,//注册路由
render: h => h(App)
}).$mount('#app')
< router-link to="/路径">< /router-link>
标签配置路由导航active-calss='router-link-active'
linkActiveClass
来全局配置< router-view>< /router-view>
标签渲染组件
把这个标签写在要渲染组件的位置就可以了。<template>
<div id="app">
<div id="nav">
<!-- 配置路由导航 : 路径对应的就是 router中配置的 路径 -->
<router-link to="/">Home</router-link>
<router-link to="/about">about</router-link>
</div>
<!-- 路由链接的组件渲染的位置 -->
<router-view></router-view>
<img alt="Vue logo" src="./assets/logo.png" />
<!-- <HelloWorld msg="Welcome to Your Vue.js App"/> -->
</div>
</template>
注意: 路由的切换会导致组件销毁,如果不想销毁可以参考使用 keep-alive
注意: 此时在路由渲染的组件中添加mounted生命周期钩子 打印输出this 会发现 vue组件实例对象上多出两个属性:
route 和 router
route 指的是当前路由组件的配置相关的信息(参数对象),router指的是整个路由器对象 (导航对象)
当我们打开项目访问页面时,访问的路径是根路径 http://localhost:8080/#/
是一个单独的/
,路由中并没有与之对应的匹配规则,所以此时我们可以设置redirect
属性 来作为路由打开时 默认访问的组件页面。
//redirect 用来配置重定向
//当访问 / 时 会把路径重定向到 stu
{ path: '/', redirect: "sub" },
概念: 我们点击一级路由会展示一个组件,但是在这个组件的内部 还会存在其余的链接/按钮,此时点击这个链接/按钮 会重新渲染一个组件,此时,一级路由组件跟这个嵌套组件的关系就是嵌套路由。我们要通过children
属性来配置子路由
注意: 二级路由,path分配,前面不要有 /
#二级路由配置
routes:[
{
path:'/home',
children:[
//redirect 重定向 通过这个属性可以设置 默认展示的子路由组件
{path:"/",redirect:"list"},
{path:'tv',component:()=>import('./../components/tv.vue')},
{path:'music',component:()=>import('./../components/music.vue')}
]
}
]
#在一级路由组件模版中定义二级路由导航和路由出口
<!-- 在一级路由组件模版中,定义二级路由导航 -->
<router-link to='/home/tv'>tv</router-link>
<!-- 在一级路由组件模版中,定义二级路由出口-->
<router-view></router-view>
:
传递参数)**简介:**我们经常需要把某种模式匹配到的所有路由,全都映射到一个同样的组件。例如,我们有一个StudentInfo
组件,对于所有 ID学号 各不相同的学生,都要使用这个组件来渲染学生信息。
把hash地址中可变的部分定义为参数项,可以提高路由的可复用性。我们可以在 vue-router
的路由路径中使用“动态路径参数”来达到这个效果,使用:
表示动态路由参数。
组件中的路由点击位置:
<router-link to='stu/1'>学生一</router-link>
<router-link to='stu/2'>学生二</router-link>
<router-link to='stu/3'>学生三</router-link>
<router-link to='stu/4'>学生四</router-link>
注意:此时 只要是goods下的地址都会被路由映射到 路由规则的goods选项节点下去匹配
{
path: '/Student',
component: Student,
children:[
{path:'stu/1',component:StuInfo},
{path:'stu/2',component:StuInfo},
{path:'stu/3',component:StuInfo},
{path:'stu/4',component:StuInfo},
]
},
此时路由规则可以这样定义,但是太麻烦了,每一个都要对应一个路由规则,此时可以采用一下对应规则
index.js中的路由规则:
const router = new VueRouter({
routes: [
// 动态路径参数 以冒号开头
{ path: 'stu/:id', component: StuInfo }
]
})
此时我们可以在StuInfo
组件中接收到路由中传递的参数:
当匹配到一个路由时,参数值会被设置到 this.route.params,可以在每个组件内使用。于是,我们可以更新 学生信息的模板,输出当前用户的 ID:< div>User {{
props
属性传递参数)props
属性//index.js中的路由配置
//添加属性props:true;
const router = new VueRouter({
routes: [
// 动态路径参数 以冒号开头
{ path: 'stu/:id', component: StuInfo ,props:true}
]
})
StuInfo
组件中使用props
属性接收参数export default{
//
props:['id'],
methods:{
aaa(){
console.log(this)
}
}
}
补充: 注意:上边代码中<router-link to='stu/1' />
标签中的参数 1 一般被叫做路径参数 。我们也有另外一种传递参数的方式,类似于超链接向后台发送请求的参数传递(hash地址传参), <router-link to='stu/1?name=张三&age=19'/>
这种参数传递的方式叫做 查询参数 组件接收数据时 可以使用 $route.query
来接收。
路由链接处代码:(路由传递参数的写法一):to属性的字符串拼接式
<router-link to="/Student/stu/1?name=123&age=18">张三</router-link>
StuInfo
组件中代码:可以使用$route.query
接收参数
<h4>{{$route.query}}</h4>
**路由传递参数的写法二:**to属性的对象式
<router-link :to="{
path:'/Student/stu/2',
query:{
name:'123456',
age:18
}
}">
李四
</router-link>
概念: 在定义路由时 添加一个新的配置项 name
就可以了
index.js配置中:
{
path: '/Student',
//此处给路由添加一个name属性
name:'SSS',
component: Student,
children:[
{path:'stu/:id',component:StuInfo,props:true}
]
},
路由链接处:
通过:to
属性 指定 对应的路由跳转
<router-link tag="p" active-class="router-link-active" :to="{name:'SSS'}">学生管理</router-link>
### 1.6 命名路由
**概念:** 在定义路由时 添加一个新的配置项 `name` 就可以了
`index.js配置中:`
```js
{
path: '/Student',
//此处给路由添加一个name属性
name:'SSS',
component: Student,
children:[
{path:'stu/:id',component:StuInfo,props:true}
]
},
路由链接处:
通过:to
属性 指定 对应的路由跳转
<router-link tag="p" active-class="router-link-active" :to="{name:'SSS'}">学生管理</router-link>