注意:执行以下操作时提前安装node.js。如何安装请看俺的node.js学习路程。
1.安装vue命令行工具
GitHub地址:https://github.com/vuejs/vue-cli
全局安装vue命令行工具:npm install vue-cli -g
安装之后查看是否安装成功:vue -V,安装成功如下图所示:
2.安装vue
1.安装模板:vue init webpack helloworld
2.安装生产环境:nmp install --production
3.安装vue:npm install vue --save-dev
4.运行vue:npm run dev
当然也可以将官方的webpack从GitHub上复制到自己的项目中,github地址:https://github.com/vuejs-templates/webpack,然后npm install 项目的路径
3.安装vue路由和4.vue子路由
在命令窗口输入:npm install vue-router --save-dev
在项目目录下src中的main.js做修改。
import Vue from 'vue' import Router from './Router'
在src中新建Router.js文件并且写入一下代码
import Vue from 'vue' import VueRouter from 'vue-router' Vue.use(VueRouter) const first = {template:'<div>first內容</div>'} const second = {template:'<div>second內容</div>'} const Home = {template:'<div>home內容</div>'} const ab = { template:` <div class="asdf"> <h2>组件</h2> <router-view class='asdf'></router-view> </div> ` } const firstFirst = {template:'<div>firstFirst內容</div>'} const firstSecond = {template:'<div>firstSecond內容</div>'} const router = new VueRouter({ mode:'history', base:__dirname, //当前路径 routes:[ {path:'/',component:Home}, {path:'/second',component:second}, {path:'/first',component:ab, children:[ {path:'/',component:first}, {path:'first',component:firstFirst}, {path:'second',component:firstSecond}, ]}, ] }) // 模板 new Vue({ router, template:` <div id='r'> <h1>导航</h1> <ol> <li><router-link to="/">/</router-link></li> <li><router-link to="/first">first</router-link></li> <ol> <li><router-link to="/first/first">/first/first</router-link></li> <li><router-link to="/first/second">/first/second</router-link></li> </ol> <li><router-link to="/second">second</router-link></li> </ol> <router-view class="sadfj"></router-view> </div> ` }).$mount('#app')
最后运行vue:npm run dev
5.vue中路由传参
import Vue from 'vue' import VueRouter from 'vue-router' Vue.use(VueRouter) const router = new VueRouter({ mode:'history', base:__dirname, routes:[ {path:'/'}, {path:'/params/:aaa/:bbb'}, {path:'/params-regex/:id(\\d+)'} ] }) new Vue({ router, template:` <div> <h1>Good Morning</h1> <ul> <li><router-link to="/">/</router-link></li> <li><router-link to="/params/111/222">/params/111/222</router-link></li> <li><router-link to="/params-regex/222">/params-regex/222</router-link></li> </ul> <p>Show</p> <p>aaa:{{$route.params.aaa}} bbb:{{$route.params.bbb}} id:{{$route.params.id}}</p> <pre><code> {{JSON.stringify($route,null,2)}} </code></pre> </div> ` }).$mount('#app');
6.路由表中的组件群
import Vue from 'vue' import VueRouter from 'vue-router' Vue.use(VueRouter) const first = {template:'<div>first内容</div>'} const second = {template:'<div>second内容</div>'} const Home = {template:'<div>Home内容</div>'} const hehe = {template:'<div>hehe内容</div>'} const router = new VueRouter({ mode:'history', base:__dirname, routes:[ // 路由组件群 {path:'/',components:{ default:Home, left:first, right:second }}, {path:'/first',components:{ default:hehe, left:first, right:second }}, ] }) new Vue({ router, template:` <div id='r'> <h1>导航</h1> <p>{{$route.name}}</p> <ol> <li><router-link to='/'>/</router-link></li> <li><router-link to='/first'>/first</router-link></li> </ol> <!--路由组件群--> <router-view></router-view> <router-view name="left" style="float:left;width:50%;background-color:orange;height:50px;"></router-view> <router-view name="right" style="float:right;width:50%;background-color:red;height:50px;"></router-view> </div> ` }).$mount('#app')
7.url传值
import Vue from 'vue' import VueRouter from 'vue-router' Vue.use(VueRouter) const router = new VueRouter({ mode:'history', base:__dirname, routes:[ {path:'/'}, {path:'/params/:aaa/:bbb'}, //非正则 {path:'/params-regex/:id(\\d+)'} // 正则传参 ] }) new Vue({ router, template:` <div> <h1>Good Morning</h1> <ul> <li><router-link to="/">/</router-link></li> <!--非正则--> <li><router-link to="/params/111/222">/params/111/222</router-link></li> <!--正则--> <li><router-link to="/params-regex/222">/params-regex/222</router-link></li> </ul> <p>Show</p> <p>aaa:{{$route.params.aaa}} bbb:{{$route.params.bbb}} id:{{$route.params.id}}</p> <pre><code> {{JSON.stringify($route,null,2)}} </code></pre> </div> ` }).$mount('#app');
8.query&append;&exact;
import Vue from 'vue' import VueRouter from 'vue-router' Vue.use(VueRouter) const users = { template:` <div> <h2>Users</h2> <router-view></router-view> </div> ` } const user = { template:` <div> {{$route.params.username}} {{$route.query.aaa}} {{$route.params.id}} </div> ` } const Home = {template:'<div><h2>Home</h2></div>'} const about = {template:'<div><h2>about</h2></div>'} const router = new VueRouter({ mode:'history', base:__dirname, routes:[ {path:'/',name:'Home',component:Home}, {path:'/',name:'about',component:about}, {path:'/users',component:users, children:[ {path:':username',name:'user',component:user} ] }, ] }) new Vue({ router, template:` <div id='r'> <h1>导航</h1> <ol> <li><router-link to="/">/</router-link></li> <li><router-link to="/first">/first</router-link></li> <ol> <li> <router-link :to="{path:'/users/wos',query:{aaa:'bbb'}}"> wos </router-link> </li> <li> <router-link to="about" append> append </router-link> </li> <li> <router-link to="about" exact> exact </router-link> </li> </ol> </ol> <router-view></router-view> </div> ` }).$mount('#app')
9.路由重定向
import Vue from 'vue' import VueRouter from 'vue-router' Vue.use(VueRouter) const first = {template:'<div>first內容</div>'} const second = {template:'<div>second內容</div>'} const Home = {template:'<div>home內容</div>'} const ab = { template:` <div class="asdf"> <h2>组件</h2> <router-view class='asdf'></router-view> </div> ` } const firstFirst = {template:'<div>firstFirst內容{{$route.params.id}}</div>'} const firstSecond = {template:'<div>firstSecond內容</div>'} const router = new VueRouter({ mode:'history', base:__dirname, //当前路径 routes:[ {path:'/',component:Home}, {path:'/second',component:second}, {path:'/first',component:ab, children:[ {path:'/',component:first}, {path:'first',component:firstFirst}, {path:'second',component:firstSecond}, // 路由重定向 {path:'third',redirect:'first'}, ]}, //重定向传参 {path:'/aaa/:id',component:firstFirst}, {path:'/bbb/:id',redirect:'/aaa/:id'}, // 使用函数 { path:'/ccc/:id', redirect:xxxx => { const { hash,params,query} = xxxx; if(params.id == '001'){ return '/' } } } ] }) // 模板 new Vue({ router, template:` <div id='r'> <h1>导航</h1> <ol> <li><router-link to="/">/</router-link></li> <li><router-link to="/first">first</router-link></li> <ol> <li><router-link to="/first/first">/first/first</router-link></li> <li><router-link to="/first/second">/first/second</router-link></li> <!--路由重定向--> <li><router-link to="third">third</router-link></li> </ol> <li><router-link to="/second">second</router-link></li> <li><router-link to="/aaa/123">aaa</router-link></li> <li><router-link to="/bbb/456">bbb</router-link></li> <li><router-link to="/ccc/001">ccc</router-link></li> </ol> <router-view class="sadfj"></router-view> </div> ` }).$mount('#app')
10.alias别名
import Vue from 'vue' import VueRouter from 'vue-router' Vue.use(VueRouter) const first = {template:'<div>first內容</div>'} const second = {template:'<div>second內容</div>'} const Home = {template:'<div>home內容</div>'} const ab = { template:` <div class="asdf"> <h2>组件</h2> <router-view class='asdf'></router-view> </div> ` } const firstFirst = {template:'<div>firstFirst內容{{$route.params.id}}</div>'} const firstSecond = {template:'<div>firstSecond內容</div>'} const router = new VueRouter({ mode:'history', base:__dirname, //当前路径 routes:[ {path:'/',component:Home}, // alias 重命名 {path:'/second',component:second,alias:['/gogo','/abab']}, {path:'/first',component:ab, children:[ {path:'/',component:first}, {path:'first',component:firstFirst}, {path:'second',component:firstSecond}, // 路由重定向 {path:'third',redirect:'first'}, ]}, //重定向传参 {path:'/aaa/:id',component:firstFirst}, {path:'/bbb/:id',redirect:'/aaa/:id'}, // 使用函数 { path:'/ccc/:id', redirect:xxxx => { const { hash,params,query} = xxxx; if(params.id == '001'){ return '/' } } } ] }) // 模板 new Vue({ router, template:` <div id='r'> <h1>导航</h1> <ol> <li><router-link to="/">/</router-link></li> <li><router-link to="/first">first</router-link></li> <ol> <li><router-link to="/first/first">/first/first</router-link></li> <li><router-link to="/first/second">/first/second</router-link></li> <!--路由重定向--> <li><router-link to="third">third</router-link></li> </ol> <li><router-link to="/second">second</router-link></li> <li><router-link to="/aaa/123">aaa</router-link></li> <li><router-link to="/bbb/456">bbb</router-link></li> <li><router-link to="/ccc/001">ccc</router-link></li> <!--重命名--> <li><router-link to="/gogo">gogo</router-link></li> <li><router-link to="/abab">abab</router-link></li> </ol> <router-view class="sadfj"></router-view> </div> ` }).$mount('#app')
11. 路由的过渡动画
1.修改main.js文件
import Vue from 'vue' // 路由动画 import tranistion from './tranistion.vue' new Vue({ el:'#demo', render:xx=>xx(tranistion) })
修改完之后修改最外面的index.html
//body中添加 <div id="demo"></div>
2.新建tranistion.vue并编辑
<template> <div> <button v-on:click="show =! show"> show/hide text</button> <transition name="fade"> <p v-if="show">Hello world</p> </transition> </div> </template> <script> export default{ name:'demo', data (){ return{ show:true } } } </script> <style scoped> .fade-enter-active,.fade-leave-active{ transition:opacity .5s } .fade-enter,.fade-leave-active{ opacity:0 } </style>
编辑完成运行:npm run vue
点击切换效果out-in
// main.js文件 import Vue from 'vue' import Router from './Router' // router.js文件 import Vue from 'vue' import VueRouter from 'vue-router' Vue.use(VueRouter) const Home = { template:` <div> <h2>Home</h2> <p>This is Home</p> </div> ` } const Parent = { template:` <div> <h2>Parent</h2> <p>This is Parent</p> </div> ` } const router = new VueRouter({ mode:'history', base:__dirname, routes:[ {path:'/',component:Home}, {path:'/Parent',component:Parent} ] }) new Vue({ router, template:` <div id="app"> <h1>This is Transition</h1> <ul> <li><router-link to="/">/</router-link></li> <li><router-link to="/Parent">/Parent</router-link></li> </ul> <transition name="fade" mode="out-in"> <router-view></router-view> </transition> </div> ` }).$mount('#app')
12.watch监控动画
修改index.html
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width,initial-scale=1.0"> <title>helloworld</title> <style type="text/css"> a.router-link-active{ color:#f66; } li.router-link-active a{ color:#f66; } .fade-enter-active,.fade-leave-active{ transition: opacity .5s } .fade-enter,.fade-leave-active{ opacity: 0 } .fade2-enter-active,.fade2-leave-active{ transition: background 0.5s ease-in,color 0.3s ease-out } .fade2-enter,.fade2-leave-active{ background-color:#f6f6f6; color:red; } </style> </head> <body> <div id="app"></div> <div id="demo"></div> <!-- built files will be auto injected --> </body> </html>
修改Router.js
import Vue from 'vue' import VueRouter from 'vue-router' Vue.use(VueRouter) const Home = { template:` <div> <h2>Home</h2> <p>This is Home</p> </div> ` } const Parent = { template:` <div> <h2>Parent</h2> <p>This is Parent</p> </div> ` } const router = new VueRouter({ mode:'history', base:__dirname, routes:[ {path:'/',component:Home}, {path:'/Parent',component:Parent} ] }) new Vue({ router, // 绑定数据 data(){ return { aaa:'fade' } }, template:` <div id="app"> <h1>This is Transition</h1> <ul> <li><router-link to="/">/</router-link></li> <li><router-link to="/Parent">/Parent</router-link></li> </ul> <!--数据绑定--> <transition :name="aaa" mode="out-in"> <router-view></router-view> </transition> </div> `, // 监听渐变 watch:{ "$route"(to,from){ if(from.path == '/Parent'){ this.aaa = 'fade' }else{ this.aaa = 'fade2' } } } }).$mount('#app')
13.404页面和引入.vue文件
import Vue from 'vue' import VueRouter from 'vue-router' import Parent from './tranistion.vue' Vue.use(VueRouter) const Home = { template:` <div> <h2>Home</h2> <p>This is Home</p> </div> ` } // const Parent = { // template:` // <div> // <h2>Parent</h2> // <p>This is Parent</p> // </div> // ` // } // 404模板 const page404 = { template:` <div> <h2>error:404</h2> </div> ` } const router = new VueRouter({ mode:'history', base:__dirname, routes:[ {path:'/',component:Home}, {path:'/Parent',component:Parent}, // 404 {path:'*',component:page404} ] }) new Vue({ router, // 绑定数据 data(){ return { aaa:'fade' } }, template:` <div id="app"> <h1>This is Transition</h1> <ul> <li><router-link to="/">/</router-link></li> <li><router-link to="/Parent">/Parent</router-link></li> <!--404--> <li><router-link to="/fafdafa">where no here</router-link></li> </ul> <!--数据绑定--> <transition :name="aaa" mode="out-in"> <router-view></router-view> </transition> </div> ` }).$mount('#app')
14.路由里的勾子
import Vue from 'vue' import VueRouter from 'vue-router' //import Parent from './tranistion.vue' Vue.use(VueRouter) const Home = { template:` <div> <h2>Home</h2> <p>This is Home</p> </div> ` } const Parent = { template:` <div> <h2>Parent</h2> <p>This is Parent</p> </div> ` } // 404模板 const page404 = { template:` <div> <h2>error:404</h2> </div> `,//钩子 beforeRouteEnter:(to,from,next)=>{ console.log(to) console.log(from) next() }, beforeRouteLeave:(to,from,next)=>{ console.log(to) console.log(from) next() }, } const router = new VueRouter({ mode:'history', base:__dirname, routes:[ {path:'/',component:Home}, {path:'/Parent',component:Parent, beforeEnter:(to,from,next) =>{ //路由中的钩子 console.log(to) console.log(from) next({path:'/alkdflakfj'}) } }, // 404 {path:'*',component:page404} ] }) new Vue({ router, // 绑定数据 data(){ return { aaa:'fade' } }, template:` <div id="app"> <h1>This is Transition</h1> <ul> <li><router-link to="/">/</router-link></li> <li><router-link to="/Parent">/Parent</router-link></li> <!--404--> <li><router-link to="/fafdafa">where no here</router-link></li> </ul> <!--数据绑定--> <transition :name="aaa" mode="out-in"> <router-view></router-view> </transition> </div> ` }).$mount('#app')
15.编程式导航(前进 后退 返回首页)
import Vue from 'vue' import VueRouter from 'vue-router' //import Parent from './tranistion.vue' Vue.use(VueRouter) const Home = { template:` <div> <h2>Home</h2> <p>This is Home - {{$route.query.a}}</p> </div> ` } const Parent = { template:` <div> <h2>Parent</h2> <p>This is Parent</p> </div> ` } // 404模板 const page404 = { template:` <div> <h2>error:404</h2> </div> `,//钩子 beforeRouteEnter:(to,from,next)=>{ console.log(to) console.log(from) next() }, beforeRouteLeave:(to,from,next)=>{ console.log(to) console.log(from) next() }, } const router = new VueRouter({ mode:'history', base:__dirname, routes:[ {path:'/',component:Home}, {path:'/Parent',component:Parent}, {path:'/test',component:test}, {path:'*',component:page404}, ] }) const test = { template:` <div> <h2>测试404是否能显示</h2> </div> ` } new Vue({ router, // 绑定数据 data(){ return { aaa:'fade' } }, template:` <div id="app"> <button v-on:click="houtui">后退</button> <button v-on:click="qianjin">前进</button> <button v-on:click="home">返回首页</button> <button v-on:click="query">query</button> <ul> <li><router-link to="/?a=1&b=22">/</router-link></li> <li><router-link to="/Parent">/Parent</router-link></li> <!--404--> <li><router-link to="/fafdafa">where no here</router-link></li> </ul> <!--数据绑定--> <transition :name="aaa" mode="out-in"> <router-view></router-view> </transition> </div> `, methods:{ houtui:function(){ router.go(-1) }, qianjin:function(){ router.go(1) }, home:function(){ console.log(router) router.push("/") }, query:function(){ router.push({path:'/',query:{a:1,b:22}}) } } }).$mount('#app')
接下来探秘vuex,敬请期待。。。