VUE
Vue.js是一套构建用户界面的 渐进式框架。与其他重量级框架不同的是,Vue 采用自底向上增量开发的设计。Vue 的核心库只关注视图层,并且非常容易学习,非常容易与其它库或已有项目整合。另一方面,Vue 完全有能力驱动采用单文件组件和 Vue 生态系统支持的库开发的复杂单页应用。数据驱动+组件化的前端开发。
入门案例
创建html,引用vue.js
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="../../js/vue/vue.js"></script>
</head>
<body>
<div id="app">
{{ message }}
</div>
<script>
var app = new Vue({
el: '#app',
data: {
message: 'Hello Vue!'
}
})
</script>
</body>
</html>
启动服务器,访问页面
vue常见指令
-
{{}}:vue解析数据的指令
-
v-bind:属性获取vue实例中的data属性值
{{}}只能在html标签中间使用,而v-bind可以在属性中使用
简写方式是冒号
<!DOCTYPE html>
<html lang="en" xmlns:v-bind="http://www.w3.org/1999/xhtml">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="../../js/vue/vue.js"></script>
</head>
<body>
<div id="app">
<span v-bind:title="title">{{msg}}</span><br>
<span :title="title">{{msg}}</span><br>
<img :src="src" height="30" width="30"/>
</div>
<script>
var vue = new Vue({
el:"#app",
data:{
msg:"你搞啥",
title:"就是在搞啥",
src:"../../image/eeeeee.jpg"
}
})
</script>
</body>
</html>
- v-model:属性获取data中的值
与v-bind的区别:
v-bind是单选绑定,修改属性上的值时,vue实例中的data属性不会发生改变
v-model是双向绑定,修改属性上的值时,vue实例中的data属性会相应的发生改变
选用:一般在表单提交时优先选用v-model
当属性是value时,可以省略value,如
v-model="username"
<!DOCTYPE html>
<html lang="en" xmlns:v-bind="http://www.w3.org/1999/xhtml" xmlns:v-model="http://www.w3.org/1999/xhtml">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="../../js/vue/vue.js"></script>
</head>
<body>
<div id="app">
<input type="text" v-model:value="username"><br>
<input type="text" v-model="username"><br>
{{username}}
</div>
<script>
var vue = new Vue({
el:"#app",
data:{
username:"123"
}
})
</script>
</body>
</html>
- v-html:将绑定属性值通过html格式输出
<!DOCTYPE html>
<html lang="en" xmlns:v-bind="http://www.w3.org/1999/xhtml" xmlns:v-model="http://www.w3.org/1999/xhtml">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="../../js/vue/vue.js"></script>
</head>
<body>
<div id="app" v-html="msg">
</div>
<script>
var vue = new Vue({
el:"#app",
data:{
msg:'<span style="color: red">hello vue</span>'
}
})
</script>
</body>
</html>
- v-if:判断指令
<!DOCTYPE html>
<html lang="en" xmlns:v-bind="http://www.w3.org/1999/xhtml" xmlns:v-model="http://www.w3.org/1999/xhtml">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="../../js/vue/vue.js"></script>
</head>
<body>
<div id="app">
<span v-if="age < 18">不满18岁</span>
<span v-else-if="age = 18">刚好成年</span>
<span v-else="age > 18">老油条</span>
</div>
<script>
var vue = new Vue({
el:"#app",
data:{
age:19
}
})
</script>
</body>
</html>
- v-for:循环遍历
v-for="(iter,index) in arr"
遍历vue实例的data属性arr数组,遍历得到的每一个变量iter,遍历到的索引index
普通数组遍历
对象集合遍历:遍历得到的变量就是一个对象
<!DOCTYPE html>
<html lang="en" xmlns:v-bind="http://www.w3.org/1999/xhtml" xmlns:v-model="http://www.w3.org/1999/xhtml">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="../../js/vue/vue.js"></script>
</head>
<body>
<div id="app">
<li v-for="iter in arr">{{iter}}</li>
-----------
<li v-for="(iter,index) in arr">{{iter}}-{{index}}</li>
-----------
<li v-for="(iter,index) in e">{{iter.id}}-{{iter.age}}--{{index}}</li>
</div>
<script>
var vue = new Vue({
el:"#app",
data:{
arr:['a','b','c'],
e:[{
id:1,
age:18
},{
id:2,
age:19
},{
id:3,
age:20
}]
}
})
</script>
</body>
</html>
- v-on:绑定标签监听事件
点击被写上
v-on:click="clickMe"
属性的标签,会触发vue实例methods中函数简写
@click="clickMe"
<!DOCTYPE html>
<html lang="en" xmlns:v-bind="http://www.w3.org/1999/xhtml" xmlns:v-model="http://www.w3.org/1999/xhtml"
xmlns:v-on="http://www.w3.org/1999/xhtml" xmlns:>
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="../../js/vue/vue.js"></script>
</head>
<body>
<div id="app">
<li v-for="iter in arr" v-on:click="clickMe">{{iter}}</li>
----------
<li v-for="iter in arr" @click="clickMe">{{iter}}</li>
</div>
<script>
var vue = new Vue({
el:"#app",
data:{
arr:['a','b','c']
},
methods:{
clickMe:function () {
console.log("被点击")
}
}
})
</script>
</body>
</html>
vue事件
<!DOCTYPE html>
<html lang="en" xmlns:v-on="http://www.w3.org/1999/xhtml">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="../../js/vue/vue.js"></script>
</head>
<body>
<div id="app">
<li v-for="iter in obj" v-on:click="clickMe(iter.id,iter.age,$event)">{{iter.id}}</li>
</div>
<script>
var vue = new Vue({
el:"#app",
data:{
obj:[{
id:1,
age:18
},{
id:2,
age:19
},{
id:3,
age:20
}]
},
methods:{
clickMe:function (id,age,obj) { // 事件函数
console.log(id); //事件传参
console.log(age);
console.log(obj); // 事件对象
console.log(obj.currentTarget); // 事件源
}
}
})
</script>
</body>
</html>
vue属性
- el:用来指示vue编译器从什么地方开始解析 vue的语法
- data:整个view中所有数据存放的地方
- methods:js代码放置的地方,用于存放逻辑代码
- filters:vue过滤器
语法:{{sex|fun}},把sex作为条件(参数),传入filters中的fun函数参数中。’|’ 称为管道。
<!DOCTYPE html>
<html lang="en" xmlns:v-bind="http://www.w3.org/1999/xhtml" xmlns:v-model="http://www.w3.org/1999/xhtml"
xmlns:v-on="http://www.w3.org/1999/xhtml" xmlns:>
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="../../js/vue/vue.js"></script>
</head>
<body>
<div id="app">
{{sex|fun}}
</div>
<script>
var vue = new Vue({
el:"#app",
data:{
sex:1,
},
filters:{
fun:function (sex) {
if (sex == 0){
return '男'
}else if(sex == 1){
return '女'
}else {
return '保密'
}
}
}
})
</script>
</body>
</html>
- mounted:一个函数,在vue实例化过程中被调用,一般用于初始化页面数据
准备json文件,存放json数据
访问页面,实例化vue过程中发送ajax请求,返回数据,渲染到页面上
[
{
"name": "a",
"age": 18
},
{
"name": "b",
"age": 19
},
{
"name": "b",
"age": 20
}
]
<!DOCTYPE html>
<html lang="en" xmlns:v-bind="http://www.w3.org/1999/xhtml" xmlns:v-model="http://www.w3.org/1999/xhtml"
xmlns:v-on="http://www.w3.org/1999/xhtml" xmlns:>
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="../../js/vue/vue.js"></script>
<script src="../../js/jquery/jquery.js"></script>
</head>
<body>
<div id="app">
<li v-for="obj in arr">{{obj}}</li>
</div>
<script>
var vue = new Vue({
el:"#app",
data:{
arr:[]
},
mounted:function () {
// 此函数在Vue实例化过程中被调用
$.get("/json/emps.json",{},function (data) {
vue.arr = data;
})
}
})
</script>
</body>
</html>
vue的生命周期
Vue实例有一个完整的生命周期,也就是从开始创建、初始化数据、编译模板、挂载Dom、渲染→更新→渲染、销毁等一系列过程。通俗说就是Vue实例从创建到销毁的过程,就是生命周期。
每一个组件或者实例都会经历一个完整的生命周期,总共分为三个阶段:初始化、运行中、销毁。
- 实例、组件通过new Vue() 创建出来之后会初始化事件和生命周期,然后就会执行beforeCreate钩子函数,这个时候,数据还没有挂载呢,只是一个空壳,无法访问到数据和真实的dom,一般不做操作
- 挂载数据,绑定事件等等,然后执行created函数,这个时候已经可以使用到数据,也可以更改数据,在这里更改数据不会触发updated函数,在这里可以在渲染前倒数第二次更改数据的机会,不会触发其他的钩子函数,一般可以在这里做初始数据的获取
- 接下来开始找实例或者组件对应的模板,编译模板为虚拟dom放入到render函数中准备渲染,然后执行beforeMount钩子函数,在这个函数中虚拟dom已经创建完成,马上就要渲染,在这里也可以更改数据,不会触发updated,在这里可以在渲染前最后一次更改数据的机会,不会触发其他的钩子函数,一般可以在这里做初始数据的获取
- 接下来开始render,渲染出真实dom,然后执行mounted钩子函数,此时,组件已经出现在页面中,数据、真实dom都已经处理好了,事件都已经挂载好了,可以在这里操作真实dom等事情…
- 当组件或实例的数据更改之后,会立即执行beforeUpdate,然后vue的虚拟dom机制会重新构建虚拟dom与上一次的虚拟dom树利用diff算法进行对比之后重新渲染,一般不做什么事儿
- 当更新完成后,执行updated,数据已经更改完成,dom也重新render完成,可以操作更新后的虚拟dom
- 当经过某种途径调用$destroy方法后,立即执行beforeDestroy,一般在这里做一些善后工作,例如清除计时器、清除非指令绑定的事件等等
- 组件的数据绑定、监听…去掉后只剩下dom空壳,这个时候,执行destroyed,在这里做善后工作也可以