vue-router

2 篇文章 0 订阅
案例内容:
1.vue-router,cnpm i 
2.routes.js静态路由表的创建,数组,进行接口暴露
3.main.js里面引入VueRouter,使用VueRouter,引入静态路由表,然后new VueRouter实例,最后需要将router放置到Vue的实例里;
4.现在是手动链接模式,用a标签也是可以进行页面的切换的,但是感觉整个页面在刷新,因为我可以设置router的mode,可以为hash/history
如果为hash模式,用a链接也不会进行整体刷新,用history就会刷新;
4.1 嵌套路由通过children来实现操作,页面里需要进行router-view的渲染显示;
5.用router-link实现页面的跳转,并且无刷新,可以设置router-link的tag等属性,以及active-class高亮显示,需要通过exact将首页进行排除;
6.可以设置/:id进行参数传递操作,通过this.$route.params.id进行数据的获取,但是多个传递以后发现id并不变化,需要通过对$route进行
watch监控来实现id的变化操作;
7.可以通过this.$router.push进行js的页面跳转操作;
8.可以通过字符串拼接的方式进行页面跳转,但是发现这样好烦,可以设置路由的name进行跳转操作,方便很多
9.header-top,header-bottom是需要将路由里的component转化成components进行相关的设置,并且可以设置default默认组件的显示;
10.进行name跳转的时候可以设置params/query/hash值,然后如果设置hash值可以通过设置id对象名称,再加上scrollBehavior来实现页面位置
的定位操作
11.transition不光可以对component动态组件进行动画的操作,也可以对router-view进行动画的切换;
12.beforeRouterEnter,beforeRouterLeave,router.beforeEach,beforeEnter
13.可以利用resolve进行模块的异步加载操作;
案例环境
vue-cli环境下
1.下载npm i vue-router -S
2.配置静态路由routes.js
1.创建routes.js
    在main.js的同级目录下创建一个routes.js
在routes.js中
2.引入模块
    import Home from './components/Home.vue';
    import User from './components/user/User.vue';
3.定义路由并暴露接口
    export const routes = [
        {path:'/',component:Home,name:'home'},//name给路由设置名字,为了方便router-link的时候不用拼接字符串,方便些
        {path:'/user',component:User,children:[// /user      user下的模块
            {path:"",component:UserStart},// /user/
            {path:":id",component:UserDetail},// /user/:id
            {path:":id/edit",component:UserEdit,name:'userEdit'}// /user/:id/edit
        ]}
]
    
    Notice:url设参(/:id)
    接参:在对应的component后的.vue中,本处为User.vue里
3.使用
在main.js中
3.1引用下载的VueRouter和配置的路由(routes.js)
    import VueRouter from 'vue-router';//1.引用路由模块
    import {routes} from './routes';//3.引用路由配置变量
3.2使用
    Vue.use(VueRouter);//2.
3.3创建router实例,然后传routes配置参数
    const router=new VueRouter({//4.创建实例
    routes//routes:routes的简写  //5.将路由变量实例化成路由对象
    })
3.4在new Vue中实例化router
    new Vue({
      el: '#app',
      router,
      render: h => h(App)
    })
4.在app.vue里的html里显示路由
<router-view></router-view>
5.查看网页
http://localhost:8080
http://localhost:8080/#/user
Router构造配置mode
mode:"history"/"hash"(浏览器环境)/"abstract"(Node.js 环境)

history: 依赖 HTML5 History API 和服务器配置,可以去掉url地址中的#。URL 就像正常的 url,例如 http://localhost:8080.com/user/id
不过这种模式要玩好,还需要后台配置支持。因为我们的应用是个单页客户端应用,如果后台没有正确的配置,当用户在浏览器直接访问 http://localhost:8080.com/user/id 就会返回 404,这就不好看了。
所以呢,你要在服务端增加一个覆盖所有情况的候选资源:如果 URL 匹配不到任何静态资源,则应该返回同一个 index.html 页面,这个页面就是你 app 依赖的页面。
在newVueRouter中使用
例如:const router=new VueRouter({//4.创建实例
  routes,//routes:routes的简写  //5.将路由变量实例化成路由对象
  mode:'history'
})

hash: 为默认值。 使用 URL hash 值来作路由。支持所有浏览器,包括不支持 HTML5 History Api 的浏览器。

abstract: 支持所有 JavaScript 运行环境,如 Node.js 服务器端。如果发现没有浏览器的 API,路由会自动强制进入这个模式。
传参接参

