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.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>
上一篇:64位ubuntu安装WPS


下一篇:Java 语言基础之数组常见操作