最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • vue-router的这些易混知识点你都掌握了吗

    正文概述 掘金(丸子啦)   2021-08-07   727

    这是我参与8月更文挑战的第3天,活动详情查看: 8月更文挑战” 。

    1. Vue中router和routes和route的区别

    在Vue中,router指向的是大路由,routes是路由配置数组, route指向的是当前活跃的路由。下面我们详细了解一下这三者。

    1.1 router:是VueRouter的一个实例对象,通过Vue.use(VueRouter)和VueRouter构造函数得到一个router的实例对象。例如$router,它是一个全局路由对象,包含了路由跳转的方法、钩子函数等。在组件内可通过 this.$router 访问整个路由器

    在项目中的应用有:

    • router的index.js
    import Vue from 'vue'
    import VueRouter from 'vue-router'
    Vue.use(VueRouter)
    const router = new VueRouter({
      mode: 'hash',
      base: process.env.BASE_URL,
      routes
    })
    
    • 路由导航守卫router.beforeEach和router.afterEach
    router.beforeEach((to, from, next) => {})
    
    • 关于$router

    $router常用于编程式导航中,首先打印一下$router的内容。 vue-router的这些易混知识点你都掌握了吗

    • this.$router.push方法

      该方法的参数可以是一个字符串,也可以是一个描述地址的对象。

      // 字符串 
      this.$router.push('home') ;
      
      //对象 
      this.$ruter.push({path:'home'}) 
      
      //命名路由 
      this.$router.push({name:'Detail',params:{id:1}}) 
      
      //携带参数
      this.$router.push({
        path: '/product/edit-basic-info',
        query: { from_type: 'add' }
      })
      
    • this.$router.replace方法

      this.$router.pushthis.$router.replace方法很像,写法是一样的,但是实际的效果是不一样的。push是向history里添加新记录,而replace是直接将当前浏览器history记录替换掉。

      • 用push方法,页面A跳转到页面B,使用浏览器的后退可以回到页面A。
      • 用replace方法,页面1被替换成页面B,使用浏览器的后退,就回不到页面A,只能回到页面B的前一页面。

      在项目中的应用场景常用于权限验证,验证之后不想让用户回退到之前的页面,比如: 购物车页面需要用户登录,如果用户没有登录即跳转到登录页面,登录之后使用replace回到购物车页面,当然也可以使用router.go(-1)方法回退到上一页面。

    1.2 routes:是路由的集合,类型是一个数组,用来配置多个route路由对象。在项目中的应用如下:

    const routes = [
      {
        path: '/login',
        name: 'Login',
        component: AccountLogin,
        hidden: true
      },
      {
        path: '/',
        component: Home,
        redirect: '/product/list',
        meta: {
          // pageTitle: 'xxxxx管理系统'
        },
        children: [
          {
            path: '/product/list',
            name: 'ProductManagement',
            component: ProductManagement,
            redirect: '/product/list',
            meta: {
              title: '产品管理',
              icon: 'iconfont icon-chanpinguanli',
              // pageTitle: 'xxxxx管理系统',
              dropDown: true
            }
        ]
      }
    ]
    

    1.3 route:是路由信息对象,每一个路由都会有一个route对象,是一个局部对象,例如:$route指的就是当前路由对象。route包含path,params,hash,query,fullPath,matched,name等路由信息参数。

    vue-router的这些易混知识点你都掌握了吗 首先简单介绍下常用的路由对象属性,方便之后的应用。在组件内可以通过this.$route(切记切记不是this.$router哦!)进行访问。 \

    • $route.path 类型: string字符串,对应当前路由的路径,总是解析为绝对路径,如 "/shop/layout"
    • $route.params 类型: Object 一个 key/value 对象,包含了动态片段和全匹配片段,如果没有路由参数,就是一个空对象。
    • $route.query 类型: Object 一个 key/value 对象,表示 URL 查询参数。例如,对于路径 /detail?id=1,则有 this.$route.query.id == 1,如果没有查询参数,则是个空对象。
    • $route .name 类型: string字符串, 当前路由的名称,如果有的话。这里建议最好给每个路由对象命名,方便以后编程式导航使用。特别要注意的是name必须唯一!
    • $route.hash 类型: string 当前路由的 hash 值 (带 #) ,如果没有 hash 值,则为空字符串。
    • $route.fullPath 类型: string 完成解析后的 URL,包含查询参数和 hash 的完整路径。
    • $route.matched 类型: Array<RouteRecord> 一个数组,包含当前路由的所有嵌套路径片段的路由记录。路由记录就是 routes 配置数组中的对象副本 (还有在 children 数组)。$route.redirectedFrom 如果存在重定向,即为重定向来源的路由的名字。

    在组件内可通过this.$route 访问 当前路由

    this.$route.path
    this.$route.query
    this.$route.params
    this.$route.meta
    

    2. vue-router传参

    • params

    参数不会显示在URL地址栏中,当用户刷新页面后,params参数就会被清空。只能使用name,不能使用path。在编程式导航中pathparams是不能同时生效的,使用了path,params就会被忽略掉。所以使用对象写法进行params传参时,可以使用path加冒号:,或者通过name和params进行传参。

    // 传递参数
    this.$router.push({
        name:'Detail',
        params:{
            id:1
        }
    })
    this.$router.push({
        path:'/detail',
        params:{id:1} //此时这个params是无效的
    })
    // 接收参数
    let id=this.$route.params.id
    
    • query

    参数会显示在路URl地址栏中,用户刷新页面之后参数也不会丢失,可以使用name,也可以使用path。

    // 传递参数
    this.$router.push({
        name:'Detail',
        query:{
            id:1
        }
    })
    this.$router.push({
        path:'/detail:id',
    })
    this.$router.push({
        path:'/detail',
        query:{
            id:1
        }
    })
    // 接收参数
    let id=this.$route.query.id
    

    3. vue-router响应路由参数的变化

    在用动态路由匹配时,例如从/detail/1到detail/2,两个路由都渲染同一个组件,原来的组件实例会被复用,此时如果想在路由改变时做些什么操作,或者想对参数的变化做出响应的话,我们可以通过监听$route来实现这个需求。

    • 用watch监测
    watch:{
        $route(to,from){
            console.log(to,from)
            // TODO SOMETHING
        }
    }
    
    • 组件内导航钩子函数
    beforeRouteUpdate(to,from,next){
        console.log(to,from,next)
        // TODO SOMETHING
    }
    

    4. beforeRouteEnter与this

    组件的导航守卫中beforeRouteEnter守卫不能通过this访问组件实例,因为守卫在导航确认前被调用,因此即将登场的新组建还没有被创建。可以通过传一个回调给next来访问组件实例,在导航被确认的时候执行回调,并且把组件实例作为回调方法的参数。

    beforeRouteEnter(to, from, next) {
        next(vm => {
          //vm.fromRoute即this.fromRoute
          vm.fromRoute = from
        })
      }
    

    5. 打开新的窗口

    在项目中,我们的应用是一个单页面应用,有时某个页面想要以新窗口的方式打开,我们就可以使用下面的方式实现。

    • 第一种方式
    const { href } = this.$router.resolve({
    path:'/detail'
    query:{id:'1'}
    })
    window.open(href, '_blank')
    
    • 第二种方式
    <router-link target="_blank" :to="{path:'/detail',query:{id:'1'}}">打开新页面</router-link>
    
    • 第三种方式
    <a :href="`http://${domain}`" target="_black">打开新页面</a>
    

    起源地下载网 » vue-router的这些易混知识点你都掌握了吗

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元