vue-route的使用

179 阅读3分钟

#vue全家桶

vue-route的基本使用

** //第一步:引入vue ,引入vuerouter //第二步:模块化机制使用这个插件 //第三步:创建路由对象,routes这个单词别写错 //第四步:在main.js中,导入router对象,然后,挂载router实例,挂载到vue中 //第五步:在APP.vue中,通过router-link导入对应的路由,通过router-view渲染对应的路由**

## 动态路由匹配和路由复用
在index.js里面创建路由
` path:'/user/:id',
 name:'user',
 component: User,`
 
 在App.vue里面``<router-link :to="{name:'user',params:{id:1}}">User1</router-link>
  <router-link :to="{name:'user',params:{id:2}}">User2</router-link>``
  
  在User.vue`<div>用户页面 {{$route.params.id}}</div>`
  ` created () {
          console.log(this.$route.params.id);
      },`
**相应路由参数的变化**
`  //  watch:{
    //      $route:(to,from)=>{
   //           console.log(to.params.id);
    //          // 发起ajax 请求后端接口数据 数据驱动视图
   //       }
   //   }
     
    beforeRouteUpdate(to,from,next){
       console.log(to.params.id);
         // 一定要调用next,不然会阻塞整个路由
         next();
    } `
    
3.5 404路由和路由匹配优先级
当找不到路由的时候,就会弹出404页面意思是报错的意思,具体创建路由如下:
`{
 path:'*',
 component: () => import('@/views/404')}`
 **路由优先级意思,如果名称相同的路由,按上到下的顺序来匹配路由**
 
 3.6路由参数查询
 和上面正常创建路由
 ``` {
  path:'/page',
  name:'page',
  component:()=>import('@/views/Page')},```
  
 ,然后page这个组件页面如下:
 ```<template>
<div>
      <h3>page页面</h3>
</div>
```

3.8路由组件传值 在上面的创建路由下面加个props:true

     path:'/user/:id',
     name:'user',
     component: User,
     props:true,``这里就可以把对应的id传到对应的路由组件中
     ```
然后在User.vue组件中,
```<template>
    <div>
        
         <div>用户页面 {{id}}</div>这里是使用这个id
    </div>
