目录
一、什么是路由?
二、如何使用路由
(一)路由的基本使用
(二)路由的跳转
(三)路由重定向
(四)选中路由高亮
(五)定义参数
(六)组件的嵌套
(七)命名视图
三、计算属性和监听器
附:method、computed和watch的区别
1.后端路由:对于普通的网站,所有的超链接都是URL地址,所有的URL地址都对应服务器上对应的资源
2.前端路由:对于单页面应用程序来说,主要通过URL中的hash(#号)来实现不同页面之间的切换,同时,hash有一个特点:HTTP请求中不会包含hash相关的内容;所以,单页面程序中的页面跳转主要用hash实现;
3.在单页面应用程序中,这种通过hash改变来切换页面的方式,称作前端路由(区别于后端路由)
1.引入js文件,这个js需要放在vue的js后面,自动安装(提供了一个VueRouter的构造方法)
2.创建路由new VueRouter(),接受的参数是一个对象
3.在实例化的对象里配置属性routes:[],这个数组里的对象包含path属性和component属性
4.path属性是url的地址,component属性就是显示的组件(传组件的对象)
//创建路由new VueRouter(),接受的参数是一个对象 const router = new VueRouter({ //在实例化的对象里配置属性routes:[],这个数组里的对象包含path属性和component属性 routes:[ { //path属性是url的地址 path:'/index', //component属性就是显示的组件名称 component: index },{ path:'/detail', component: detail, }, ], });
5.创建的路由需要和vue实例关联一下
在vue实例中与data、methods同级的位置加入一个属性router:‘路由的名字’
6.路由到的组件显示在哪个位置?在父组件中加入
index 去详情
1.router-link标签可以设置to属性
·默认是a标签,可以通过tag设置包裹标签
去详情 去详情(参数拼接) 去详情(query对象传参) 去个人中心(params对象传参)
2.函数式跳转
methods: { // 函数式跳转 todetail(){ // this.$router.push('/detail') this.$router.push({path:'/detail'}) }, toMine(){ // this.$router.push({path:'/mine',query:{id:104,name:'lisi'}}) this.$router.push({ name:"my", params:{userid:999} }) } },
redirect可以进行路由的重定向
routes:[ { //路由的重定向 redirect path:'/', redirect:'/index', }, { //path属性是url的地址 path:'/index', //component属性就是显示的组件名称 component: index },{ path:'/detail', component: detail, }, // 路径传参 { path:'/mine/:userid', component:mine, // params传参,设置name name:'my' } ],
1.使用默认的样式
直接设置router-link-active
/* 1.使用默认的高亮样式 直接设置router-link-active */ .router-link-active{ font-size: 30px; color: hotpink; }
2.自定义样式
在路由实例中与routes同级配置 linkActiveClass:'自定义的类名'
//创建路由new VueRouter(),接受的参数是一个对象 const router = new VueRouter({ //在实例化的对象里配置属性routes:[],这个数组里的对象包含path属性和component属性 routes:[ { //路由的重定向 redirect path:'/', redirect:'/index', }, { //path属性是url的地址 path:'/index', //component属性就是显示的组件名称 component: index },{ path:'/detail', component: detail, }, // 路径传参 { path:'/mine/:userid', component:mine, // params传参,设置name name:'my' } ], // 自定义高亮,配置 linkActiveClass:'自定义的类名',此时原有的高亮失效 linkActiveClass:"myactive" });
1.通过query的方式在url后加?参数名=参数的值
去详情 去详情(参数拼接) 去详情(query对象传参)
获取参数:$route.query.参数名
let detail = { template: '#detail', created(){ console.log(this); // 获取参数:$route.query.参数名 console.log(this.$route.query.id); } }
2.使用浏览器参数的方式传递参数
去个人中心(params对象传参)
获取参数$route.params.参数名
let mine = { template: '#mine', created(){ console.log(this); // 2.获取参数$route.params.参数名 console.log(this.$route.params); } }
1.声明路由的时候设置children,这是children是一个数组,数组里是路由对象
{ path:'/detail', component: detail, //声明路由的时候设置children,这是children是一个数组,数组里是路由对象 //这个children的组件就会渲染在它父组件的
中 children:[ { // 注意children中的子路由的对象中的path属性的内容不加/,如果加/ 会被解析为根路由 path:'play', component:play },{ path:"course", component:course } ] }, 注意children中的子路由的对象中的path属性的内容不加/ , 如果加/ 会被解析为根路由
2.这个children的组件就会渲染在它父组件的
详情页play
1.我们之前只能一个地址对应一个组件,现在可以一个地址对应多个组件
{ path:'/detail', // 使用compones可以定义多个组件 components: { // 通过default属性可以设置默认的组件,默认组件只有一个,不写名字也可以渲染 default:detail, play:play, course } }
2.components属性设置的
3.给router-view设置名字,这个名字和components组件名字是对应的
命名视图 1.我们之前只能一个地址对应一个组件,现在可以一个地址对应多个组件 2.components属性设置的 3.给router-view设置名字,这个名字和components组件名字是对应的 4.设置默认值default对应组件可以设置名字也可以访问
4.设置默认值default对应组件可以设置名字也可以访问
1.watch:监听data中属性的改变
const vm = new Vue({ el: '#app', data: { firstName:"", lastName:"", // name:"", }, // watch监听data中属性的改变 watch:{ firstName:function(value){ console.log(value); this.name = this.firstName + '-' +this.lastName }, lastName:function(value){ console.log(value); this.name = this.firstName + '-' +this.lastName }, }, })
2.computed:默认只有getter的计算属性,定义有getter和setter的计算属性
(1)getter:只要该表达式中含有的data中的数据发生改变时,该属性中的数据就会发生改变
(2)setter:只有当自身发生改变的时候才触发
const vm = new Vue({ el: '#app', data: { firstName:"", lastName:"", // name:"", }, // 属性计算 computed: { // 属性不能和data中重复 // name() { // return this.firstName + '-' +this.lastName; // }, name: { get:function(){ return this.firstName + '-' +this.lastName; }, // 只有当自身发生改变的时候才触发 set(value){ console.log(value); console.log(value.split('-')); if( value.split('-').length ==2){ this.firstName = value.split('-')[0] this.lastName = value.split('-')[1] } } }, }, })
1.computed属性的结果会被缓存,除非依赖的响应式属性变化才会重新计算。主要当作属性来使用,使用的时候不加();
2.methods方法表示一个具体的操作,主要书写业务逻辑;
3.watch一个对象,键是需要观察的表达式,值是对应回调函数。主要用来监听某些特定数据的变化,从而进行某些具体的业务逻辑操作;可以看作是computed和methods的结合体