vue-cli路由vue-router

2018-07-28  本文已影响28人  大菜鸟呀

一、安装
1、下载模板vue init webpack vue-example
2、进入vue-example 下载模板npm install
3、启动应用:npm run dev


<style scoped></style>表示局部有效
配置路由:

export default new Router({
  mode: 'history',  //路由模式(history模式可以去掉 #)
routes: [
    {
      path: '/',
      name: 'HelloWorld',
      component: HelloWorld
    },
    {
        path: '/home',
        name: 'home',
        component: Home,
        alias: '/index'   //配置路由别名(即 访问'index'相当于访问'/home'  )
    }
]
})

滚动行为-----刷新记录鼠标位置:

路由配置:
scrollBehavior(to,from,savePosition){  
<!--点击浏览器 前进、后退或者切换导航时调用:
to:目标路由对象,去哪里
from:离开的路由对象,从哪里来
savePosition:记录滚动条坐标(点击前进后退时)-->
        if (savePosition) {
            return savePosition
        }else{
            return {
                x:0,
                y:0
            }
        }
<!--也可以用hash设置-->
HTML:
导航:<router-link :to="{path:'/documents#abc'}">documents</router-link>
document.vue: <p id='abc'>定位到这个元素</p>

        if (to.hash) { //也在scrollBehavior函数里面
            return {
                selector:   to.hash
            }
        }

点击标签的各种方式:

//点击标签的各种方式:
      <li> //动态绑定
          <router-link :to='index' tag='div'>home</router-link>
        </li>
        <li> //json模式
          <router-link :to="{path:'/documents'}">documents</router-link>
        </li>
        <li>//直接指定路径
          <router-link to='/about'>about</router-link>
        </li>
        <li>
          <router-link to='/user'>用户信息</router-link>
        </li> //tag 可以指定生成li标签
        <router-link :to='index' tag='li'>
          <i></i>
          <span>这是span</span>
        </router-link>

激活的导航有一个class:router-link-active,
或者自定义类名:
全部配置:路由里面配置:router-link-active:'isActive' //约定名称
行间设置: <router-link active-class='activeClass'></router-link>
配置事件(鼠标移入切换):<router-link  event='mouseover'></router-link>
严格模式:<router-link  exact='true'></router-link>

重定向和别名:

{
        path: '*',
        component: s404  //渲染404组件
        //重定向,指向home:redirect: '/home' 
        //动态指定:
        /**      redirect:(to)=>{  //动态设置重定向的目标
                              //目标路由对象,就是访问的路径的路由信息
          *         if(to.path==='/123'){
          *             return '/home'
          *         }else{
          *         return {name:'about'}
          *     }
          */    
    }

嵌套路由:

about.vue:
<router-link to='about' tag='li'> <a>study</a></router-link> <!--设置默认子路由-->
<router-link to='about/word' tag='li'><a> work</a></router-link>
<router-link  :to={name:'word'}' tag='li'><a> work</a></router-link><!--可以设置name-->
<!--渲染区域-->
<router-view></router-view>
路由设置:
{
        path: '/about',
        component: About,
        children:[     //设置子路由
            {
                path: 'study', //相对于根路径
            
                component: study
            },
                {
                path: '',//设置默认子路由
                component: word
            },
             /* {
                path: '/study',//加上'/' 路径相当于根路径
                component: word
            }*/
        ]
    }
设置子路由,不要给父路由设置name

命名试图(一个页面需要两个组件视图):

HTML:
app.vue:
<router-view name='slider'></router-view><!--给视图起个名字-->
<router-view></router-view>
路由:
{
 path: '/document',
name: 'Document',
components:{
          default: document  //默认组件
          slider: slider  //name为slider的组件
    }
}

动态路径:

匹配到的所有路由,全部映射到同一个组件上的时候,例如个人信息
路径:/user/:userId   userId   为动态路径参数

导航:<router-link to='user' tag='li'><a> work</a></router-link>
user.vue:
<router-link  
                      to=" '/user/' +item.type+'/'+item.id"    
                      key='index'    
                     v-for='item,index in userList'  
                     tag='li'
                      >{{item.id}}</router-link>
<script>
var list=[
    { id:1,name:'hh',age:'27',type:'vip'}
    { id:2,name:'xx',age:'18',type:'pt'}

]
export default {
      data(){
          return{
            userList=list,
            userInfo={}
        }
  },
created(){   声明周期函数
<!--渲染组件会调用一次生命周期函数,复用组件不会调用
地址一旦变化,会重新生成一个$route-->
    this.$route   //route实例对象(路由信息对象),表示当前激活的路由的状态信息
    this.$route.params就是userId
    let id=this.$route.params.userId
    this.userInfo=this.userList.filter((item)=>{ return item.id=id})[0]
    },
watch:{   //监控数据变化
$route(){
               let id=this.$route.params.userId
                this.userInfo=this.userList.filter((item)=>{ return item.id=id})[0]
          }
    }
}

</script>
<!--
router实例:
 this.$route.path 字符串,当前路由的路径
 this.$route.params  字符串,动态路由参数
 this.$route.query  字符串,URL查询字符串(?号后面的内容)
 this.$route.hash  字符串,当前路由的hash值
-->
路由:
{
path: '/user/ :type ?/ :userId? ',  
<!--userId随便起的,?号表示能出现userId,那你也可以不出现userId-->
component: user
}

查询字符串:

方式一、<router-link to="?info='fenxiang' "  exact ></router-link> //exact=精确匹配
方式二、<router-link   v-bind:to="{path:'',query:{info:'follow',a:'1'} }"  exact >
                 </router-link> //exact=精确匹配
--------------------------------------------------------
this.$route.query拿到值

过渡动画:

HTML:
<transition   mode='out-in'>  //设置name可以自定义v-enter中 v的名称
        <router-view></router-view>
</transition>

style样式:
v-enter:进入过度的开始状态  (变化类型:opacity:0)
v-enter-active:进入活动状态,(时间:transition:2s)
v-enter-to:进入的结束状态  (变化类型:opacity:1)
v-leave:离开过度的开始状态 (变化类型:opacity:1)
v-leave-active:离开活动状态  (时间:transition:2s)
v-leave-to:离开的结束状态 (变化类型:opacity:0)

编程式导航

编程式导航:
        1、后退:this.$router.back()
        2、前进:this.$router.forward()
        3、指定前进或者后退的步数:this.$srouter.go()
        4、this.$router.push()导航到不同的URL,向历史纪录中添加一条
                        this.$router.push('/document')
                         this.$router.push({path:'/document',query:{  }  })
        5、this.$router.replace() 导航到不同的URl,替换历史纪录中的记录abcsefghijklmnopqrst

钩子函数


钩子函数:
可以书写的位置:
      1、全局路由
      2、单个路由
      3、组件中
-----------------------------
路由:{
            path: '/document',
            meta: {
                            login:true,
                            title:1123
                    }
}
-----------------------------
        全局router实例: 
                router.beforeEach:进入路之前
                      router.beforeEach((to,from,next)=>{
                                      if(to.meta.login){ //需要登陆
                                                           next('/loding')进入导航    
                                                        }
                                        next()进入导航
                                  })
------------------------------
                 router.afterEach:进入路由之后
                  router.afterEach((to,from)=>{
                                      if(to.meta.title){ //title存在
                                                 window.document.title=to.meta.title
                                                        }else{
                                                   window.document.title='哈哈'
                                                                  }
                                  })
----------------------------
单个路由中:beforeEach  进入路由
路由中:{
                    beforeEach(to,from,next){
                                    
                                    next()
                                }
                  }

---------------------------------
组件内:beforeRouteEnter 进入组件\beforeRouteUpdate 更新组件\beforeRouteLeave离开组件
router.beforeEach(to,from,next){
            
            next(false)取消导航
beforeCreate(){}//组件进入后的第一个生命周期函数
export default {
        beforeRouteEnter(to,from,next){
              
              next((vm)=>{
                  vm.text(data数据)=' 123 '
                })
            }
}
上一篇下一篇

猜你喜欢

热点阅读