</template>    
<script>   
    export default {
          created () {
              console.log(this.$route.params.id);
          },
   props:['id'],这里是id传过来
 </script>  

<style lang="scss" scoped>
    
</style>```视频后面还有种函数传值的,看视频吧
**3.10嵌套路由就是在组件里面加2个路由而已,要加个渲染view-review**
``` children:[   这里在原user路由下,创建2个子路由
     //   {
      //     path:'profile',
      //     component:()=>import('@/view/Profile')
      //  },
      //  {
      //   path:'post',
      //   component:()=>import('@/view/Post')
      //  }
    // ] ```
然后创建2个组件profile和post,最后在app.vue里
```<!--路由嵌套-->
     <router-link to='/user/1/profile'>user/1/profile</router-link>
     <router-link to='/user/1/posts'>user/2/posts</router-link>```
3.11命名视图的使用
```{
    path: '/home',
    name: 'home',
    //component: Home      //Home这是名字把组件导入进来
    components:{
       default:Home,  //默认的名字
       main: () => import('@/views/Main'),
       sideBar: () => import('@/views/SideBar'),
    }```
然后创建2个组件Main和SideBar,然后建2个view渲染出来
```<router-view></router-view>   <!--这个是渲染home组件出来的-->

    <router-view name='main'></router-view>
    <router-view name='sideBar'></router-view>```
3.12 如何使用全局守卫做登录操作
这知识点总结就是,打开网页如果没登录账户就自动跳转到登录页面,如果已经登录账户了,就不用再跳转登录页面
首先,在route底下的index.js创建2个新路由
```{
     path:'/notes',
     name:'notes',
     component:()=> import('@/views/Notes')
  },
  {
    path:'/login',
    name:'login',
    component:()=> import('@/views/Login')
 },```
 然后创建2个组件Notes和Login,最后在App.vue中渲染notes组件出来
 ```<!--用动态路由的方式-->
     <router-link :to='{name:"notes"}'>我的笔记</router-link>```
这里面在Login.vue组件设置下登录页面,
```<template>
    <div>
         <h2>登录页面</h2>
         <input type="text" v-model='user'>
         <input type="password" v-model='pwd'>
         <button @click='handleLogin'>登录</button>
    </div>
</template>

<script>
    export default {
        data() {
            return {
                user: '',
                pwd: ''
            }
        },
        methods: {
             handleLogin() {
                 //1.获取用户名和密码
                 // 2.与后端发生交互
                 setTimeout(() => {    //这里用延时1秒来模拟后端
                      let data = {
                          user:this.user
                      }
                      // 保存用户名到本地
                      localStorage.setItem('user',JSON.stringify(data));
                      // 跳转到我的笔记页
                      this.$router.push({
                          name:'notes'
                      })
                 }, 1000);
             }
        },
    }
</script>

<style lang="scss" scoped>

</style>```

3.13组件内部的守卫的应用
**这节大概意思做1个输入框的页面,然后用户在输入框输入内容时候,如果不小心点错其它东西,会弹出一个框来提示用户是否确认离开,这样就避免点错其它东西到其它页面去,因为去其它页面,输入框里面的内容就没了,如果点错就尴尬了**
首先跟上面一样,创建个eaditor的路由,在App.vue里渲染这个路由出来,然后重点一样是在组件Eaditor.vue里面配置内容,代码如下:
```<template>
    <div>
        <h2>用户的编辑页面</h2>
        <textarea v-model='content' cols="30" rows="10"></textarea>
        <button @click='saveContent'>保存</button>
        <ul>   // 往列表里面添加数据
            <li v-for='(item,index) in list' :key='index'>
                <h3>{{item.title}}</h3>
            </li>
        </ul>
    </div>
</template>

<script>
    export default {
        data() {
            return {
                content: '', //定义一个空的字符串
                list:[]
            }
        },
        methods: {
            saveContent() {
                 this.list.push({
                     title:this.content
                 })
                 this.content = '';      //清空文本输入框
            }
        },
        beforeRouteLeave(to,from,next){
            if(this.content){
                alert('请确保保存信息之后,再离开');
                next(false);
            }else{
                next()
            }
           
            
        } // 这方法是看用户点其他东西后,是否有离开本页面想法
    }
</script>

<style lang="scss" scoped>

</style>```

## 3.14 路由元信息实现权限控制
给需要添加权限的路由设置meta字段
首先哪个路由需要就在哪个路由下加meta,代码如下:
```{
      path:"/blog",
      name:'blog',
      component:()=>import('@/views/Blog'),
      meta:{
         requireAuth:true   // blog加到黑名单了
      }
  },```
  难理解的是在main.js中写这个权限,
  ```// 全局守卫
router.beforeEach((to, from, next) => {
    if(to.matched.some(record=>record.meta.requireAuth)){
       // 需要权限
       if(!localStorage.getItem('user')){ //判断user是否有值,没就跳转登录,有就放行
           next({
             path:'/login',
             query:{
                redirect:to.fullPath
             }
           })     // 这个在黑名单,要跳转页面
       }else{
         next();  // 在白名单,放行
       }
    }
   next();
})``` 还有最后一点也在note.vue做了修改,可以看看视频

## 3.15路由组件内在什么时机获取数据
数据获取
有时候,进⼊某个路由后,需要从服务器获取数据。例如,在渲染⽤
户信息时,你需要从服务器获取⽤户的数据。我们可以通过两种⽅式
来实现:
导航完成之后获取:先完成导航,然后在接下来的组件⽣命周期
钩⼦中获取数据。在数据获取期间显示“加载中”之类的指示。
导航完成之前获取:导航完成前,在路由进⼊的守卫中获取数
据,在数据获取成功后执⾏导航。

这里是导航完成后获取数据的代码:
先在根目录test新建vue.config.js,
```module.exports = {
    devServer:{
        before:(app,serve)=>{
            app.get('/api/post',(req,res)=>{
                res.json({  //返回定位数据
                   title:'vue-router的数据获取',
                   body:'1.在导航完成之后获取数据'
                })
            })
        }
    }
}```
然后,在根目录test终端编码cnpm i axios -s下载这个axios,然后npm run serve重启服务器,然后在main.js导入axios,代码如下:
`import axios from 'axios';
Vue.prototype.$http = axios;  // 挂载axios到vue里面`

新建Post2组件来显示数据,记得在index.js里创建post的路由,还有记得也要在App.vue中渲染哦
```<template>
    <div class="post">
         <div v-if='loading' class="loading">Loading........</div>
         <div v-if='error' class="error">{{error}}</div>
         <div v-if='post'>
              <h3>标题:{{post.title}}</h3>
              <p>内容:{{post.body}}</p>
         </div>
    </div>
</template>

<script>
    export default {
        data() {
            return {
                post: null,
                error:null,
                loading:fasle
            };
        },
        created(){
            console.log(this.$http);
            this.getPostData();       // 获取数据
        },
        methods: {
            async getPostData() {
                try{
                    this.loading = true;
                    const [data] = await this.$http.get('/api/post');
                    this.loading = false;
                    this.post = data;
                    
                } catch (error) {
                    this.error = err.toString()
                }
            }
        }
    }
</script>

<style lang="scss" scoped>

</style>```