当前位置: 首页 > 编程日记 > 正文

vue 前端框架 (三)

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.offsetWidthel.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 οnhashchange="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>

转载于:https://www.cnblogs.com/Anec/p/10790657.html

相关文章:

Rocksdb 的 MergeOperator 简单使用记录

本篇仅仅是一个记录 MergeOperator 的使用方式。 Rocksdb 使用MergeOperator 来代替Update 场景中的读改写操作&#xff0c;即用户的一个Update 操作需要调用rocksdb的 Get Put 接口才能完成。 而这种情况下会引入一些额外的读写放大&#xff0c;对于支持SQL这种update 频繁的…

Java项目:考试系统Java基础Gui(java+Gui)

源码获取&#xff1a;博客首页 "资源" 里下载&#xff01; 功能简介&#xff1a; 所属课程、题目内容、题目选项、题目答案、题目等级、学生管理、试卷管理、题目管理、时间控制 服务页面&#xff1a; public class ServerClient extends javax.swing.JFrame {/** …

软件工程需求设计说明书

Java即时通聊天程序 设计需求说明书 专业班级&#xff1a; 计本班1202班 项目组成员&#xff1a; 杨宗坤 刘瑞 满亚洲 指导教师&#xff1a; 张利峰 开始日期&#xff1a; 完成日期&#xff1a; 编写目的&#xff1a; 本说明书是在充分理解系统需求分析…

Nagios 安装文档

安装前的装备工作(1)解决安装Nagios的依赖关系&#xff1a;Nagios基本组件的运行依赖于httpd、gcc和gd。可以通过以下命令来检查nagios所依赖的rpm包是否已经安装完成&#xff1a;#yum -y install httpd gcc glibc glibc-common *gd* php php-mysql mysql mysql-server --skip-…

Comprehensive Guide to build a Recommendation Engine from scratch (in Python) / 从0开始搭建推荐系统...

https://www.analyticsvidhya.com/blog/2018/06/comprehensive-guide-recommendation-engine-python/&#xff0c; 一篇详细的入门级的推荐系统的文章&#xff0c;这篇文章内容详实&#xff0c;格式漂亮&#xff0c;推荐给大家. 下面是翻译&#xff0c;翻译关注的是意思&#x…

关于std::string 在 并发场景下 __grow_by_and_replace free was not allocated 的异常问题

使用string时发现了一些坑。 我们知道stl 容器并不是线程安全的&#xff0c;所以在使用它们的过程中往往需要一些同步机制来保证并发场景下的同步更新。 应该踩的坑还是一个不拉的踩了进去&#xff0c;所以还是记录一下吧。 string作为一个容器&#xff0c;随着我们的append 或…

Java项目:银行管理系统+文档Java基础Gui(java+Gui)

源码获取&#xff1a;博客首页 "资源" 里下载&#xff01; 功能介绍&#xff1a; 登录、打印、取款、改密、转账、查询、挂失、存款、退卡 服务模块&#xff1a; public class atmFrame extends JFrame {private JPanel contentPane;private user user; // private…

ie旋转滤镜Matrix

旋转一个元素算是一个比较常见的需求了吧&#xff0c;在支持CSS3的浏览器中可以使用transform很容易地实现&#xff0c;这里有介绍&#xff1a;http://www.css88.com/archives/2168&#xff0c;这里有演示http://www.css88.com/tool/css3Preview/Transform.html&#xff0c;就不…

音频(3):iPod Library Access Programming Guide:Introduction

NextIntroduction介绍iPod库访问&#xff08;iPod Library Access&#xff09;让应用程序可以播放用户的歌曲、有声书、和播客。这个API设计使得基本播放变得非常简单&#xff0c;同时也支持高级的搜索和播放控制功能。iPod library access 通过打开iOS允许的音乐相关的广阔范围…

【2019/4/30】周进度报告

冲刺可以推迟了&#xff0c;但这不妨碍知识储备&#xff08;另外这周看了看梦断代码&#xff0c;感觉还是很有意思的一本书&#xff09;。 第七周所花时间约9个小时代码量700多行&#xff0c;主要是阅读代码为主&#xff08;框架内代码&#xff09;博客量1篇了解到的知识点 1.y…

关于 智能指针 的线程安全问题

先说结论&#xff0c;智能指针都是非线程安全的。 多线程调度智能指针 这里案例使用的是shared_ptr&#xff0c;其他的unique_ptr或者weak_ptr的结果都是类似的&#xff0c;如下多线程调度代码&#xff1a; #include <memory> #include <thread> #include <v…

Java项目:无库版商品管理系统(java+Gui+文档)

源码获取&#xff1a;博客首页 "资源" 里下载&#xff01; 功能介绍&#xff1a; 添加商品、修改商品、删除商品、进货出货、查看流水、注册 登录业务处理&#xff1a; public class LoginView extends JFrame implements ComponentListener{private JPanel center…

LTE QCI分类 QoS

http://blog.163.com/gzf_lte/blog/static/20840310620130140057204/ http://blog.163.com/gzf_lte/blog/static/208403106201301403652527/ http://blog.sina.com.cn/u/1731932381 lte2010 QCI (QoS Class Identifier)同时应用于GBR和Non-GBR承载。一个QCI是一个值&#xff0…

CSS 单行溢出文本只显示部分内容