node.js
http://blog.csdn.net/dlmmu/article/details/61214057
vue
http://www.jb51.net/article/123456.htm
http://www.jianshu.com/p/8013d8d37bd0

1.url设参在route.js中(/:id)
    export const routes = [
    {path:'/',component:Home},
    {path:'/user/:id',component:User}
    ]
2.接参:在对应的component后的.vue中,本处为User.vue里
    export default{
        data(){
          return{
            id:this.$route.params.id//有一个需要传值的Tab栏
          }
        },
       //监听$router的变化
       watch:{//多个需要传值的Tab栏
          '$route'(to,from){
            this.id = to.params.id;
          }
        }
      }
r o u t e 与 route与 routerouter的区别
$route指的是当前的这个路由
$router指的是整个路由的对象
点击按钮回到首页
在button上调用gotoHome方法
methods:{
  gotoHome(){
    this.$router.push({path:"/"})//path里的路径可以变成任何想要跳转到的路径
  }
}
点击跳转到指定模块
1.在path后加一个name(route.js)
//定义了一个静态路由并暴露出去
    export const routes = [
        {path:'/',component:Home,name:'home'},//name给路由设置名字,为了方便router-link的时候不用拼接字符串,方便些
        {path:'/user',component:User,
             children:[// /user      user下的模块
            	 {path:"",component:UserStart},// /user/
           		 {path:":id",component:UserDetail},// /user/:id
           		 {path:":id/edit",component:UserEdit,name:'userEdit'}// /user/:id/edit
        ]}
    ]
2.在对应的.vue中
    <router-link tag="button" class="btn btn-primary" :to="{name:'userEdit',params:{id:$route.params.id},query:{local:'zh',q:100}}">Edit User</router-link>
    //query为?后传的参数
    //跳转后的地址http://localhost:8080/user/1/edit?local=zh&q=100
    
    上面的代码等价于
    <router-link tag="button" class="btn btn-primary" :to="link">Edit User</router-link>
    <script>
        export default {
            data(){
              return{
                link:{
                  name:'userEdit',
                  params:{id:this.$route.params.id},
                  query:{local:'zh',q:100},
                  hash:'#data'//传一个data过去
                }
              }
            
          }
        }
    </script>
scrollBehavior指定滑动位置
    当转到一个新的页面时,定位到最想要定位的位置
    1.在指定模块中
     <p id="data">Something</p>
    2.在他的上级模块(即跳转按钮所在模块)
        export default {
            data(){
              return{
                link:{
                  name:'userEdit',
                  params:{id:this.$route.params.id},
                  query:{local:'zh',q:100},
                  hash:'#data'
                }
              }
            
          }
        }
    3.在new VueRouter中
        const router=new VueRouter({
          scrollBehavior(to,from){
            console.log(to,from)
            if(to.hash){
              return{selector:to.hash}
            }
          }
        })
异步加载模块
把routes.js里的
import Home from './components/Home.vue';
import User from './components/user/User.vue';
import UserStart from './components/user/UserStart.vue';
import UserDetail from './components/user/UserDetail.vue';
import UserEdit from './components/user/UserEdit.vue';
import Header from './components/Header.vue'
替换成下面的代码
import Home from './components/Home.vue';
import Header from './components/Header.vue'

const User = resolve => {
    require.ensure(['./components/user/User.vue'],()=>{
        resolve(require('./components/user/User.vue'))
    },'user')   //user为自定义的模块名,下面为同一个大的模块
}
const UserStart = resolve=>{
    require.ensure(['./components/user/UserStart.vue'],()=>{
        resolve(require('./components/user/UserStart.vue'))
    },'user')
}
const UserEdit = resolve=>{
    require.ensure(['./components/user/UserEdit.vue'],()=>{
        resolve(require('./components/user/UserEdit.vue'))
    },'user')
}

const UserDetail = resolve=>{
    require.ensure(['./components/user/UserDetail.vue'],()=>{
        resolve(require('./components/user/UserDetail.vue'))
    },'user')
}
钩子函数
//阻止继续跳转
beforeRouteEnter: (to, from, next) => {
    if(false){
      next();
    }else{
      next(false);
    }
  }
  
//跳转后确认是否回得去
export default{
    data(){
      return {
        confirmed:false
      }
    },
    beforeRouteLeave(to, from, next)  {
      if(this.confirmed){
        next();
      }else{
        if(confirm('are you sure?')){
          next();
        }else{
          next(false);
        }
      }
    }
  }
  
  可以直接在routes.js里写钩子函数
    export const routed =[
        {path:":id",component:UserDetail,beforeEnter: (to, from, next) => {
        consloe.log('route.........')
        next();
        }},// /user/:id
    ]


