Vue-cli和Vue-router

vue-cli脚手架

构建spa应用步骤

  • npm install -g vue-cli
  • vue init webpack demoname
  • vue init webpack-simple demoname
  • npm install 安装依赖

打包

  • 打开发包 npm run dev
  • 打生产包 npm run build

vue-router(路由)

安装vue-router

cnpm install vue-router --save-dev
如果用脚手架一般都是安装过,就不需要重复安装了。

结构补充

import HelloWorld from '@/components/HelloWorld',中@自动映射到src目录下.
Vue.use(Router):全局使用vue-router

路由步骤:
一、在components目录下面新建模板Hi.vue
<template>
  <div>
      <h2>{{msg}}</h2>
  </div>
</template>
<script>
    export default{
        data(){
            return{
               msg: "Hi Page!"
            }
        }
    }
</script>
template内部要有个父标签,这是vue2.0的规范
其中,data是个匿名函数,是es6的简化写法,等价于:
data:function(){}.

二、在index.js文件中新建路由
{
      path: '/Hi',
      name: 'Hi',
      component: Hi
}
注意,要导入Hi模板文件
import Hi from '@/components/Hi'

三、针对App.vue的解释
<router-view/>是显示路由组件内容的,
<router-link to="/Hi">Hi页面</router-link>
类似于a标签,to类似与herf。

子路由

路由的二级路由,子路由内部可以嵌套子路由

一、新建子路由文件Hi1.vue和Hi2.vue
如下:
<template>
  <div>
      <h2>{{msg}}</h2>
  </div>
</template>
<script>
    export default{
        data:function(){
            return{
               msg: "Hi1 Page!"
            }
        }
    }
</script>

二、在父路由的vue文件中添加view
<template>
  <div>
      <h2>{{msg}}</h2>
      <router-view></router-view>
  </div>
</template>
此时添加了<router-view></router-view>用于显示子路由的内容。

三、在index.js文件中导入和使用
导入:
import Hi1 from '@/components/Hi1'
import Hi2 from '@/components/Hi2'
使用:
{
      path: '/Hi',
      name: 'Hi',
      component: Hi,
      children:[
        {path:'Hi1',name:'Hi1',component:Hi1},
        {path:'Hi2',name:'Hi2',component:Hi2},
      ]
}
说明:此时Hi1和Hi2就是子路由对应的模板
使用children声明子路由,是数组类型,内部是
对象用大括号包裹,例如:{path:'Hi1',name:'Hi1',component:Hi1},注意子路由的path不添加/符号。

参数传递

方式一(使用name传递参数,不常用)

传递的是name属性的值,直接在对应的模板vue文件中利用route.name使用即可,例如:<p>{{$route.name}}</p>,注意是route不是router。

方式二(通过<router-link> 标签中的to传参)

修改app.vue中的<router-link>,例如:<router-link :to="{name:'Hi2',params:{username:'zengqiang'}}">Hi2页面</router-link>,name要和index.js中路由的name要一致,所以,这是固定写法,但是params对象中的内容是可变的。然后在其他模板文件中使用<h2>{{msg}}--{{$route.params.username}}</h2>。说明:route.params对应就是上面的params对象。

对比正常路由和参数路由写法的区别,<router-link to="/Hi/Hi1">Hi1页面</router-link>|
<router-link :to="{name:'Hi2',params:{username:'zengqiang'}}">Hi2页面</router-link>|

说明:绑定参数时候to属性要加上:,而且name不是/Hi/Hi2而是对应index.js中的对应的name。

命名路由

动态路由规则

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

单页面多路由区域操作(命名视图)

说白了,就是多个<router-view/>

基本案例:index.js
routes: [
    {
      path: '/',
      name: 'HelloWorld',
      components: {
        default:HelloWorld,
        left:Hi1,
        right:Hi2
      }
    },
    {
      path: '/reverse',
      name: 'HelloWorld',
      components: {
        default:HelloWorld,
        left:Hi2,
        right:Hi1
      }
    }
  ]

app.vue中代码:
<router-view/>
<router-view name="left" />
<router-view name="right"/>

说明:不写name属性对应就是default。
注意index.js中的是components,而不是单路由单区域的component。

vue-router利用url传参

基本案例:
在app.vue中配置
<router-link to="/Params/192/sahad">Params页面</router-link>|

新建params.vue文件:
<template>
  <div>
      {{msg}}--{{$route.params.id}}--{{$route.params.name}}
  </div>
</template>
<script>
    export default{
        data(){
            return{
                msg:"Hi, Params!"
            }
        }
    }