.cc-item div { width:175px; text-overflow:clip;  //该属性适用于IE6,IE7 max-width:175px;  //该属性适用于IE8&#xff0c;FF,谷歌}

Audio声音

转载于:https://www.cnblogs.com/kubll/p/10799187.html

Rocksdb Ribbon Filter : 结合 XOR-filter 以及 高斯消元算法 实现的 高效filter

文章目录前言XOR-filter 实现原理xor filter 的构造原理xor filter 构造总结XOR-filter 和 ADD-filter对比XOR-filter 在计算上的优化Ribbon filter高斯消元法总结参考前言 还是起源于前几天的Rocksdb meetup&#xff0c;其中Peter C. Dillinger 这位大佬分享了自己为rocksdb实…

Java项目:无库版银行管理系统(java+Gui+文档)

源码获取&#xff1a;博客首页 "资源" 里下载&#xff01; 功能介绍&#xff1a; 注册用户、编辑用户、删除用户、存取款、查看流水 存入业务处理&#xff1a; public class depositFrame extends JFrame {private JPanel contentPane;private JTextField inputFiel…

iptables-save和iptables-restore

iptables-save用来把当前的规则存入一个文件里以备iptables-restore使用。它的使用很简单&#xff0c;只有两个参数&#xff1a;iptables-save [-c] [-t table]参数-c的作用是保存包和字节计数器的值。这可以使我们在重启防火墙后不丢失对包和字节的统计。带-c参数的iptables-s…

代码之美——Doom3源代码赏析2

http://www.csdn.net/article/2013-01-17/2813778-the-beauty-of-doom3-source-code/2 摘要&#xff1a;Dyad作者、资深C工程师Shawn McGrathz在空闲时翻看了Doom3的源代码&#xff0c;发出了这样的惊叹&#xff1a;“这是我见过的最整洁、最优美的代码&#xff01;”“Doom 3的…

什么是JavaBean

按着Sun公司的定义&#xff0c;JavaBean是一个可重复使用的软件组件。实际上JavaBean是一种Java类&#xff0c;通过封装属性和方法成为具有某种功能或者处理某个业务的对象&#xff0c;简称bean。由于javabean是基于java语言的&#xff0c;因此javabean不依赖平台&#xff0c;具…

关于 linux io_uring 性能测试 及其 实现原理的一些探索

文章目录先看看性能AIO 的基本实现io_ring 使用io_uring 基本接口liburing 的使用io_uring 非poll 模式下 的实现io_uring poll模式下的实现io_uring 在 rocksdb 中的应用总结参考先看看性能 io_uring 需要内核版本在5.1 及以上才支持&#xff0c;liburing的编译安装 很简单&am…

添加引用方式抛出和捕获干净的WebService异常

转载&#xff1a;http://www.cnblogs.com/ahdung/p/3953431.html 说明&#xff1a;【干净】指的是客户端在捕获WebService&#xff08;下称WS&#xff09;抛出的异常时&#xff0c;得到的ex.Message就是WS方法中抛出的异常消息&#xff0c;不含任何“杂质”。 前提&#xff1a;…

Java项目:车租赁管理系统(java+Gui+文档)

源码获取&#xff1a;博客首页 "资源" 里下载&#xff01; 功能介绍&#xff1a; 登陆界面、管理员界面、用户界面、汽车租赁文档 系统主页&#xff1a; SuppressWarnings("serial") public class SystemMainView extends JFrame implements ActionListe…

TFS中的测试计划(十)

现在有一个测试用例&#xff0c;用来测试登录&#xff0c;并且有两组测试数据。打开团队项目的web门户的测试。新建一个测试计划。命名为测试计划1添加完测试计划后&#xff0c;就可以向这个计划里添加测试用例了&#xff0c;选择登录测试。运行测试&#xff0c;就会生成下图左…

跟着Rocskdb 学 存储引擎:读写链路的代码极致优化

文章目录1. 读链路1.1 FileIndexer1.1.1 LevelDB sst查找实现1.1.2 Rocksdb FileIndexer实现1.2 PinnableSlice 减少内存拷贝1.3 Cache1.3.1 LRU Cache1.3.2 Clock Cache1.4 ThreadLocalPtr 线程私有存储1.4.1 version系统1.4.2 C thread_local vs ThreadLocalPtr1.4.3 ThreadL…

Java项目:人力管理系统(java+Gui+文档)

源码获取&#xff1a;博客首页 "资源" 里下载&#xff01; 功能介绍&#xff1a; 角色员工、管理员&#xff0c;员工信息表&#xff0c;查询、更新&#xff0c;修改&#xff0c;移除、添加 用户管理控制层&#xff1a; /*** author yy*/Controller RequestMapping(…

senfile函数实例的运行过程截图

//要传输的文件内容如下所示&#xff1a; 启动服务器&#xff0c;等待客户端连接&#xff08;在同一台主机上模拟的&#xff09; 客户端远程登录&#xff0c;这里是在本地登录 这个要注意一点就是远程登陆的时候一定要带上端口号不然连接失败&#xff01;&#xff01;转载于:ht…

马年计划2014-2-21

新的一年到来了&#xff01; 刚刚过去的一年里&#xff0c;我已浪费很多时光&#xff01; 新年新气象&#xff0c;为避免重蹈覆辙&#xff0c;此时我必须要立个新年计划&#xff0c;马年计划&#xff01; &#xff08;1&#xff09;一天必须做两道ACM题。 &#xff08;2&#…

java jsp页面如何添加C标签

在https://mvnrepository.com/找两个jar包分别是&#xff1a; <dependency> <groupId>javax.servlet.jsp.jstl</groupId> <artifactId>jstl-api</artifactId> <version>1.2</version> </dependency> <dependency> <g…

如何用 ndctl/ipmctl 管理工具 配置不同访问模式的pmem设备

文章目录1 PMEM 底层架构2 PMEM 逻辑架构3 ipmctl 创建 不同模式的 region3.1 安装3.2 创建AppDirect mode的region3.3 创建 Memory Mode模式3.4 创建 混合模式3.5 查看创建的结果4 ndctl 创建不同类型的 namespaces4.1 安装4.2 创建/删除 一个任意类型的namespace4.3 指定类型…