最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • Vue Router学习笔记(基础篇)

    正文概述 掘金(蒲月阿七)   2021-02-04   413

    首先,问个问题,你知道web路由是什么吗?
    Web路由: juejin.cn/post/689017…

    好的,如果你已经知道前端路由和后端路由的区别,那就接着往下看吧!

    Vue Router 是 Vue.js 官方的路由管理器。它和 Vue.js 的核心深度集成,让构建单页面应用(SPA)变得易如反掌。

    包含的功能有:

    • 嵌套的路由/视图表
    • 模块化的、基于组件的路由配置
    • 路由参数、查询、通配符
    • 基于 Vue.js 过渡系统的视图过渡效果
    • 细粒度的导航控制
    • 带有自动激活的 CSS class 的链接
    • HTML5 历史模式或 hash 模式,在 IE9 中自动降级
    • 自定义的滚动条行为

    基本使用步骤

    使用 Vue.js ,我们已经可以通过组合组件来组成应用程序,当你要把 Vue Router 添加进来,我们需要做的是,将组件 (components) 映射到路由 (routes),然后告诉 Vue Router 在哪里渲染它们。

    引入相关库函数

    直接下载/CDN

     <!-- 导入 vue 文件,为全局 window 对象挂载 Vue 构造函数 -->
    <script src="/path/to/vue.js"></script>
    <!-- 导入 vue-router 文件,为全局 window 对象挂载 VueRouter 构造函数 -->
    <script src="/path/to/vue-router.js"></script>
    

    NPM安装

    npm install vue-router
    如果在一个模块化工程中使用它,必须要通过 Vue.use() 明确地安装路由功能:

    import Vue from 'vue'
    import VueRouter from 'vue-router'
    
    Vue.use(VueRouter)
    

    添加路由链接

    <!-- router-link 是 vue 中提供的标签,默认会被渲染为 a 标签 --> 
    <!-- to 属性默认会被渲染为 href 属性 -->
    <!-- to 属性的值默认会被渲染为 # 开头的 hash 地址 --> 
    <router-link to="/user">User</router-link>
    <router-link to="/register">Register</router-link>
    

    添加路由填充位

    <!-- 路由填充位(也叫路由占位符) -->
    <!-- 通过路由规则匹配到的组件,将会被渲染到 router-view 所在的位置 --> 
    <router-view></router-view>
    

    定义路由组件

    var User = {
        template: '<div>User</div>'
    }
    var Register = {
        template: '<div>Register</div>'
    }
    

    配置路由规则并创建路由实例

    // 创建路由实例对象
    var router = new VueRouter({
      // routes 是路由规则数组 
      routes: [
        // 每个路由规则都是一个配置对象,其中至少包含 path 和 component 两个属性: 
        // path 表示当前路由规则匹配的 hash 地址
        // component 表示当前路由规则对应要展示的组件
        {path:'/user',component: User},
        {path:'/register',component: Register} 
      ]
    })
    

    把路由挂载到 Vue 根实例中

    new Vue({
      el: '#app',
      // 为了能够让路由规则生效,必须把路由对象挂载到 vue 实例对象上
      router 
    });
    

    通过注入路由器,我们可以在任何组件内通过 this.$router 访问路由器,也可以通过 this.$route 访问当前路由。

    <router-link> 对应的路由匹配成功,将自动设置 class 属性值 .router-link-active

    路由重定向

    用户在访问地址 A 的时候,强制用户跳转到地址 B ,从而展示特定的组件页面;

    通过路由规则的 redirect 属性,指定一个新的路由地址,可以很方便地设置路由的重定向:

    var router = new VueRouter({ 
      routes: [
          // 其中,path 表示需要被重定向的原地址,redirect 表示将要被重定向到的新地址 
          {path:'/', redirect: '/user'},
          {path:'/user',component: User},
          {path:'/register',component: Register}
      ] 
    })
    

    嵌套路由

    • 点击父级路由链接显示模板内容
    • 模板内容中又有子级路由链接
    • 点击子级路由链接显示子级模板内容

    父组件路由模板

    • 父级路由链接
    • 父组件路由填充位
    <p>
      <router-link to="/user">User</router-link> 
      <router-link to="/register">Register</router-link>
    </p> 
    <div>
      <!-- 控制组件的显示位置 -->
      <router-view></router-view>
    </div>
    

    子组件路由模板

    • 子级路由链接
    • 子级路由填充位
    const Register = { 
    	template: `
    	<div>
              <h1>Register 组件</h1>
              <hr/>
              <router-link to="/register/tab1">Tab1</router-link> 
              <router-link to="/register/tab2">Tab2</router-link>
    
              <!-- 子路由填充位置 -->
              <router-view/>
            
    	</div>` 
    }
    

    嵌套路由配置

    • 父级路由通过children属性配置子级路由
    const router = new VueRouter({ 
    	routes: [{ path: '/user', component: User },
    		{
    			path: '/register',
    			component: Register,
    			// 通过 children 属性,为 /register 添加子路由规则 
    			children: 
    			[
    				{ path: '/register/tab1', component: Tab1 },
    				{ path: '/register/tab2', component: Tab2 } 
    			]
    		} 
    	]
    })
    

    动态路由匹配

    思考一下下面的情况

    <!– 有如下 3 个路由链接 -->
    <router-link to="/user/1">User1</router-link> 
    <router-link to="/user/2">User2</router-link> 
    <router-link to="/user/3">User3</router-link>
    
    // 定义如下三个对应的路由规则?
    { path: '/user/1', component: User }
    { path: '/user/2', component: User }
    { path: '/user/3', component: User }
    

    上面的情况就是通过动态路由参数的模式进行路由匹配
    其实可以像下面这样写

    基本用法

    var router = new VueRouter({ 
    	routes: [
    		// 动态路径参数 以冒号开头
    		{ path: '/user/:id', component: User } 
    	]
    })
    
    const User = {
    	// 路由组件中通过$route.params获取路由参数
    	template: '<div>User {{ $route.params.id }}</div>'
    }
    

    响应路由参数的变化

    当使用路由参数时,例如从 /user/foo 导航到 /user/bar,原来的组件实例会被复用。因为两个路由都渲染同个组件,比起销毁再创建,复用则显得更加高效。不过,这也意味着组件的生命周期钩子不会再被调用

    //复用组件时,想对路由参数的变化作出响应的话,你可以简单地 watch (监测变化) $route 对象:
    const User = {
      template: '...',
      watch: {
        $route(to, from) {
          // 对路由变化作出响应...
        }
      }
    }
    
    //或者使用 beforeRouteUpdate 导航守卫:
    const User = {
      template: '...',
      beforeRouteUpdate (to, from, next) {
        // react to route changes...
        // don't forget to call next()
      }
    }
    

    路由组件传递参数

    $route与对应路由形成高度耦合,不够灵活,所以可以使用props将组件和路由解耦。

    • props的值为布尔类型
    const router = new VueRouter({ 
      routes: [
      	// 如果 props 被设置为 true,route.params 将会被设置为组件属性
      	{ path: '/user/:id', component: User, props: true } 
      ]
    })
    const User = {
      props: ['id'], // 使用 props 接收路由参数
      template: '<div>用户ID:{{ id }}</div>' // 使用路由参数
    }
    
    • props的值为对象类型
    const router = new VueRouter({ 
    	routes: [
    		// 如果 props 是一个对象,它会被按原样设置为组件属性
    		{ path: '/user/:id', component: User, props: { uname: 'lisi', age: 12 }} 
        ]
    })
    const User = {
    	props: ['uname', 'age'],
    	template: `<div>用户信息:{{ uname + '---' + age}}</div>`
    }
    
    • props的值为函数类型
    const router = new VueRouter({ 
    	routes: [{path: '/user/:id',
                	component: User,
                	props: route => ({ uname: 'zs', age: 20, id: route.params.id })}]
                    // 如果 props 是一个函数,则这个函数接收 route 对象为自己的形参 
    })
    const User = {
    	props: ['uname', 'age', 'id'],
    	template: `<div>用户信息:{{ uname + '---' + age + '---' + id}}</div>`
    }
    

    捕获所有路由或 404 Not found 路由

    {
      // 会匹配所有路径
      // 通常用于客户端 404 错误
      path: '*'
    }
    {
      // 会匹配以 `/user-` 开头的任意路径
      path: '/user-*'
    }
    

    当使用一个通配符时,$route.params 内会自动添加一个名为 pathMatch 参数。它包含了 URL 通过通配符被匹配的部分。

    // 给出一个路由 { path: '/user-*' }
    this.$router.push('/user-admin')
    this.$route.params.pathMatch // 'admin'
    // 给出一个路由 { path: '*' }
    this.$router.push('/non-existing')
    this.$route.params.pathMatch // '/non-existing'
    

    命名路由

    命名路由的配置规则

    为了更加方便的表示路由的路径,可以给路由规则起一个别名,即为“命名路由”。

    const router = new VueRouter({ 
    	routes: 
    		[{path: '/user/:id',
            // 别名
    		name: 'user',
    		component: User}]
    })
    
    <router-link :to="{ name: 'user', params: { id: 123 }}">User</router-link> 
    
    router.push({ name: 'user', params: { id: 123 }})
    

    编程式导航

    页面导航的两种方式

    • 声明式导航:通过点击链接实现导航的方式,叫做声明式导航

    例如:普通网页中的 <a></a> 链接 或 vue 中的 <router-link></router-link>

    • 编程式导航:通过调用JavaScript形式的API实现导航的方式,叫做编程式导航

    例如:普通网页中的 location.href

    编程式导航基本用法

    常用的编程式导航 API 如下:

    • this.$router.push('hash地址')
    • this.$router.replace()
    • this.$router.go(n)
    const User = {
    	template: '<div><button @click="goRegister">跳转到注册页面</button></div>', 	
    	methods: {
    		goRegister: function(){
    			// 用编程的方式控制路由跳转 
    			this.$router.push('/register');
    		} 
      	}
    }
    

    router.push() [window.history.pushState]

    这个方法会向 history 栈添加一个新的记录,所以,当用户点击浏览器后退按钮时,则回到之前的 URL。

    // 字符串(路径名称)
    router.push('/home')
    // 对象
    router.push({ path: '/home' })
    // 命名的路由(传递参数)
    router.push({ name: '/user', params: { userId: 123 }})
    // 带查询参数,变成 /register?uname=lisi
    router.push({ path: '/register', query: { uname: 'zhangsan' }}
    
    // 注意:如果提供了 path,params 会被忽略
    const userId = '123'
    router.push({ name: 'user', params: { userId }}) // -> /user/123
    router.push({ path: `/user/${userId}` }) // -> /user/123
    // 这里的 params 不生效
    router.push({ path: '/user', params: { userId }}) // -> /user
    

    router.replace() [window.history.replaceState]

    跟 router.push 很像,唯一的不同就是,它不会向 history 添加新记录,而是跟它的方法名一样 —— 替换掉当前的 history 记录。

    router.go(n) [window.history.go]

    这个方法的参数是一个整数,意思是在 history 记录中向前或者后退多少步,类似 window.history.go(n)

    官网网址:https://router.vuejs.org/zh/


    起源地下载网 » Vue Router学习笔记(基础篇)

    常见问题FAQ

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

    发表评论

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

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

    联系作者

    请选择支付方式

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