VUE 生命周期
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title></title> <script type="text/javascript" src="js/vue.js"></script> <link rel="stylesheet" type="text/css" href="css/bootstrap.min.css"/> </head> <body> <div id="app"></div> <script> var vm = Vue({ el:'#app', data:{}, methods:{}, filters:{}, directives:{}, // 什么是生命周期:VUE 实例创建/运行/销毁 ,总是伴随着各种各样的事件, // 这些事件,统称为生命周期 // 生命周期钩子:就是生命周期事件的别名, // 主要的生命周期函数分为: // 创建期间的生命周期函数: // vue第一个生命周期函数 beforeCreate(){} // 实例刚在内存中被创建出来,此时,还没有初始化data和methods属性 // vue 第二个生命周期函数 created(){} // 实例已经在内存中创建,此时data和mothods 已经创建好了,此时还没有开始编译模板 // vue 第三个生命周期函数 beforeMount() {} // 此时已经完成了模板的编译,但是还没有挂载到页面中 // vue 第四个生命周期函数 mounted(){} // 此时,已经编译好了模板,挂载到页面指定容器中显示了 // 运行期间的生命周期函数: // vue 第五个生命周期函数 beforeUpdate(){} // 状态更新之前执行此函数,此时data中的状态值是最新的,但是界面上显示的数据还是旧的,因为此时还没有开始重新渲染DOM 节点 // vue 第六个生命周期函数 updated(){} // 实例更新完毕之后调用此函数,此时data中的状态值和界面上显示的数据,都已经完成了更新,界面已经被重新渲染好了. // 销毁期间的生命周期函数: // vue 第七个生命周期函数 beforeDestroy(){} // 实例销毁之前调用,这一步,实例乃然可用 // vue 第八个生命周期函数 destroyed(){} // Vue实例销毁后调用,调用后,vue实例指示的所有东西都会解绑定,所有的事件监听器都会被移除,所有的子实例也会被销毁.__constructor__() }) </script> </body> </html>
vue-resource 获取后端数据
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title></title> <script type="text/javascript" src="js/vue.js"></script> <script src="js/vue-resource.js"></script> <link rel="stylesheet" type="text/css" href="css/bootstrap.min.css"/> </head> <body> <div id="app"> <input type="button" value="get点击" @click="getinfo" /> <input type="button" value="post点击" @click="postinfo" /> <input type="button" value="jsonp点击" @click="jsonpinfo" /> </div> <script> var vm = new Vue({ el:'#app', data:{}, methods:{ getinfo(){ this.$http.get('http://127.0.0.1:5000/infoapi').then(function(result){ console.log(result.body.msg) }) }, postinfo(){ var data = {'zhuangtai':'OK'} this.$http.post('http://127.0.0.1:5000/infoapi',{data},{emulateJSON:true}).then(result =>{ console.log(result.body.msg) console.log(typeof(result)) }) }, jsonpinfo(){ this.$http.jsonp('http://127.0.0.1:5000/infoapi').then(result => { console.log(result.body) }) }, }, }) </script> </body> </html>
获取后端数据 练习
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title></title> <script src="js/vue.js"></script> <script src="js/vue-resource.js"></script> <link rel="stylesheet" href="css/bootstrap.min.css"> </head> <body> <div id='app'> <div class="panel panel-primary"> <div class="panel-heading"> <h3 class="pannel-title">添加品牌</h3> </div> <div class="panel-body form-inline"> <label> Name: <input type="text" class="form-control" v-model="name" @keyup.enter="add"> </label> <input type="button" value="添加" class="btn btn-primary" @click="add"> </div> </div> <br> <table class="table table-bordered table-hover table-striped" > <tr> <th>ID</th> <th>Name</th> <th>操作</th> </tr> <tr v-for='i in info' :key='i.id'> <td>{{ i.id }}</td> <td>{{ i.name }}</td> <td><a href="#" @click.prevent='delinfo(i.id)'>删除</a></td> </tr> </table> </div> <script> Vue.http.options.emulateJSON = true; Vue.http.options.root = 'http://172.16.3.104:5000/'; var vm = new Vue({ el:'#app', data:{ name:'', searchname:'', info:[], }, methods:{ getinfo(){ this.$http.get('infoapi').then( data => { this.info = data.body }) }, add(){ this.$http.post('addinfoapi',{name:this.name},{}).then( data => { if(data.body.status == 'OK'){ this.name = '' this.getinfo() }else{ alert('添加失败') } }) }, delinfo(id){ this.$http.post('delinfoapi',{id:id},{}).then( data => { if(data.body.status == 'OK'){ this.getinfo() }else{ alert('删除失败') } }) }, }, created(){ this.getinfo() }, }); </script> </body> </html>
VUE 动画效果
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title></title> <script src="js/vue.js"></script> <script src="js/vue-resource.js"></script> <link rel="stylesheet" href="css/bootstrap.min.css"> <style> .v-enter,.v-leave-to{ opacity: 0; transform: translateX(150px); } .v-enter-active,.v-leave-active{ transition: all 2s ease } .my-enter,.my-leave-to{ opacity: 0; transform: translateX(300px) translateY(150px); } .my-enter-active,.my-leave-active{ transition: all 1s ease } </style> </head> <body> <div id='app'> <input type="button" @click="istrue=!istrue" value="点击"> <transition> <p v-show="istrue">啊啊啊啊啊啊啊啊啊啊</p> </transition> <br> <input type="button" @click="istrue2 =!istrue2" value="点击"> <transition name='my'> <p v-show="istrue2">啊啊啊啊啊啊啊啊啊啊</p> </transition> <!-- 点击按钮,显示p标签 再次点击隐藏皮标签 1.transition元素将p标签包裹 2.通过修改transition 所提供的样式修改 .v-enter,.v-enter-to 入场前,入场后 .v-leave,.v-leave-to 离场前,离场后 .v-enter-active, 入场动作 .v-leave-active, 离场动作 --> </div> <script> Vue.http.options.emulateJSON = true; Vue.http.options.root = 'http://172.16.3.104:5000/'; var vm = new Vue({ el:'#app', data:{ istrue:false, istrue2:false, }, methods:{}, }); </script> </body> </html>
第三方css动画效果
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title></title> <script src="js/vue.js"></script> <script src="js/vue-resource.js"></script> <link rel="stylesheet" href="css/bootstrap.min.css"> <link rel="stylesheet" href="css/animate.css"> </head> <body> <div id='app'> <input type="button" @click="istrue=!istrue" value="点击"> <transition enter-active-class='animated bounceIn' leave-active-class='animated bounceOut' :duration="{ enter:200, leave:500 }"> <p v-show="istrue">我来了啦!!</p> </transition> </div> <script> var vm = new Vue({ el:'#app', data:{ istrue:false, }, methods:{}, }); </script> </body> </html>
VUE 动画钩子函数
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title></title> <script src="js/vue.js"></script> <script src="js/vue-resource.js"></script> <link rel="stylesheet" href="css/bootstrap.min.css"> <style> .v-enter,.v-leave-to{ opacity: 0; transform: translateY(400px); } .v-enter-active, .v-leave-active{ transition: all 0.8s ease; } /* 这里必须两个属性连用要不不起效果 */ .v-move{ transition: all 1s ease; } .v-leave-active{ position: absolute; } </style> </head> <body> <div id='app'> <div class="panel panel-primary"> <div class="panel-heading"> <h3 class="pannel-title">添加品牌</h3> </div> <div class="panel-body form-inline"> <label> Name: <input type="text" class="form-control" v-model="name" @keyup.enter="add"> </label> <input type="button" value="添加" class="btn btn-primary" @click="add"> </div> </div> <br> <table class="table table-bordered table-hover table-striped" > <thead> <tr> <th>ID</th> <th>Name</th> <th>操作</th> </tr> </thead> <tbody is="transition-group"> <tr v-for='i in info' :key='i.id'> <td>{{ i.id }}</td> <td>{{ i.name }}</td> <td><a href="#" @click.prevent='delinfo(i.id)'>删除</a></td> </tr> </tbody> </table> </div> <script> Vue.http.options.emulateJSON = true; Vue.http.options.root = 'http://172.16.3.104:5000/'; var vm = new Vue({ el:'#app', data:{ name:'', searchname:'', info:[], }, methods:{ getinfo(){ this.$http.get('infoapi').then( data => { this.info = data.body }) }, add(){ this.$http.post('addinfoapi',{name:this.name},{}).then( data => { if(data.body.status == 'OK'){ this.name = '' this.getinfo() }else{ alert('添加失败') } }) }, delinfo(id){ this.$http.post('delinfoapi',{id:id},{}).then( data => { if(data.body.status == 'OK'){ this.getinfo() }else{ alert('删除失败') } }) }, }, created(){ this.getinfo() }, }); </script> </body> </html>
VUE全局组件
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>定义vue组件</title> <script src="js/vue.js"></script> </head> <body> <!-- 什么是组件: 组件的组件的出现就是为了拆分vue实例的代码量,能够让我们以不同的组件来划分不同的功能模块,将我们需要什么样的功能,就可以去调用对应的组件即可. 组件和模块的区别: 组件化: 是从代码逻辑的角度进行划分,方便diamante分层开发,保证每个功能模块的职能单一; 组件化: 是从UI界面的角度进行划分的,前端组件化,方便组件UI的重用 --> <div id="app"> <!-- 第一种方式 --> <!-- <mycom1></mycom1> --> <!-- <my-com2></my-com2> --> <!-- 第二种方式 --> <mycom1></mycom1> </div> <template id="muban"> <div> <h1>你好 中国!</h1> <p>这是在app实例外定义的一个模板 id=muban</p> </div> </template> <script> // // 第一种创建全局组件方式 // //使用vue.extend来创建全局的vue组件 // var com1 = Vue.extend({ // template:"<h1>hello world1!!</h1>" // }) // // //使用vue.component定义全局组件的时候, // //组件名称使用了 驼峰命名,则需要把大写的驼峰改为小写的字母, // //同时两个单词之前 使用'-'链接 // Vue.component('mycom1',com1) // Vue.component('myCom2',com1) // // // 上面的简写方式 // Vue.component('mycom1',Vue.extend({ // template:"<h1>hello world1!!</h1>" // })) // //上面的再简写方式 // Vue.component('mycom1',{ // template:"<h1>hello world1!!</h1>" // }) // 注意 无论是哪种方式 template属性指向的模板内容,必须有且只能有唯一的一个根元素. // 第二种创建全局模板的方式 // 在#app实例外创建一个template元素模板,然后引入app实例内部 Vue.component('mycom1',{ template:'#muban' }) // 需要创建vue实例,得到viewmodel 才能渲染组件 var vm = new Vue({ el:'#app', }) </script> </body> </html>
Vue 私有组件
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>定义vue组件</title> <script src="js/vue.js"></script> </head> <body> <div id="app"> <muban></muban> <muban2></muban2> </div> <template id='muban2'> <div > <h1>这是私有组件!</h1> </div> </template> <script> var vm = new Vue({ el:'#app', data:{}, methods:{}, filters:{}, directives:{}, components:{ muban:{ template:'<div><h1>你好 世界!</h1></div>' }, muban2:{ template:'#muban2' }, }, beforeCreate(){}, created(){}, beforeMount(){}, mounted(){}, beforeUpdate(){}, updated(){}, beforeDestroy(){}, destroyed(){}, }) </script> </body> </html>
VUe 组件应用data 属性
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>定义vue组件</title> <script src="js/vue.js"></script> </head> <body> <div id="app"> <muban></muban> <muban></muban> <muban2></muban2> </div> <template id='muban2'> <div > <h1>这是私有组件!</h1> </div> </template> <script> var vm = new Vue({ el:'#app', data:{}, methods:{}, filters:{}, directives:{}, components:{ muban:{ // 1.组件可以有自己data数据 // 2.组件的data和实例data有些不一样,实例中的data可以为一个对象,但是组件中的data必须是一个方法 // 3.组件中data除了必须为一个方法之外,这个方法内部,还必须返回一个对象才行; // 4.组件中的data数据,使用方式和实例中的data使用方式完全一样. template:'<div><input type="button" value="+1" @click="add" ><h1>{{count}}</h1></div>', data(){ return{count:0} }, methods:{ add(){ this.count ++ } }, }, muban2:{ template:'#muban2' }, }, beforeCreate(){}, created(){}, beforeMount(){}, mounted(){}, beforeUpdate(){}, updated(){}, beforeDestroy(){}, destroyed(){}, }) </script> </body> </html>
Vue 组件切换
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title></title> <script src="js/vue.js"></script> </head> <body> <div id="app"> <!-- 第一种组件切换的方式 --> <a href="#" @click.prevent="flag=true">登录</a> <a href="#" @click.prevent="flag=false">注册</a> <login v-if='flag'></login> <register v-else='flag'></register> <!-- 第二种组件切换的方式 --> <a href="#" @click.prevent="flag2='login'">登录</a> <a href="#" @click.prevent="flag2='register'">注册</a> <component :is='flag2'></component> <!-- vue提供的标签 回顾! component, template, transition, transition-group --> </div> <script> Vue.component('login',{ template:'<h1>登录组件</h1>' }) Vue.component('register',{ template:'<h1>注册组件</h1>' }) var vm = new Vue({ el:'#app', data:{ flag:true, flag2:'login', } }) </script> </body> </html>
VUE 组件切换+ 动画效果
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title></title> <script src="js/vue.js"></script> <style type="text/css"> .v-enter,.v-leave-to{ opacity: 0; transform: translateX(100px); } .v-enter-active,.v-leave-active{ transition: all 1s ease; } </style> </head> <body> <div id="app"> <!-- 第一种组件切换的方式 --> <a href="#" @click.prevent="flag=true">登录</a> <a href="#" @click.prevent="flag=false">注册</a> <login v-if='flag'></login> <register v-else='flag'></register> <!-- 第二种组件切换的方式 --> <a href="#" @click.prevent="flag2='login'">登录</a> <a href="#" @click.prevent="flag2='register'">注册</a> <!-- 通过mode属性 设置组件切换时候的模式 --> <transition mode='out-in'> <component :is='flag2'></component> </transition> <!-- vue提供的标签 回顾! component, template, transition, transition-group --> </div> <script> Vue.component('login',{ template:'<h1>登录组件</h1>' }) Vue.component('register',{ template:'<h1>注册组件</h1>' }) var vm = new Vue({ el:'#app', data:{ flag:true, flag2:'login', } }) </script> </body> </html>
VUe动画小球
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title></title> <script src="js/vue.js"></script> <style type="text/css"> #ball{ width: 15px; height: 15px; background-color: #269ABC; border-radius: 50%; } </style> </head> <body> <div id="app"> <input type="button" value="按钮" @click="flag=!flag" /> <transition @before-enter = "benter" @enter = 'enter' @after-enter='fenter' > <div id="ball" v-show="flag"></div> </transition> </div> <script> var vm = new Vue({ el:'#app', data:{ flag:false, }, methods:{ benter(el){ el.style.transform = 'translate(0,0)' }, enter(el,done){ el.offsetWidth el.style.transform = 'translate(150px,450px)' el.style.transition='all 1s ease' done() }, fenter(el){ this.flag = !this.flag }, } }) </script> </body> </html>
VUE 组件向子组件传值
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title></title> <script src="js/vue.js"></script> </head> <body> <div id="app"> <com1 :zzz='msg'></com1> </div> <script> // 子组件中要访问父类数据, // 1.首先父类数据要绑定到模板上(传递数据给模板) // 2.子组件 要引入父类数据 // 3.子组件 应用 引入的父类自定义的数据名 var vm = new Vue({ el:'#app', data:{ msg:'这是父类 数据!' }, methods:{}, components:{ com1:{ template:'<h1>{{info}}这是私有组件!-{{zzz}}</h1>', // 组件中data数据 对于组件是可以读写 data(){ return { info:'--这是组件数据--', } }, // 组件中定义的父类数据 是只读的 props:['zzz'], } } }) </script> </body> </html>
VUE 父组件方法传递给子组件/共享子组件属性
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title></title> <script src="js/vue.js"></script> </head> <body> <div id="app"> <com1 @zzz='show'></com1> </div> <script> var vm = new Vue({ el:'#app', data:{ msg:'这是父类 数据!', sonmsg:null, }, methods:{ // **传递参数 // show(d1){ // console.log('this 父组件 ! OK!' + d1) // }, show(d1){ console.log('this 父组件 ! OK!') this.sonmsg = d1 }, }, components:{ com1:{ template:'<h1>这是私有组件!<input type="button" value="按钮" @click="fshow"></h1>', data(){ return { sonmsg:{name:'sonname'}, } }, methods:{ fshow(){ // **传递参数,第二的位置传递参数 // this.$emit('zzz','123') // 将子组件的data传递至方法然后父组件可以从方法获取子组件数据 this.$emit('zzz',this.sonmsg) } } } } }) </script> </body> </html>
VUE 评论练习
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title></title> <script src="js/vue.js"></script> </head> <body> <div id="app"> <muban0 @ftj='tj' ></muban0> <div> <table> <tr v-for='i in list'> <td>{{i.pl}}</td> <td>{{i.name}}</td> </tr> </table> </div> </div> <template id="muban0"> <div> <input type="text" placeholder="评论人" v-model="name"/> <input type="text" placeholder="评论" v-model="pl"/> <input type="button" value="发表评论" @click="fbpl" /> </div> </template> <script> var vm = new Vue({ el:'#app', data:{ list:[ {name:'a',pl:'aaaa'}, ] }, created(){ this.tj() }, methods:{ tj(){ var list = JSON.parse(localStorage.getItem('cmts') || '[]') this.list = list }, }, components:{ muban0:{ data(){ return { name:'', pl:'', } }, template:'#muban0', methods:{ fbpl(){ var aaa = {name:this.name,pl:this.pl} var list = JSON.parse(localStorage.getItem('cmts') || '[]') list.unshift(aaa) localStorage.setItem('cmts',JSON.stringify(list)) this.name = this.pl = '' this.$emit('ftj') } }, } } }) </script> </body> </html>
vue $ref绑定DOM元素以及元素组件
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>ref</title> <script src="js/vue.js"></script> </head> <body> <div id="app"> <muban ref='r1'></muban> <p ref='r2'>这是p标签</p> <br> <input type="button" value="r1点击获取组件数据以及处罚组件方法" @click="r1click"/> <input type="button" value="r2点击获取r2DOM对象" @click="r2click" /> </div> <script> var vm = new Vue({ el:'#app', methods:{ r1click(){ console.log(this.$refs.r1.msg) this.$refs.r1.show() }, r2click(){ console.log(this.$refs.r2) }, }, components:{ muban:{ template:'<div><h1>你好 世界!</h1></div>', data(){ return { msg:'私有组件数据!' } }, methods:{ show(){ console.log("这是私有组件,方法") }, } }, }, }) </script> </body> </html>
VUE前端路由
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title></title> <script src="js/vue.js"></script> <script src="js/vue-router.js"></script> <link href="css/bootstrap.min.css"/> <style type="text/css"> /* router-link默认的class类名 */ /* 可以在router实例化中 linkActiveCLASS属性自定义class名名 */ .router-link-active,.mylinkactive{ color: orangered; font-weight: 500; font-size: 80px; font-style: italic; } .v-enter,v-leave-to{ opacity: 0; transform: translateX(140px); } .v-enter-active,v-leave-active{ transition:all 1s ease ; } </style> </head> <body> <!-- 前端路由概念:--> <!-- 对于单个应用程序来说,主要通过URL中的hash来实现不同页面之间的切换,同时,hash有一个特点: http请求中不会包含hash相关的内容,若依,单页面程序中的页面跳转主要用hash实现. 在单页面应用程序中,这种通过hash改变来切换页面的方式,称为前端路由 --> <!-- 这一节总结: --> <!-- 应用vue-route步骤: 1.创建Vue实例 2.创建Vuerouter实例 3.创建组件 4.vueroute实例中,配置path路径 将组件变量名注册至path路径中 5.在vue实例中,router属性中 注册vuerouter实例 6.在vue el中 router-view 展现组件内容,可选项 router-link 模拟动态切换组件 --> <!-- URL中的hash(#) 1.# 的含义:#代表网页中的一个位置,其右边的字符,就是该位置的标识符。 2.HTTP请求不包含#:#号是用来指导浏览器动作的,对服务器端完全无用。所以,HTTP请求中不包含#。 3.#后面的字符:在第一个#后面出现的任何字符,都会被浏览器解读为位置标识符。这意味着,这些字符都不会被发送到服务器端。 4.改变#不触发网页重载:单单改变#后的内容,浏览器只会滚动到相应位置,不会重新加载网页。浏览器不会重新向服务器请求页面。 5.改变#会改变浏览器的访问历史:每一次改变#后的部分,都会在浏览器的访问历史中增加一个记录,使用"后退"按钮,就可以回到上一个位置。对于ajax应用程序特别有用,可以用不同的#值,表示不同的访问状态,然后向用户给出可以访问某个状态的链接。 值得注意的是,上述规则对IE 6和IE 7不成立,它们不会因为#的改变而增加历史记录。 6.window.location.hash读取#值:window.location.hash这个属性可读可写。读取时,可以用来判断网页状态是否改变;写入时,则会在不重载网页的前提下,创造一条访问历史记录。 7.onhashchange事件: 这是一个HTML 5新增的事件,当#值发生变化时,就会触发这个事件。IE8+、Firefox 3.6+、Chrome 5+、Safari 4.0+支持该事件。 它的使用方法有三种: 1.window.onhashchange = func; 2.<body onhashchange="func();"> 3.window.addEventListener("hashchange", func, false); 8.Google抓取#的机制 默认情况下,Google的网络蜘蛛忽视URL的#部分。 但是,Google还规定,如果你希望Ajax生成的内容被浏览引擎读取,那么URL中可以使用"#!",Google会自动将其后面的内容转成查询字符串_escaped_fragment_的值。 比如,Google发现新版twitter的URL如下: http://twitter.com/#!/username 就会自动抓取另一个URL: http://twitter.com/?_escaped_fragment_=/username 通过这种机制,Google就可以索引动态的Ajax内容。 --> <div id="app"> <!-- 不推荐 <a href="#/login">登录</a> <a href="#/register">注册</a> --> <!-- router-link 默认渲染成A标签 --> <router-link to='login' tag='span'>登录</router-link> <router-link to='register' tag='span'>注册</router-link> <!-- vue-router 提供的元素,专门用来 当做占位符,将组件展示到router-view中 --> <transition mode='out-in'> <router-view></router-view> </transition> </div> <script> var login = { template:"<h1>登录组件</h1>" } var register = { template:"<h1>注册组件</h1>" } var routerobj = new VueRouter({ // route代表匹配规则 routes:[ // 每个路由规则,都是一个对象,这个规则对象,身上有两个必须的属性 // 属性1 是path,表示监听的那个路由链接地址 // 属性2 是component 表示如果路由前面匹配到了path,则展示componnent对应的那个组件 {path:'/',redirect:'/login'}, {path:'/login',component:login}, {path:'/register',component:register}, // 注意,component 的属性值,逆序是一个组件的模板对象,而不能是引用组件名称 ], linkActiveClass:'mylinkactive', }) var vm = new Vue({ el:'#app', router:routerobj, // 将路由规则对象,注册到vm实例上,用来监听URL 地址的变化,然后展示对应的组件 }) </script> </body> </html>
vue前端路由参数传递
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title></title> <script src="js/vue.js"></script> <script src="js/vue-router.js"></script> <link href="css/bootstrap.min.css"/> <style type="text/css"> .router-link-active,.mylinkactive{ color: orangered; font-weight: 500; font-size: 80px; font-style: italic; } .v-enter,v-leave-to{ opacity: 0; transform: translateX(140px); } .v-enter-active,v-leave-active{ transition:all 1s ease ; } </style> </head> <body> <div id="app"> <router-link to='/login' tag='span'>登录</router-link> <!-- 第一种传递参数方式: --> <router-link to='/login?id=10&name=alex' tag='span'>第一种传递参数方式</router-link> <!-- 第二种传递参数方式: 使用过程需要严格匹配路由path--> <router-link to='/login/12' tag='span'>第二种传递参数方式</router-link> <router-link to='/register' tag='span'>注册</router-link> <transition mode='out-in'> <router-view></router-view> </transition> </div> <script> var login = { template:"<h1>登录组件-{{$route.query.id}}-{{$route.params.id}}-</h1>", created(){ console.log('这是$route实例'+this.$route) // 第一种传递参数的数据获取: // 这是url?参数的方式 传递数据至$route.query中,多个参数值也是在query中提取. console.log('这是第一种方式传参:'+this.$route.query.id) // 第二种传递参数的数据获取,需要匹配路由规则!!! console.log('这是第二种方式传参:'+this.$route.params.id) }, } var register = { template:"<h1>注册组件</h1>" } var routerobj = new VueRouter({ routes:[ {path:'/',redirect:'/login'}, {path:'/login',component:login}, {path:'/login/:id',component:login}, {path:'/register',component:register}, ], linkActiveClass:'mylinkactive', }) var vm = new Vue({ el:'#app', router:routerobj, }) </script> </body> </html>
vue 路由嵌套
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title></title> <script src="js/vue.js"></script> <script src="js/vue-router.js"></script> <link href="css/bootstrap.min.css"/> </head> <body> <div id="app"> <router-link to='/index'>首页</router-link> <router-view></router-view> </div> <template id="shouye"> <div> <h1>首页</h1> <!-- 注意:这子路由节点,加/ 或者 不加 / 直接影响匹配的路由路径, 当不加的/ 时 访问路径为 /父路径/子路径 加了/ 时 访问的路径为 /子路径 --> <!-- 这种是不加斜线的方式 --> <router-link to='/index/login'>登录</router-link> <router-link to='/index/register'>注册</router-link> <!-- 这种是加斜线的方式 --> <!-- <router-link to='/login'>登录</router-link> <router-link to='/register'>注册</router-link> --> <router-view></router-view> </div> </template> <script> var index = { template:'#shouye', } var login = { template:"<h1>登录组件</h1>", } var register = { template:"<h1>注册组件</h1>", } var routerobj = new VueRouter({ routes:[ { path:'/index', component:index, children:[ // 注意:这子路由节点,加/ 或者 不加 / 直接影响匹配的路由路径, // 当不加的/ 时 访问路径为 /父路径/子路径 // 加了/ 时 访问的路径为 /子路径 // 推荐 子路由不加斜线 // 归纳总结:一个是相对路径方式,一个是绝对路径的方式 {path:'login',component:login}, {path:'register',component:register}, // {path:'/login',component:login}, // {path:'/register',component:register}, ], }, ], }) var vm = new Vue({ el:'#app', router:routerobj, }) </script> </body> </html>
vue命名视图 实现经典布局
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title></title> <script src="js/vue.js"></script> <script src="js/vue-router.js"></script> <link href="css/bootstrap.min.css"/> <style type="text/css"> body{ margin: 0 auto; } .header{ height: 160px; width: 100%; background-color: #00FFFF; } .container{ display: flex; height: 700px; } .left{ background-color: firebrick; flex: 2; } .main{ background-color: yellowgreen; flex: 8; } </style> </head> <body> <div id="app"> <router-view name='default'></router-view> <div class='container'> <router-view name='left'></router-view> <router-view name='main'></router-view> </div> </div> <script> var indextop = { template:'<div class="header">banner条</div>', } var indexlelf = { template:"<div class='left'><ul><li>首页</li><li>事件1</li><li>事件2</li><li>事件3</li><li>事件4</li></ul></div>", } var indexmain = { template:"<div class='main'>main 内容区域 <router-view></router-view> </div>", } var routerobj = new VueRouter({ // 注意!!!! // 指向单个路由对象使用的是:component, // 指向多个路由对象使用的是:components, // 注意是否加s routes:[ { path:'/', components:{ 'default':indextop, 'left':indexlelf, 'main':indexmain, }, }, ], }) var vm = new Vue({ el:'#app', router:routerobj, }) </script> </body> </html>
VUe监控属性
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title></title> <script src="js/vue.js"></script> <script src="js/vue-router.js"></script> <link href="css/bootstrap.min.css"/> </head> <body> <!-- wathch、computer 和 methods 之间的对比: 1.computed 属性的结果会被缓存,除非依赖的响应属性变化才会重新计算,主要当做属性来使用; 2.methods 方法表示一个具体的操作,主要书写业务逻辑 3.watch 一个对象,键是需要观察的表达式,值是对应回调函数,主要用来监听某些特定数据的变化,从而进行某些具体的业务逻辑操作; 可以看做computed 和 methods 的结合体. watch提供了新旧值的记录 --> <div id="app"> <div> <p>第一种实现方式:(keyup + methods方式)</p> <input type="text" v-model="n1" @keyup='getn3' /> + <input type="text" v-model="n2" @keyup='getn3' /> = <input type="text" v-model="n3" /> </div> <div> <p>第二种实现方式:(watch方式)</p> <input type="text" v-model="nn1" /> + <input type="text" v-model="nn2" /> = <input type="text" v-model="nn3"/> </div> <div> <!-- 在computed 中,可以定一些属性,这些属性叫做 计算属性. 本质上是一个方法,但是在使用这些计算属性的时候 是把它的名称直接当做属性来使用 并不会把计算属性,当做方法去调用 --> <p>第三种实现方式:(computed方式)</p> <p>注意这里data属性中没有定义nnn3属性,nnn3属性是computed提供的,computed需要返回值</p> <input type="text" v-model="nnn1" /> + <input type="text" v-model="nnn2" /> = <input type="text" v-model="nnn3"/> </div> </div> <script> var vm = new Vue({ el:'#app', data:{ n1:'', n2:'', n3:'', nn1:'', nn2:'', nn3:'', nnn1:'', nnn2:'', }, methods:{ getn3(){ this.n3 = this.n1 + '-' + this.n2 }, }, watch:{ nn1(){ this.nn3 = this.nn1 + '-' + this.nn2 }, nn2(){ this.nn3 = this.nn1 + '-' + this.nn2 }, // watch提供了新旧值的记录 nn3(newvalue,oldvlue){ console.log(newvalue,'----',oldvlue) }, }, computed:{ // 'nnn3':function(){ // return this.nnn1 + '-' + this.nnn2 // }, nnn3(){ return this.nnn1 + '-' + this.nnn2 }, }, }) </script> </body> </html>
VUE render函数 模板渲染
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> <script src="js/vue.js"></script> </head> <body> <div id="app"> </div> <script> var login = { template:'<h1>登录组件</h1>' }; var vm = new Vue({ el:'#app', data:{}, methods: {}, components:{}, render(h) { return h(login) }, }); </script> </body> </html>