const Foo = {
  template: `...`,
  beforeRouteEnter (to, from, next) {
    // 在渲染该组件的对应路由被 confirm 前调用
    // 不!能!获取组件实例 `this`
    // 因为当钩子执行前,组件实例还没被创建
  },
  beforeRouteUpdate (to, from, next) {
    // 在当前路由改变,但是该组件被复用时调用
    // 举例来说,对于一个带有动态参数的路径 /foo/:id,在 /foo/1 和 /foo/2 之间跳转的时候,
    // 由于会渲染同样的 Foo 组件,因此组件实例会被复用。而这个钩子就会在这个情况下被调用。
    // 可以访问组件实例 `this`
  },
  beforeRouteLeave (to, from, next) {
    // 导航离开该组件的对应路由时调用
    // 可以访问组件实例 `this`
  }
}
全局钩子router.beforeEach
功能就是每个路由进入前进行判断,满足条件才进行跳转,否则跳转到特定的页面
在main.js里
router.beforeEach((to,from,next)=>{
  console.log('global router beforeEach');
  next();
})
防止Network不停加载的方法
方法一:
1.设置mode="history"
2.用<router-link to="/user">User</router-link>实现连接
方法二:
不推荐使用,因为url地址会有#号
1.设置mode="hash"
2.在连接地址中加入#/就可以实现Network不再加载
例如:<li role="presentation">
      <a href="#/">Home</a>
  </li>
  <li role="presentation">
      <a href="#/user">Home</a>
  </li>
实现tab栏的高亮显示切换
<router-link to="/" tag="li" active-class="active" exact><a>Home</a></router-link>
<router-link to="/user" tag="li" active-class="active"><a>User</a></router-link>
//exact防止tab栏同时高亮
router-link属性
1.":to" 属 性

相当于a标签中的"herf"属性,后面跟跳转链接所用
<router-link :to="/home">Home</router-link>
<!-- 渲染结果 -->
<a href="/home">Home</a>
to后的地址栏里可以带参数(10)
 <a href="/home/10">Home</a>

2."replace" 属 性

replace在routre-link标签中添加后,页面切换时不会留下历史记录

<router-link :to="/home" replace></router-link>

3."tag" 属 性

具有tag属性的router-link会被渲染成相应的标签

<router-link :to="/home" tag="li">Home</router-link>
<!-- 渲染结果 -->
<li>Home</li>
此时页面的li同样会起到a链接跳转的结果,vue会自动为其绑定点击事件,并跳转页面

4."active-class" 属 性

这个属性是设置激活链接时class属性,也就是当前页面所有与当前地址所匹配的的链接都会被添加class属性

<router-link :to="/home" active-class="u-link--Active">Home</router-link>
active-class属性的默认值是router-link-active,所以如果没有设置,就会被渲染为这个class

可以在router.js里面设置

const router = new VueRouter({
  mode: 'hash',
  linkActiveClass: 'u-link--Active', // 这是链接激活时的class
})
5."exact" 属 性

开启router-link的严格模式

<router-link :to="/" exact>home</router-link>
上面这个标签如果不加exact属性,则会在vue2.leenty.com/article页面下也会被匹配到,
这却不是我们的本意,在加了这个属性后就会正确的匹配到vue2.leenty.com下
//exact防止tab栏同时高亮
重定向redirect
本案例
//重定向   path为url栏里输入的地址
{
    path:'/redirecct-me',redirect:'/user'//redirect后的为要跳转到的url地址
},
{
    path:'/redirect-you',redirect:{name:'home'}//name为定义的跳转地址的name值
},
{
    path:'*',redirect:'/'//输入其他任意的url地址都匹配到首页
}

课外案例。

重定向也是通过 routes 配置来完成,下面例子是从 /a 重定向到 /b:

const router = new VueRouter({
  routes: [
    { path: '/a', redirect: '/b' }
  ]
})
重定向的目标也可以是一个命名的路由:

const router = new VueRouter({
  routes: [
    { path: '/a', redirect: { name: 'foo' }}
  ]
})
甚至是一个方法,动态返回重定向目标:

const router = new VueRouter({
  routes: [
    { path: '/a', redirect: to => {
      // 方法接收 目标路由 作为参数
      // return 重定向的 字符串路径/路径对象
    }}
  ]
})
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值