</script>
说明:此时$route.params.name就是接收传递的参数。

index.js中路由定义:
{
      path: '/Params/:id(\\d+)/:name',
      name: 'Params',
      component: Params,
}
说明:利用:修饰就是传递参数。:id(\\d+)代表正则只能符合数字的,如果传入不是数字,则无效路由。

vue-router 的重定向-redirect

app.vue文件:
<router-link to="/redict">重定向</router-link>|
<router-link to="/goParams/192/sahad">重定向带参数</router-link>|

index.js文件:
{
    path: '/redict',
    redirect:'/'
},
{
    path: '/goParams/:id(\\d+)/:name',
    redirect:'/Params/:id(\\d+)/:name'
}

说明:第二个是带参数的重定向。利用redirect。

alias别名的使用

别名和重定向的区别就是:重定向的url最后是变化的,而别名是真实的路径,例如/zengqiang的别名,点击之后就是/zengqiang。

{
      path: '/Params',
      name: 'Params',
      component: Params,
      alias:'/zengqiang'
}
注意:别名不能使用在/路径上面,是无效的。

路由过度动画

  • fade-enter:进入过渡的开始状态,元素被插入时生效,只应用一帧后立刻删除。
  • fade-enter-active:进入过渡的结束状态,元素被插入时就生效,在过渡过程完成后移除。
  • fade-leave:离开过渡的开始状态,元素被删除时触发,只应用一帧后立刻删除。
  • fade-leave-active:离开过渡的结束状态,元素被删除时生效,离开过渡完成后被删除。

过渡模式

  • in-out:新元素先进入过渡,完成之后当前元素过渡离开,默认值。
  • out-in:当前元素先进行过渡离开,离开完成后新元素过渡进入。
基本案例:
app.vue文件中:
利用transition标签包裹要显示的router-view
<transition name="fade" mode="out-in">
      <router-view/>      
</transition>

对应的css样式:
.fade-enter {
  opacity:0;
}
.fade-leave{
  opacity:1;
}
.fade-enter-active{
  transition:opacity .5s;
}
.fade-leave-active{
  opacity:0;
  transition:opacity .5s;
}

mode的设置和404页面的处理

在index.js文件中,在export default new Router中设置mode属性,来控制url的形式, mode:'history', mode:'hash'(默认)。

404基本案例:

index.js中配置path是*的路由,然后新建Error.vue文件
{
        path: '*',
        name: 'Error',
        component:Error
},

路由中的钩子函数

三个参数:

to:路由将要跳转的路径信息,信息是包含在对像里边的。
from:路径跳转前的路径信息,也是一个对象的形式。
next:路由的控制参数,常用的有next(true)和next(false)。

在配置文件(index.js)中的钩子函数,只有一个钩子-beforeEnter,如果我们写在模板(vue文件)中就可以有两个钩子函数可以使用:

beforeRouteEnter:在路由进入前的钩子函数。
beforeRouteLeave:在路由离开前的钩子函数。

配置文件中:
{
      path: '/Params/:id(\\d+)/:name',
      name: 'Params',
      component: Params,
      beforeEnter:(to,from,next)=>{
        next();
      }
}


模板文件中:
export default {
  name: 'params',
  data () {
    return {
      msg: 'params page'
    }
  },
  beforeRouteEnter:(to,from,next)=>{
    console.log("准备进入路由模板");
    next();
  },
  beforeRouteLeave: (to, from, next) => {
    console.log("准备离开路由模板");
    next();
  }
}
</script>
注意:next()不写或者写next(false)相当于路由无效。

编程式导航

export default {
  name: 'app',
  methods:{
    goback(){
      this.$router.go(-1);
    },
    gopre(){
      this.$router.go(1);  
    },
    goHome(){
      this.$router.push('/');
    }
  }
}
说明:this.$router.go(1);是前进,-1就是后退。
push()就是跳转指定路径。

编程式导航补充

// 字符串
this.$router.push('home')
// 对象
this.$router.push({ path: 'home' })
// 命名的路由
this.$router.push({ name: 'user', params: { userId: 123 }})
// 带查询参数,变成 /register?plan=private
this.$router.push({ path: 'register', query: { plan: 'private' }})

获取参数通过路由信息对象route获取
this.$route.params
this.$route.params.userId
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 196,099评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,473评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,229评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,570评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,427评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,335评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,737评论 3 386
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,392评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,693评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,730评论 2 312
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,512评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,349评论 3 314
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,750评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,017评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,290评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,706评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,904评论 2 335

推荐阅读更多精彩内容