router_routerlink - CSDN
精华内容
参与话题
  • vue-router 快速入门

    万次阅读 多人点赞 2017-07-27 11:38:46
    vue-router是Vue.js官方的路由插件,它和vue.js是深度集成的,适合用于构建单页面应用。vue的单页面应用是基于路由和组件的,路由用于设定访问路径,并将路径和组件映射起来。传统的页面应用,是用一些超链接来实现...

    vue-router是Vue.js官方的路由插件,它和vue.js是深度集成的,适合用于构建单页面应用。vue的单页面应用是基于路由和组件的,路由用于设定访问路径,并将路径和组件映射起来。传统的页面应用,是用一些超链接来实现页面切换和跳转的。在vue-router单页面应用中,则是路径之间的切换,也就是组件的切换。

    本文将以示例的形式来介绍vue-router的各个特性,一共包含6个示例,每个示例都有乞丐版,前5个示例有皇帝版。
    乞丐版是将所有代码混杂在一起的HTML页面,皇帝版是基于vue-webpack-simple模板构建的。

    第一个单页面应用(01)

    现在我们以一个简单的单页面应用开启vue-router之旅,这个单页面应用有两个路径:/home/about,与这两个路径对应的是两个组件Home和About。

    image

    1. 创建组件

    首先引入vue.js和vue-router.js:

    <script src="js/vue.js"></script>
    <script src="js/vue-router.js"></script>

    然后创建两个组件构造器Home和About:

    var Home = Vue.extend({
        template: '<div><h1>Home</h1><p>{{msg}}</p></div>',
        data: function() {
            return {
                msg: 'Hello, vue router!'
            }
        }
    })
    
    var About = Vue.extend({
        template: '<div><h1>About</h1><p>This is the tutorial about vue-router.</p></div>'
    })

    2. 创建Router

    var router = new VueRouter()

    调用构造器VueRouter,创建一个路由器实例router。

    3. 映射路由

    router.map({
        '/home': { component: Home },
        '/about': { component: About }
    })
    

    调用router的map方法映射路由,每条路由以key-value的形式存在,key是路径,value是组件。
    例如:'/home'是一条路由的key,它表示路径;{component: Home}则表示该条路由映射的组件。

    4. 使用v-link指令

    <div class="list-group">
        <a class="list-group-item" v-link="{ path: '/home'}">Home</a>
        <a class="list-group-item" v-link="{ path: '/about'}">About</a>
    </div>
    

    在a元素上使用v-link指令跳转到指定路径。

    5. 使用<router-view>标签

    <router-view></router-view>

    在页面上使用<router-view></router-view>标签,它用于渲染匹配的组件。

    6. 启动路由

    var App = Vue.extend({})
    router.start(App, '#app')
    

    路由器的运行需要一个根组件,router.start(App, '#app') 表示router会创建一个App实例,并且挂载到#app元素。
    注意:使用vue-router的应用,不需要显式地创建Vue实例,而是调用start方法将根组件挂载到某个元素。

    36

    View Demo

    当你从GitHub上获取到最新的源代码后,如果想运行皇帝版,以demo01为例,在Git Bash下执行以下命令:

    npm run demo01-dev

    image

    然后在浏览器中访问地址http://127.0.0.1:8080

    如果要编译和发布,请在Git Bash下执行以下命令:

    npm run demo01-build

    编写单页面的步骤

    上面的6个步骤,可以说是创建一个单页面应用的基本步骤:

    image

    JavaScript

    1. 创建组件:创建单页面应用需要渲染的组件
    2. 创建路由:创建VueRouter实例
    3. 映射路由:调用VueRouter实例的map方法
    4. 启动路由:调用VueRouter实例的start方法

    HTML

    1. 使用v-link指令
    2. 使用<router-view>标签

    router.redirect

    应用在首次运行时右侧是一片空白,应用通常都会有一个首页,例如:Home页。
    使用router.redirect方法将根路径重定向到/home路径:

    router.redirect({
        '/': '/home'
    })
    

    router.redirect方法用于为路由器定义全局的重定向规则,全局的重定向会在匹配当前路径之前执行。

    执行过程

    当用户点击v-link指令元素时,我们可以大致猜想一下这中间发生了什么事情:

    • vue-router首先会去查找v-link指令的路由映射
    • 然后根据路由映射找到匹配的组件
    • 最后将组件渲染到<router-view>标签

    image

    嵌套路由(02)

    嵌套路由是个常见的需求,假设用户能够通过路径/home/news/home/message访问一些内容,一个路径映射一个组件,访问这两个路径也会分别渲染两个组件。

    image

    实现嵌套路由有两个要点:

    • 在组件内部使用<router-view>标签
    • 在路由器对象中给组件定义子路由

    现在我们就动手实现这个需求。

    组件模板:

    <template id="home">
        <div>
            <h1>Home</h1>
            <p>{{msg}}</p>
        </div>
        <div>
            <ul class="nav nav-tabs">
                <li>
                    <a v-link="{ path: '/home/news'}">News</a>
                </li>
                <li>
                    <a v-link="{ path: '/home/message'}">Messages</a>
                </li>
            </ul>
            <router-view></router-view>
        </div>
    </template>
    
    <template id="news">
        <ul>
            <li>News 01</li>
            <li>News 02</li>
            <li>News 03</li>
        </ul>
    </template>
    <template id="message">
        <ul>
            <li>Message 01</li>
            <li>Message 02</li>
            <li>Message 03</li>
        </ul>
    </template>
    

    组件构造器:

    var Home = Vue.extend({
        template: '#home',
        data: function() {
            return {
                msg: 'Hello, vue router!'
            }
        }
    })
    
    var News = Vue.extend({
        template: '#news'
    })
    
    var Message = Vue.extend({
        template: '#message'
    })

    路由映射:

    router.map({
        '/home': {
            component: Home,
            // 定义子路由
            subRoutes: {
                '/news': {
                    component: News
                },
                '/message': {
                    component: Message
                }
            }
        },
        '/about': {
            component: About
        }
    })

    /home路由下定义了一个subRoutes选项,/news/message是两条子路由,它们分别表示路径/home/news/home/message,这两条路由分别映射组件News和Message。

    该示例运行如下:

    37

    View Demo

    注意:这里有一个概念要区分一下,/home/news/home/message/home路由的子路由,与之对应的News和Message组件并不是Home的子组件。

    具名路径(03)

    在有些情况下,给一条路径加上一个名字能够让我们更方便地进行路径的跳转,尤其是在路径较长的时候。

    我们再追加一个组件NewsDetail,该组件在访问/home/news/detail路径时被渲染,组件模板:

    <template id="newsDetail">
        <div>
            News Detail - {{$route.params.id}} ......
        </div>
    </template>
    

    组件构造器:

    var NewsDetail = Vue.extend({
        template: '#newsDetail'
    })
    

    具名路由映射

    router.map({
        '/home': {
            component: Home,
            subRoutes: {
                '/news': {
                    name: 'news',
                    component: News,
                    subRoutes: {
                        'detail/:id': {
                            name: 'detail',
                            component: NewsDetail
                        }
                    }
                },
                '/message': {
                    component: Message
                }
            }
        },
        '/about': {
            component: About
        }
    })
    

    注意:我们在定义/homes/news/home/news/detail/:id路由时,给该路由指定了name属性。
    /:id是路由参数,例如:如果要查看id = '01'的News详情,那么访问路径是/home/news/detail/01。

    Home组件和News组件模板:

    <template id="home">
        <div>
            <h1>Home</h1>
            <p>{{msg}}</p>
        </div>
        <div>
            <ul class="nav nav-tabs">
                <li>
                    <a v-link="{ name: 'news'}">News</a>
                </li>
                <li>
                    <a v-link="{ path: '/home/message'}">Messages</a>
                </li>
            </ul>
            <router-view></router-view>
        </div>
    </template>
    
    <template id="news">
        <div>
            <ul>
                <li>
                    <a v-link="{ name: 'detail', params: {id: '01'} }">News 01</a>
                </li>
                <li>
                    <a v-link="{ path: '/home/news/detail/02'}">News 02</a>
                </li>
                <li>
                    <a v-link="{ path: '/home/news/detail/03'}">News 03</a>
                </li>
            </ul>
            <div>
                <router-view></router-view>
            </div>
        </div>
    </template>
    

    <a v-link="{ name: 'news'}">News</a><a v-link="{ name: 'detail', params: {id: '01'} }">News 01</a>这两行HTML代码,使用了用了具名路径。

    该示例运行如下:

    image

    View Demo

    v-link指令

    用了这么久的v-link指令,是该介绍一下它了。

    v-link 是一个用来让用户在 vue-router 应用的不同路径间跳转的指令。该指令接受一个 JavaScript 表达式,并会在用户点击元素时用该表达式的值去调用 router.go

    具体来讲,v-link有三种用法:

    <!-- 字面量路径 -->
    <a v-link="'home'">Home</a>
    
    <!-- 效果同上 -->
    <a v-link="{ path: 'home' }">Home</a>
    
    <!-- 具名路径 -->
    <a v-link="{ name: 'detail', params: {id: '01'} }">Home</a>

    v-link 会自动设置 <a> 的 href 属性,你无需使用href来处理浏览器的调整,原因如下:

    • 它在 HTML5 history 模式和 hash 模式下的工作方式相同,所以如果你决定改变模式,或者 IE9 浏览器退化为 hash 模式时,都不需要做任何改变。

    • 在 HTML5 history 模式下,v-link 会监听点击事件,防止浏览器尝试重新加载页面。

    • 在 HTML5 history 模式下使用 root 选项时,不需要在 v-link 的 URL 中包含 root 路径。

    路由对象(04)

    在使用了 vue-router 的应用中,路由对象会被注入每个组件中,赋值为 this.$route ,并且当路由切换时,路由对象会被更新。

    路由对象暴露了以下属性:

    • $route.path 
      字符串,等于当前路由对象的路径,会被解析为绝对路径,如 "/home/news" 。
    • $route.params 
      对象,包含路由中的动态片段和全匹配片段的键值对
    • $route.query 
      对象,包含路由中查询参数的键值对。例如,对于 /home/news/detail/01?favorite=yes ,会得到$route.query.favorite == 'yes' 。
    • $route.router 
      路由规则所属的路由器(以及其所属的组件)。
    • $route.matched 
      数组,包含当前匹配的路径中所包含的所有片段所对应的配置参数对象。
    • $route.name 
      当前路径的名字,如果没有使用具名路径,则名字为空。

    在页面上添加以下代码,可以显示这些路由对象的属性:

    <div>
        <p>当前路径:{{$route.path}}</p>
        <p>当前参数:{{$route.params | json}}</p>
        <p>路由名称:{{$route.name}}</p>
        <p>路由查询参数:{{$route.query | json}}</p>
        <p>路由匹配项:{{$route.matched | json}}</p>
    </div>
    

    $route.path, $route.params, $route.name, $route.query这几个属性很容易理解,看示例就能知道它们代表的含义。

    39

    (由于$route.matched内容较长,所以没有将其显示在画面上)

    这里我要稍微说一下$router.matched属性,它是一个包含性的匹配,它会将嵌套它的父路由都匹配出来。

    例如,/home/news/detail/:id这条路径,它包含3条匹配的路由:

    1. /home/news/detail/:id
    2. /home/news
    3. /home

    另外,带有 v-link 指令的元素,如果 v-link 对应的 URL 匹配当前的路径,该元素会被添加特定的class,该class的默认名称为v-link-active。例如,当我们访问/home/news/detail/03这个URL时,根据匹配规则,会有3个链接被添加v-link-active

    image

    View Demo

    让链接处于活跃状态(05)

    以上画面存在两个问题:

    1. 当用户点击Home链接或About链接后,链接没有显示为选中
    2. 当用户点击News或Message链接后,链接没有显示为选中

    设置activeClass

    第1个问题,可以通过设定v-link指令的activeClass解决。

    <a class="list-group-item" v-link="{ path: '/home', activeClass: 'active'}">Home</a>
    <a class="list-group-item" v-link="{ path: '/about', activeClass: 'active'}">About</a>

    image

    设定了v-link指令的activeClass属性后,默认的v-link-active被新的class取代。

    image

    第2个问题,为v-link指令设定activeClass是不起作用的,因为我们使用的是bootstrap的样式,需要设置a标签的父元素<li>才能让链接看起来处于选中状态,就像下面的代码所展现的:

    <ul class="nav nav-tabs">
        <li class="active">
            <a v-link="{ path: '/home/news'}">News</a>
        </li>
        <li>
            <a v-link="{ path: '/home/message'}">Messages</a>
        </li>
    </ul>

    如何实现这个效果呢?你可能会想到,为Home组件的data选项追加一个currentPath属性,然后使用以下方式绑定class。

    <ul class="nav nav-tabs">
        <li :class="currentPath == '/home/news' ? 'active': ''">
            <a v-link="{ path: '/home/news'}">News</a>
        </li>
        <li :class="currentPath == '/home/message' ? 'active': ''">
            <a v-link="{ path: '/home/message'}">Messages</a>
        </li>
    </ul>
    

    现在又出现了另一个问题,在什么情况下给currentPath赋值呢?

    用户点击v-link的元素时,是路由的切换。
    每个组件都有一个route选项,route选项有一系列钩子函数,在切换路由时会执行这些钩子函数。
    其中一个钩子函数是data钩子函数,它用于加载和设置组件的数据。

    var Home = Vue.extend({
        template: '#home',
        data: function() {
            return {
                msg: 'Hello, vue router!',
                currentPath: ''
            }
        },
        route: {
            data: function(transition){
                transition.next({
                    currentPath: transition.to.path
                })
            }
        }
    })
    

    该示例运行效果如下:

    image

    View Demo

    钩子函数(06)

    路由的切换过程,本质上是执行一系列路由钩子函数,钩子函数总体上分为两大类:

    • 全局的钩子函数
    • 组件的钩子函数

    全局的钩子函数定义在全局的路由对象中,组件的钩子函数则定义在组件的route选项中。

    全局钩子函数

    全局钩子函数有2个:

    • beforeEach:在路由切换开始时调用
    • afterEach:在每次路由切换成功进入激活阶段时被调用

    组件的钩子函数

    组件的钩子函数一共6个:

    • data:可以设置组件的data
    • activate:激活组件
    • deactivate:禁用组件
    • canActivate:组件是否可以被激活
    • canDeactivate:组件是否可以被禁用
    • canReuse:组件是否可以被重用

    切换对象

    每个切换钩子函数都会接受一个 transition 对象作为参数。这个切换对象包含以下函数和方法:

    • transition.to 
      表示将要切换到的路径的路由对象
    • transition.from 
      代表当前路径的路由对象。
    • transition.next() 
      调用此函数处理切换过程的下一步。
    • transition.abort([reason]) 
      调用此函数来终止或者拒绝此次切换。
    • transition.redirect(path) 
      取消当前切换并重定向到另一个路由。

    钩子函数的执行顺序

    全局钩子函数和组件钩子函数加起来一共8个,为了熟练vue router的使用,有必要了解这些钩子函数的执行顺序。

    为了直观地了解这些钩子函数的执行顺序,在画面上追加一个Vue实例:

    var well = new Vue({
        el: '.well',
        data: {
            msg: '',
            color: '#ff0000'
        },
        methods: {
            setColor: function(){
                this.color = '#' + parseInt(Math.random()*256).toString(16)
                            + parseInt(Math.random()*256).toString(16)
                            + parseInt(Math.random()*256).toString(16)
            },
            setColoredMessage: function(msg){
                this.msg +=  '<p style="color: ' + this.color + '">' + msg + '</p>'
            },
            setTitle: function(title){
                this.msg =  '<h2 style="color: #333">' + title + '</h2>'
            }
        }
    })
    

    well实例的HTML:

    <div class="well">
        {{{ msg }}}
    </div>
    

    然后,添加一个RouteHelper函数,用于记录各个钩子函数的执行日志:

    function RouteHelper(name) {
        var route = {
            canReuse: function(transition) {
                well.setColoredMessage('执行组件' + name + '的钩子函数:canReuse')
                return true
            },
            canActivate: function(transition) {
                well.setColoredMessage('执行组件' + name + '的钩子函数:canActivate')
                transition.next()
            },
            activate: function(transition) {
                well.setColoredMessage('执行组件' + name + '的钩子函数:activate')
                transition.next()
            },
            canDeactivate: function(transition) {
                well.setColoredMessage('执行组件' + name + '的钩子函数:canDeactivate')
                transition.next()
            },
            deactivate: function(transition) {
                well.setColoredMessage('执行组件' + name + '的钩子函数:deactivate')
                transition.next()
            },
            data: function(transition) {
                well.setColoredMessage('执行组件' + name + '的钩子函数:data')
                transition.next()
            }
        }
        return route;
    }
    

    最后,将这些钩子函数应用于各个组件:

    var Home = Vue.extend({
        template: '#home',
        data: function() {
            return {
                msg: 'Hello, vue router!',
                path: ''
            }
        },
        route: RouteHelper('Home')
    })
    
    var News = Vue.extend({
        template: '#news',
        route: RouteHelper('News')
    })
    
    var Message = Vue.extend({
        template: '#message',
        route: RouteHelper('Message')
    })
    
    var About = Vue.extend({
        template: '#about',
        route: RouteHelper('About')
    })
    

    我们按照以下步骤做个小实验:

    1. 运行应用(访问/home路径)
    2. 访问/home/news路径
    3. 访问/home/message路径
    4. 访问/about路径

    image

    View Demo

    切换控制流水线

    当用户点击了/home/news链接,然后再点击/home/message链接后,vue-router做了什么事情呢?它执行了一个切换管道

    image

    如何做到这些呢?这个过程包含一些我们必须要做的工作:

    1. 可以重用组件Home,因为重新渲染后,组件Home依然保持不变。

    2. 需要停用并移除组件News。

    3. 启用并激活组件Message。

    4. 在执行步骤2和3之前,需要确保切换效果有效——也就是说,为保证切换中涉及的所有组件都能按照期望的那样被停用/激活。

    切换的各个阶段

    我们可以把路由的切换分为三个阶段:可重用阶段,验证阶段和激活阶段。

    我们以home/news切换到home/message为例来描述各个阶段。
    (以下文字描述参考:http://router.vuejs.org/zh-cn/pipeline/index.html

    1. 可重用阶段

    检查当前的视图结构中是否存在可以重用的组件。这是通过对比两个新的组件树,找出共用的组件,然后检查它们的可重用性(通过 canReuse 选项)。默认情况下, 所有组件都是可重用的,除非是定制过。

    image

    2. 验证阶段

    检查当前的组件是否能够停用以及新组件是否可以被激活。这是通过调用路由配置阶段的canDeactivate 和canActivate 钩子函数来判断的。

    image

    3.激活阶段

    一旦所有的验证钩子函数都被调用而且没有终止切换,切换就可以认定是合法的。路由器则开始禁用当前组件并启用新组件。

    image

    此阶段对应钩子函数的调用顺序和验证阶段相同,其目的是在组件切换真正执行之前提供一个进行清理和准备的机会。界面的更新会等到所有受影响组件的 deactivate 和 activate 钩子函数执行之后才进行。

    data 这个钩子函数会在 activate 之后被调用,或者当前组件组件可以重用时也会被调用。


    展开全文
  • router基本使用

    万次阅读 2018-01-24 21:29:22
    1、vue2中的路由定义层:router-linkto="/goods">商品router-link> 这里用to指向路径表现层 1.1、keep-alive>如果把切换出去的组件保留在内存中,可以保留它的状态或避免重新渲染。为此可以添加一个keep-alive...

    1、vue2中的路由定义层:<router-linkto="/goods">商品</router-link> 这里用to指向路径表现层

    1.1、<keep-alive>如果把切换出去的组件保留在内存中,可以保留它的状态或避免重新渲染。为此可以添加一个keep-alive指令

    <keep-alive><router-view:seller="seller">content</router-view></keep-alive>

    1.2使用router的过程中出现的报错情况 提示 (Unknown custom element: <router-view> - did you register the component corre)出现的问题可能有以下几个情况:

    1.2.1 <router-link to="/goods">商品</router-link> to不能少 不能少

    1.2.2在main.js中   import VueRouter from 'vue-router' 注意大小写的区分

    1.2.3 Vue.use(VueRouter) 当然这句也是不能少滴 因为在一个模块化工程中使用router,必须要通过Vue.use() 明确地安装路由功能

    1.2.4  剩下的就是按照api来写

    const routes = [
          { path:'/goods', component: Goods },
          { path:'/ratings', component: Ratings },
          { path:'/seller', component: Seller }
    ]
    const router = new VueRouter({
      routes
    })

    1.2.5 最后一句

    new Vue({
      el: '#app',
      router ,
      render: h => h(App)

    })

    2.对router的定义与理解

    路由,其实就是指向的意思,当我点击页面上的home按钮时,页面中就要显示home的内容,如果点击页面上的about 按钮,页面中就要显示about 的内容。Home按钮  => home 内容, about按钮 => about 内容,也可以说是一种映射. 所以在页面上有两个部分,一个是点击部分,一个是点击之后,显示内容的部分。 

      点击之后,怎么做到正确的对应,比如,我点击home 按钮,页面中怎么就正好能显示home的内容。这就要在js 文件中配置路由。

      路由中有三个基本的概念 route, routes, router。

        1, route,它是一条路由,由这个英文单词也可以看出来,它是单数, Home按钮  => home内容, 这是一条route,  about按钮 => about 内容, 这是另一条路由。

        2, routes 是一组路由,把上面的每一条路由组合起来,形成一个数组。[{home 按钮 =>home内容 }, { about按钮 => about 内容}]

        3, router 是一个机制,相当于一个管理者,它来管理路由。因为routes 只是定义了一组路由,它放在哪里是静止的,当真正来了请求,怎么办? 就是当用户点击home 按钮的时候,怎么办?这时router 就起作用了,它到routes 中去查找,去找到对应的 home 内容,所以页面中就显示了 home 内容。

        4,客户端中的路由,实际上就是dom 元素的显示和隐藏。当页面中显示home 内容的时候,about 中的内容全部隐藏,反之也是一样。客户端路由有两种实现方式:基于hash 和基于html5 history api.

    vue-router中的路由也是基于上面的内容来实现的

      在vue中实现路由还是相对简单的。因为我们页面中所有内容都是组件化的,我们只要把路径和组件对应起来就可以了,然后在页面中把组件渲染出来。

      1, 页面实现(html模版中)

        在vue-router中, 我们看到它定义了两个标签<router-link> 和<router-view>来对应点击和显示部分。<router-link> 就是定义页面中点击的部分,<router-view> 定义显示部分,就是点击后,区配的内容显示在什么地方。所以 <router-link> 还有一个非常重要的属性 to,定义点击之后,要到哪里去, 如:<router-link  to="/home">Home</router-link>

      2, js 中配置路由

        首先要定义route,  一条路由的实现。它是一个对象,由两个部分组成: path和component.  path 指路径,component 指的是组件。如:{path:’/home’, component: home}

        我们这里有两条路由,组成一个routes: 

    const routes = [
      { path: '/home', component: Home },
      { path: '/about', component: About }
    ]

      最后创建router 对路由进行管理,它是由构造函数 new vueRouter() 创建,接受routes 参数。

    const router = new VueRouter({
          routes // routes: routes 的简写
    })

      配置完成后,把router 实例注入到 vue 根实例中,就可以使用路由了

    const app = new Vue({
      router
    }).$mount('#app')

      执行过程:当用户点击 router-link 标签时,会去寻找它的 to 属性, 它的 to 属性和 js 中配置的路径{ path: '/home', component: Home}  path 一一对应,从而找到了匹配的组件, 最后把组件渲染到 <router-view> 标签所在的地方。所有的这些实现才是基于hash 实现的。

     vue-cli 创建一个项目体验一下, 当然不要忘记安装vue-router

      1, 在src 目录下新建两个组件,home.vue 和 about.vue

    复制代码
    <template>
        <div>
            <h1>home</h1>
            <p>{{msg}}</p>
        </div>
    </template>
    <script>
        export default {
            data () {
                return {
                    msg: "我是home 组件"
                }
            }
        }
    </script>
    复制代码
    复制代码
    <template>
        <div>
            <h1>about</h1>
            <p>{{aboutMsg}}</p>
        </div>
    </template>
    <script>
        export default {
            data () {
                return {
                    aboutMsg: '我是about组件'
                }
            }
        }
    </script>
    复制代码

      2, 在 App.vue中 定义<router-link > 和 </router-view>  

    复制代码
    <template>
      <div id="app">
        <img src="./assets/logo.png">
        <header>
        <!-- router-link 定义点击后导航到哪个路径下 -->
          <router-link to="/home">Home</router-link>
          <router-link to="/about">About</router-link>
        </header>
        <!-- 对应的组件内容渲染到router-view中 -->
        <router-view></router-view>   
      </div>
    </template>
    
    <script>
    export default {
      
    }
    </script>
    复制代码

      3,  在 src目录下再新建一个router.js 定义router, 就是定义 路径到 组件的 映射。

    复制代码
    import Vue from "vue";
    import VueRouter from "vue-router";
    
    // 引入组件
    import home from "./home.vue";
    import about from "./about.vue";
    
    // 要告诉 vue 使用 vueRouter
    Vue.use(VueRouter);
    
    const routes = [
        {
            path:"/home",
            component: home
        },
        {
            path: "/about",
            component: about
        }
    ]
    
    var router =  new VueRouter({
        routes
    })
    export default router;
    复制代码

      4, 把路由注入到根实例中,启动路由。这里其实还有一种方法,就像vuex  store 注入到根实例中一样,我们也可以把vueRouter 直接注入到根实例中。在main.js中引入路由,注入到根实例中。

    复制代码
    import Vue from 'vue'
    import App from './App.vue'
    
    // 引入路由
    import router from "./router.js"    // import router 的router 一定要小写, 不要写成Router, 否则报 can't match的报错
    new Vue({
      el: '#app',
      router,  // 注入到根实例中
      render: h => h(App)
    })
    复制代码

      5, 这时点击页面上的home 和about 可以看到组件来回切换。但是有一个问题,当首次进入页面的时候,页面中并没有显示任何内容。这是因为首次进入页面时,它的路径是 '/',我们并没有给这个路径做相应的配置。一般,页面一加载进来都会显示home页面,我们也要把这个路径指向home组件。但是如果我们写{ path: '/', component: Home },vue 会报错,因为两条路径却指向同一个方向。这怎么办?这需要重定向,所谓重定向,就是重新给它指定一个方向,它本来是访问 / 路径,我们重新指向‘/home’, 它就相当于访问 '/home', 相应地, home组件就会显示到页面上。vueRouter中用 redirect 来定义重定向。

    复制代码
    const routes = [
        {
            path:"/home",
            component: home
        },
        {
            path: "/about",
            component: about
        },
        // 重定向
        {
            path: '/', 
            redirect: '/home' 
        }
    ]
    复制代码

      现在页面正常了,首次进入显示home, 并且点击也可以看到内容的切换。

    6, 最后,我们看一下路由是怎么实现的

      打开浏览器控制台,首先看到 router-link 标签渲染成了 a 标签,to 属性变成了a 标签的 href 属性,这时就明白了点击跳转的意思。router-view 标签渲染成了我们定义的组件,其实它就是一个占位符,它在什么地方,匹配路径的组件就在什么地方,所以 router-link 和router-view 标签一一对应,成对出现。

      这里还看到,当点击Home和About 来回切换时,a 标签有一个样式类 .router-link-active 也在来回切换, 原来这是当router-link 处于选中状态时,vueRouter 会自动添加这个类,因此我们也可以利用这个类来改变选中时的状态,如选中时,让它变成红色。但当设置 .router-link-active {color: red;},它并没有生效,这时还要在类前面加一个a, a.router-link-active {color: red;}, 这样就没有问题了。未处于选中状态的router-link, 我们也想给它更改样式,怎么办? 直接给它添加一个 class 就可以了, <router-link class="red">Home</router-link>

    动态路由

      上面我们定义的路由,都是严格匹配的,只有router-link 中的to属性和 js 中一条路由route中 path 一模一样,才能显示相应的组件component. 但有时现实却不是这样的,当我们去访问网站并登录成功后,它会显示 欢迎你,+ 你的名字。不同的用户登录, 只是显示“你的名字” 部分不同,其它部分是一样的。这就表示,它是一个组件,假设是user组件。不同的用户(就是用户的id不同),它都会导航到同一个user  组件中。这样我们在配置路由的时候,就不能写死, 就是路由中的path属性,不能写死,那要怎么设置? 导航到 user 组件,路径中肯定有user, id 不同,那就给路径一个动态部分来匹配不同的id.  在vue-router中,动态部分 以 : 开头,那么路径就变成了 /user/:id, 这条路由就可以这么写:  { path:"/user/:id", component: user }.

      我们定义一个user组件(自己随便写一个就好了),页面中再添加两个router-link 用于导航, 最后router.js中添加路由配置,来体验一下

      app.vue 中添加两个router-link:

    复制代码
    <template>
      <div id="app">
        <img src="./assets/logo.png">
        <header>
          <router-link to="/home">Home</router-link>
          <router-link to="/about">About</router-link>
         <!--  增加两个到user组件的导航,可以看到这里使用了不同的to属性 -->
          <router-link to="/user/123">User123</router-link>
          <router-link to="/user/456">User456</router-link>
        </header>
        <router-view></router-view>   
      </div>
    </template>
    复制代码

    router.js 配置user动态路由:

    复制代码
    const routes = [
        {
            path:"/home",
            component: home
        },
        {
            path: "/about",
            component: about
        },
        /*新增user路径,配置了动态的id*/
        {
            path: "/user/:id",
            component: user
        },
        {
            path: '/', 
            redirect: '/home' 
        }
    ]
    复制代码

      user组件

    复制代码
    <template>
        <div>
            <h1>User</h1>
            <div>我是user组件</div>
        </div>
    </template>
    <script>
        export default {
    
        }
    </script>
    复制代码

      这时在页面中点击user123 和user456, 可以看到它们都导航到user组件,配置正确。   

      在动态路由中,怎么获取到动态部分? 因为在组件中是可以显示不同部分的,就是上面提到的“你的名字”。其实,当整个vue-router 注入到根实例后,在组件的内部,可以通过this.$route 来获取到 router 实例。它有一个params 属性,就是来获得这个动态部分的。它是一个对象,属性名,就是路径中定义的动态部分 id, 属性值就是router-link中to 属性中的动态部分,如123。使用vuex时,组件中想要获取到state 中的状态,是用computed 属性,在这里也是一样,在组件中,定义一个computed 属性dynamicSegment, user 组件修改如下:

    复制代码
    <template>
        <div>
            <h1>User</h1>
            <div>我是user组件, 动态部分是{{dynamicSegment}}</div>
        </div>
    </template>
    <script>
        export default {
            computed: {
                dynamicSegment () {
                    return this.$route.params.id
                }
            }
        }
    </script>
    复制代码

      这里还有最后一个问题,就是动态路由在来回切换时,由于它们都是指向同一组件,vue不会销毁再创建这个组件,而是复用这个组件,就是当第一次点击(如:user123)的时候,vue 把对应的组件渲染出来,但在user123, user456点击来回切换的时候,这个组件就不会发生变化了,组件的生命周期不管用了。这时如果想要在组件来回切换的时候做点事情,那么只能在组件内部(user.vue中)利用watch 来监听$route 的变化。把上面的代码用监听$route 实现

    复制代码
    <script>
        export default {
            data () {
                return {
                    dynamicSegment: ''
                }
            },
            watch: {
                $route (to,from){
                    // to表示的是你要去的那个组件,from 表示的是你从哪个组件过来的,它们是两个对象,你可以把它打印出来,它们也有一个param 属性
                    console.log(to);
                    console.log(from);
                    this.dynamicSegment = to.params.id
                }
            }
        }
    </script>
    复制代码

    嵌套路由

      嵌套路由,主要是由我们的页面结构所决定的。当我们进入到home页面的时候,它下面还有分类,如手机系列,平板系列,电脑系列。当我们点击各个分类的时候,它还是需要路由到各个部分,如点击手机,它肯定到对应到手机的部分。

      在路由的设计上,首先进入到 home ,然后才能进入到phone, tablet, computer.  Phone, tablet, compute 就相当于进入到了home的子元素。所以vue  提供了childrens 属性,它也是一组路由,相当于我们所写的routes。

      首先,在home页面上定义三个router-link 标签用于导航,然后再定义一个router-view标签,用于渲染对应的组件。router-link 和router-view 标签要一一对应。home.vue 组件修改如下:

    复制代码
    <template>
        <div>
            <h1>home</h1>
    <!-- router-link 的to属性要注意,路由是先进入到home,然后才进入相应的子路由如 phone,所以书写时要把 home 带上 -->
            <p>
                <router-link to="/home/phone">手机</router-link>
                <router-link to="/home/tablet">平板</router-link>
                <router-link to="/home/computer">电脑</router-link>
            </p>
            <router-view></router-view>
        </div>
    </template>
    复制代码

    router.js 配置路由,修改如下:

    复制代码
    const routes = [
        {
            path:"/home",
         // 下面这个属性也不少,因为,我们是先进入home页面,才能进入子路由
            component: home,
         // 子路由
            children: [
                {
                    path: "phone",
                    component: phone
                },
                {
                    path: "tablet",
                    component: tablet
                },
                {
                    path: "computer",
                    component: computer
                }
            ]
        },
        {
            path: "/about",
            component: about
        },
        {
            path: "/user/:id",
            component: user
        },
        {
            path: '/', 
            redirect: '/home' 
        }
    ]
    复制代码

      这时当我们点击home 时,它下面出现手机等字样,但没有任何对应的组件进行显示,这通常不是我们想要的。要想点击home时,要想渲染相对应的子组件,那还需要配置一条路由。当进入到home 时,它在children中对应的路由path 是空 ‘’,完整的childrens 如下:

    复制代码
    children: [
        {
            path: "phone",
            component: phone
        },
        {
            path: "tablet",
            component: tablet
        },
        {
            path: "computer",
            component: computer
        },
        // 当进入到home时,下面的组件显示
        {
            path: "",
            component: phone
        }
    ]
    复制代码

    命名路由

      命名路由,很简单,因为根据名字就可以知道,这个路由有一个名字,那就直接给这个路由加一个name 属性,就可以了。 给user 路由加一个name 属性:

    {
            path: "/user/:id",
            name: "user",
            component: user
    }

      命名路由的使用, 在router-link 中to 属性就可以使用对象了, 

     <router-link to="/user/123">User123</router-link> // 和下面等价 
     <router-link :to="{ name: 'user', params: { userId: 123 }}">User</router-link>   // 当使用对象作为路由的时候,to前面要加一个冒号,表示绑定

      编程式导航:这主要应用到按钮点击上。当点击按钮的时候,跳转另一个组件, 这只能用代码,调用rourter.push() 方法。 当们把router 注入到根实例中后,组件中通过 this.$router 可以获取到router, 所以在组件中使用

    this.$router.push("home"), 就可以跳转到home界面


    展开全文
  • vue-router 基本使用

    万次阅读 多人点赞 2019-06-12 15:57:54
    vue-router 基本使用  路由,其实就是指向的意思,当我点击页面上的home按钮时,页面中就要显示home的内容,如果点击页面上的about 按钮,页面中就要显示about 的内容。Home按钮 => home 内容, about按钮 =>...

    vue-router 基本使用

      路由,其实就是指向的意思,当我点击页面上的home按钮时,页面中就要显示home的内容,如果点击页面上的about 按钮,页面中就要显示about 的内容。Home按钮  => home 内容, about按钮 => about 内容,也可以说是一种映射. 所以在页面上有两个部分,一个是点击部分,一个是点击之后,显示内容的部分。 

      点击之后,怎么做到正确的对应,比如,我点击home 按钮,页面中怎么就正好能显示home的内容。这就要在js 文件中配置路由。

      路由中有三个基本的概念 route, routes, router。

        1, route,它是一条路由,由这个英文单词也可以看出来,它是单数, Home按钮  => home内容, 这是一条route,  about按钮 => about 内容, 这是另一条路由。

        2, routes 是一组路由,把上面的每一条路由组合起来,形成一个数组。[{home 按钮 =>home内容 }, { about按钮 => about 内容}]

        3, router 是一个机制,相当于一个管理者,它来管理路由。因为routes 只是定义了一组路由,它放在哪里是静止的,当真正来了请求,怎么办? 就是当用户点击home 按钮的时候,怎么办?这时router 就起作用了,它到routes 中去查找,去找到对应的 home 内容,所以页面中就显示了 home 内容。

        4,客户端中的路由,实际上就是dom 元素的显示和隐藏。当页面中显示home 内容的时候,about 中的内容全部隐藏,反之也是一样。客户端路由有两种实现方式:基于hash 和基于html5 history api.

      vue-router中的路由也是基于上面的内容来实现的

      在vue中实现路由还是相对简单的。因为我们页面中所有内容都是组件化的,我们只要把路径和组件对应起来就可以了,然后在页面中把组件渲染出来。

      1, 页面实现(html模版中)

        在vue-router中, 我们看到它定义了两个标签<router-link> 和<router-view>来对应点击和显示部分。<router-link> 就是定义页面中点击的部分,<router-view> 定义显示部分,就是点击后,区配的内容显示在什么地方。所以 <router-link> 还有一个非常重要的属性 to,定义点击之后,要到哪里去, 如:<router-link  to="/home">Home</router-link>

      2, js 中配置路由

        首先要定义route,  一条路由的实现。它是一个对象,由两个部分组成: path和component.  path 指路径,component 指的是组件。如:{path:’/home’, component: home}

        我们这里有两条路由,组成一个routes: 

    const routes = [
      { path: '/home', component: Home },
      { path: '/about', component: About }
    ]

      最后创建router 对路由进行管理,它是由构造函数 new vueRouter() 创建,接受routes 参数。

    const router = new VueRouter({
          routes // routes: routes 的简写
    })

      配置完成后,把router 实例注入到 vue 根实例中,就可以使用路由了

    const app = new Vue({
      router
    }).$mount('#app')

      执行过程:当用户点击 router-link 标签时,会去寻找它的 to 属性, 它的 to 属性和 js 中配置的路径{ path: '/home', component: Home}  path 一一对应,从而找到了匹配的组件, 最后把组件渲染到 <router-view> 标签所在的地方。所有的这些实现才是基于hash 实现的。

     vue-cli 创建一个项目体验一下, 当然不要忘记安装vue-router

      1, 在src 目录下新建两个组件,home.vue 和 about.vue

     

    <template>
        <div>
            <h1>home</h1>
            <p>{{msg}}</p>
        </div>
    </template>
    <script>
        export default {
            data () {
                return {
                    msg: "我是home 组件"
                }
            }
        }
    </script>

     

     

    <template>
        <div>
            <h1>about</h1>
            <p>{{aboutMsg}}</p>
        </div>
    </template>
    <script>
        export default {
            data () {
                return {
                    aboutMsg: '我是about组件'
                }
            }
        }
    </script>

     

      2, 在 App.vue中 定义<router-link > 和 </router-view>  

     

    <template>
      <div id="app">
        <img src="./assets/logo.png">
        <header>
        <!-- router-link 定义点击后导航到哪个路径下 -->
          <router-link to="/home">Home</router-link>
          <router-link to="/about">About</router-link>
        </header>
        <!-- 对应的组件内容渲染到router-view中 -->
        <router-view></router-view>   
      </div>
    </template>
    
    <script>
    export default {
      
    }
    </script>

     

      3,  在 src目录下再新建一个router.js 定义router, 就是定义 路径到 组件的 映射。

     

    import Vue from "vue";
    import VueRouter from "vue-router";
    
    // 引入组件
    import home from "./home.vue";
    import about from "./about.vue";
    
    // 要告诉 vue 使用 vueRouter
    Vue.use(VueRouter);
    
    const routes = [
        {
            path:"/home",
            component: home
        },
        {
            path: "/about",
            component: about
        }
    ]
    
    var router =  new VueRouter({
        routes
    })
    export default router;

     

      4, 把路由注入到根实例中,启动路由。这里其实还有一种方法,就像vuex  store 注入到根实例中一样,我们也可以把vueRouter 直接注入到根实例中。在main.js中引入路由,注入到根实例中。

     

    import Vue from 'vue'
    import App from './App.vue'
    
    // 引入路由
    import router from "./router.js"    // import router 的router 一定要小写, 不要写成Router, 否则报 can't match的报错
    new Vue({
      el: '#app',
      router,  // 注入到根实例中
      render: h => h(App)
    })

     

      5, 这时点击页面上的home 和about 可以看到组件来回切换。但是有一个问题,当首次进入页面的时候,页面中并没有显示任何内容。这是因为首次进入页面时,它的路径是 '/',我们并没有给这个路径做相应的配置。一般,页面一加载进来都会显示home页面,我们也要把这个路径指向home组件。但是如果我们写{ path: '/', component: Home },vue 会报错,因为两条路径却指向同一个方向。这怎么办?这需要重定向,所谓重定向,就是重新给它指定一个方向,它本来是访问 / 路径,我们重新指向‘/home’, 它就相当于访问 '/home', 相应地, home组件就会显示到页面上。vueRouter中用 redirect 来定义重定向。

     

    const routes = [
        {
            path:"/home",
            component: home
        },
        {
            path: "/about",
            component: about
        },
        // 重定向
        {
            path: '/', 
            redirect: '/home' 
        }
    ]

     

      现在页面正常了,首次进入显示home, 并且点击也可以看到内容的切换。

    6, 最后,我们看一下路由是怎么实现的

      打开浏览器控制台,首先看到 router-link 标签渲染成了 a 标签,to 属性变成了a 标签的 href 属性,这时就明白了点击跳转的意思。router-view 标签渲染成了我们定义的组件,其实它就是一个占位符,它在什么地方,匹配路径的组件就在什么地方,所以 router-link 和router-view 标签一一对应,成对出现。

      这里还看到,当点击Home和About 来回切换时,a 标签有一个样式类 .router-link-active 也在来回切换, 原来这是当router-link 处于选中状态时,vueRouter 会自动添加这个类,因此我们也可以利用这个类来改变选中时的状态,如选中时,让它变成红色。但当设置 .router-link-active {color: red;},它并没有生效,这时还要在类前面加一个a, a.router-link-active {color: red;}, 这样就没有问题了。未处于选中状态的router-link, 我们也想给它更改样式,怎么办? 直接给它添加一个 class 就可以了, <router-link class="red">Home</router-link>

    动态路由

      上面我们定义的路由,都是严格匹配的,只有router-link 中的to属性和 js 中一条路由route中 path 一模一样,才能显示相应的组件component. 但有时现实却不是这样的,当我们去访问网站并登录成功后,它会显示 欢迎你,+ 你的名字。不同的用户登录, 只是显示“你的名字” 部分不同,其它部分是一样的。这就表示,它是一个组件,假设是user组件。不同的用户(就是用户的id不同),它都会导航到同一个user  组件中。这样我们在配置路由的时候,就不能写死, 就是路由中的path属性,不能写死,那要怎么设置? 导航到 user 组件,路径中肯定有user, id 不同,那就给路径一个动态部分来匹配不同的id.  在vue-router中,动态部分 以 : 开头,那么路径就变成了 /user/:id, 这条路由就可以这么写:  { path:"/user/:id", component: user }.

      我们定义一个user组件(自己随便写一个就好了),页面中再添加两个router-link 用于导航, 最后router.js中添加路由配置,来体验一下

      app.vue 中添加两个router-link:

     

    <template>
      <div id="app">
        <img src="./assets/logo.png">
        <header>
          <router-link to="/home">Home</router-link>
          <router-link to="/about">About</router-link>
         <!--  增加两个到user组件的导航,可以看到这里使用了不同的to属性 -->
          <router-link to="/user/123">User123</router-link>
          <router-link to="/user/456">User456</router-link>
        </header>
        <router-view></router-view>   
      </div>
    </template>

     

    router.js 配置user动态路由:

     

    const routes = [
        {
            path:"/home",
            component: home
        },
        {
            path: "/about",
            component: about
        },
        /*新增user路径,配置了动态的id*/
        {
            path: "/user/:id",
            component: user
        },
        {
            path: '/', 
            redirect: '/home' 
        }
    ]

     

      user组件

     

    <template>
        <div>
            <h1>User</h1>
            <div>我是user组件</div>
        </div>
    </template>
    <script>
        export default {
    
        }
    </script>

     

      这时在页面中点击user123 和user456, 可以看到它们都导航到user组件,配置正确。   

      在动态路由中,怎么获取到动态部分? 因为在组件中是可以显示不同部分的,就是上面提到的“你的名字”。其实,当整个vue-router 注入到根实例后,在组件的内部,可以通过this.$route 来获取到 router 实例。它有一个params 属性,就是来获得这个动态部分的。它是一个对象,属性名,就是路径中定义的动态部分 id, 属性值就是router-link中to 属性中的动态部分,如123。使用vuex时,组件中想要获取到state 中的状态,是用computed 属性,在这里也是一样,在组件中,定义一个computed 属性dynamicSegment, user 组件修改如下:

     

    <template>
        <div>
            <h1>User</h1>
            <div>我是user组件, 动态部分是{{dynamicSegment}}</div>
        </div>
    </template>
    <script>
        export default {
            computed: {
                dynamicSegment () {
                    return this.$route.params.id
                }
            }
        }
    </script>

     

      这里还有最后一个问题,就是动态路由在来回切换时,由于它们都是指向同一组件,vue不会销毁再创建这个组件,而是复用这个组件,就是当第一次点击(如:user123)的时候,vue 把对应的组件渲染出来,但在user123, user456点击来回切换的时候,这个组件就不会发生变化了,组件的生命周期不管用了。这时如果想要在组件来回切换的时候做点事情,那么只能在组件内部(user.vue中)利用watch 来监听$route 的变化。把上面的代码用监听$route 实现

     

    <script>
        export default {
            data () {
                return {
                    dynamicSegment: ''
                }
            },
            watch: {
                $route (to,from){
                    // to表示的是你要去的那个组件,from 表示的是你从哪个组件过来的,它们是两个对象,你可以把它打印出来,它们也有一个param 属性
                    console.log(to);
                    console.log(from);
                    this.dynamicSegment = to.params.id
                }
            }
        }
    </script>

     

    嵌套路由

      嵌套路由,主要是由我们的页面结构所决定的。当我们进入到home页面的时候,它下面还有分类,如手机系列,平板系列,电脑系列。当我们点击各个分类的时候,它还是需要路由到各个部分,如点击手机,它肯定到对应到手机的部分。

      在路由的设计上,首先进入到 home ,然后才能进入到phone, tablet, computer.  Phone, tablet, compute 就相当于进入到了home的子元素。所以vue  提供了childrens 属性,它也是一组路由,相当于我们所写的routes。

      首先,在home页面上定义三个router-link 标签用于导航,然后再定义一个router-view标签,用于渲染对应的组件。router-link 和router-view 标签要一一对应。home.vue 组件修改如下:

     

    <template>
        <div>
            <h1>home</h1>
    <!-- router-link 的to属性要注意,路由是先进入到home,然后才进入相应的子路由如 phone,所以书写时要把 home 带上 -->
            <p>
                <router-link to="/home/phone">手机</router-link>
                <router-link to="/home/tablet">平板</router-link>
                <router-link to="/home/computer">电脑</router-link>
            </p>
            <router-view></router-view>
        </div>
    </template>

     

    router.js 配置路由,修改如下:

     

    const routes = [
        {
            path:"/home",
         // 下面这个属性也不少,因为,我们是先进入home页面,才能进入子路由
            component: home,
         // 子路由
            children: [
                {
                    path: "phone",
                    component: phone
                },
                {
                    path: "tablet",
                    component: tablet
                },
                {
                    path: "computer",
                    component: computer
                }
            ]
        },
        {
            path: "/about",
            component: about
        },
        {
            path: "/user/:id",
            component: user
        },
        {
            path: '/', 
            redirect: '/home' 
        }
    ]

     

      这时当我们点击home 时,它下面出现手机等字样,但没有任何对应的组件进行显示,这通常不是我们想要的。要想点击home时,要想渲染相对应的子组件,那还需要配置一条路由。当进入到home 时,它在children中对应的路由path 是空 ‘’,完整的childrens 如下:

     

    children: [
        {
            path: "phone",
            component: phone
        },
        {
            path: "tablet",
            component: tablet
        },
        {
            path: "computer",
            component: computer
        },
        // 当进入到home时,下面的组件显示
        {
            path: "",
            component: phone
        }
    ]

     

    命名路由

      命名路由,很简单,因为根据名字就可以知道,这个路由有一个名字,那就直接给这个路由加一个name 属性,就可以了。 给user 路由加一个name 属性:

    {
            path: "/user/:id",
            name: "user",
            component: user
    }

      命名路由的使用, 在router-link 中to 属性就可以使用对象了, 

     <router-link to="/user/123">User123</router-link> // 和下面等价 
     <router-link :to="{ name: 'user', params: { userId: 123 }}">User</router-link>   // 当使用对象作为路由的时候,to前面要加一个冒号,表示绑定

      编程式导航:这主要应用到按钮点击上。当点击按钮的时候,跳转另一个组件, 这只能用代码,调用rourter.push() 方法。 当们把router 注入到根实例中后,组件中通过 this.$router 可以获取到router, 所以在组件中使用

    this.$router.push("home"), 就可以跳转到home界面

    转自https://www.cnblogs.com/SamWeb/p/6610733.html

    展开全文
  • $router和$route的区别

    千次阅读 2019-02-13 11:04:20
    $router是一个VueRouter的实例 可以导航到不同的路由里 $route是$router跳转到的当前一个对象,里面包含该对象的path、query、name 、params   用法 : this.$router.push() 跳转到指定的url 会向history栈添加...

    $router是一个VueRouter的实例 可以导航到不同的路由里

    $route是$router跳转到的当前一个对象,里面包含该对象的path、query、name 、params

     

    用法 : this.$router.push()  跳转到指定的url 会向history栈添加一个记录 点击后退会返回上一页面

    1、this.$router.push({path:'/detail',query:{}})    this.$router.push('/detail')

    使用当前的query  this.$route.query

    2、this.$router.push({name:'detail',params:{}})

    使用当前的params this.$route.params

     

    this.$router.replace() 跳转到指定的url 不会向history栈添加一个记录 点击后退会返回上上一页面 上一个记录是不存在的

     

    this.$router.go(n) 向前或向后跳转多少个页面(类似于 window.history.go())

    展开全文
  • Vue学习笔记——Vue-router

    万次阅读 多人点赞 2019-03-07 22:34:49
    第1节:Vue-router入门 1、解读router/index.js文件 import Vue from 'vue' //引入Vue import Router from 'vue-router' //引入vue-router import Hello from '@/components/Hello' //引入根目录下的Hello.vue...
  • Router小结

    2018-05-29 18:35:20
    Neutron的Router模型中,蕴含着三种路由:直连路由、默认静态路由和静态路由。前两种路由不需要显示地增加路由表项,也不会体现在路由表(routers)中,当增加一个Port时(add_router_interface),Neutron会自动...
  • vue $router和$route的区别

    万次阅读 多人点赞 2018-08-14 23:46:00
    router为VueRouter的实例,相当于一个全局的路由器对象,里面含有很多属性和子对象,例如history对象。。。经常用的跳转链接就可以用this.$router.push,和router-link跳转一样。。。 this.$router.push会往history...
  • this.$router.push、replace、go的区别

    万次阅读 多人点赞 2018-03-15 11:05:43
    1.this.$router.push()描述:跳转到不同的url,但这个方法回向history栈添加一个记录,点击后退会返回到上一个页面。用法:2.this.$router.replace()描述:同样是跳转到指定的url,但是这个方法不会向history里面...
  • vue addRoutes不生效问题

    千次阅读 2019-02-23 17:01:03
    1、在addroutes前,使用router.options.routes=XXXXX的方法手动添加 2、使用作者的方法,在store里维护一个routes对象,然后使用这个对象遍历生成侧面导航栏 router.options.routes = getRouter; router.addRoutes...
  • vue-router传递参数的几种方式

    万次阅读 多人点赞 2018-07-06 16:24:29
    vue-router传递参数分为两大类编程式的导航 router.push声明式的导航 &lt;router-link&gt;编程式的导航 router.push编程式导航传递参数有两种类型:字符串、对象。字符串字符串的方式是直接将路由地址以字符...
  • react-router和react-router-dom的区别

    万次阅读 2018-06-19 20:04:39
    转载自:react-router和react-router-dom的区别react-router-v4,我称之为“第四代react-router”,react-router和react-router-dom的区别是什么呢?为什么有时候我们看到如下的写法:写法1:import {Swtich, Route, ...
  • router.go(n) 这个方法的参数是一个整数,意思是在 history 记录中向前或者后退多少步,类似 window.history.go(n) router.push(location) 想要导航到不同的 URL,则使用 router.push 方法。这个方法会向 history...
  • router-view 的理解

    万次阅读 2018-02-16 23:48:25
    你可以 router-view 当做是一个容器,它渲染的组件是你使用 vue-router 指定的。比如:视图层:&lt;div id="app"&gt; &lt;router-view&gt;&lt;/router-view&gt; &lt;/div&...
  • 路由控制配置router-id命令解析

    千次阅读 2018-12-20 08:30:53
    router-id命令 1.命令功能 router-id命令用来配置 RouterID。 undo router-id命令用来恢复缺省配置 。 缺省情况下,BGP没有配置 Router ID,直接使用通过 router id命令为路由管理配置的RouterID。 2.命令格式 router-...
  • 1.vue初学遇到问题一 main.js没有引入import router from './router'导致报错 vue router undefined
  • this.$router.push不起作用(this指向错误) 用that提前代替this 此时可以正常使用
  • mysql Router的通俗解释,他有什么用了,用来干什么了,求各位大神指点
  • 1,除了app.vue中的router-view之外,还有其他的嵌套在router-view中的router-view视图,子路由写在router.js children中 app.vue &lt;template&gt; &lt;div id="app"&gt; &lt;...
  • Vue中用this.$router传递参数与取值

    万次阅读 多人点赞 2018-06-14 16:59:09
    在Vue中使用this.$router传递参数有两种方式:第一种传递参数 -- this.$router.push({path: ' 路由 ', query: {key: value}})参数取值 -- this.$route.query.key使用这种方式,传递参数会拼接在路由后面,出现在...
  • this.$router.push 跳转到指定url路径,并想history栈中添加一个记录,点击后退会返回到上一个页面 // 字符串 this.$router.push('index') // 对象 this.$router.push({path: 'login-pw'}) // 带参数 this.$...
1 2 3 4 5 ... 20
收藏数 220,364
精华内容 88,145
关键字:

router