一.Vue實例
- vue項目就是很多個小組件組成的,也可以說是很多vue實例組成的
- 每個組件就是一個vue實例,實例有很多屬性和方法
<body>
<div id="app">
{{content}}
</div>
<script>
var vm = new Vue({
el:"#app",
data:{
content:"hello vue"
}
})
</script>
</body>
- 實例屬性
- 實例方法
二.Vue生命週期鉤子
- 生命週期函數就是vue實例在某一時間點會自動執行的函數
<div id="app">
{{content}}
</div>
<script>
var vm = new Vue({
el:"#app",
data:{
content:"hello vue"
},
beforeCreate:function () {
console.log("beforeCreate")
},
created:function () {
console.log("created")
},
beforeMount:function () {
console.log("beforeMount")
},
mounted:function () {
console.log("mounted")
},
beforeUpdate:function () {
console.log("beforeUpdate")
},
updated:function () {
console.log("updated")
},
beforeDestroy:function () {
console.log("beforeDestroy")
},
destroyed:function () {
console.log("destroyed")
}
})
</script>
- 初始化事件和相關生命週期內容 調用beforeCreate
- 初始化注入或者相關綁定 調用Created
- 是否有el 是否有template屬性
- 如果沒有template 把el外層的html當做模板
- 有就渲染模板
- 模板數據相結合 掛載頁面一瞬間之前執行調用beforeMount
- 掛載頁面上 hello world顯示在頁面上,mounted函數執行
- 簡單來說就是beforeMount執行頁面還沒渲染 而mounted執行時頁面已經渲染完成了
<div id="app">
</div>
<script>
var vm = new Vue({
el:"#app",
template:"<div>hello vue</div>",
data:{
content:"hello vue"
},
beforeCreate:function () {
console.log("beforeCreate")
},
created:function () {
console.log("created")
},
beforeMount:function () {
console.log(this.$el)
console.log("beforeMount")
},
mounted:function () {
console.log(this.$el)
console.log("mounted")
},
beforeUpdate:function () {
console.log("beforeUpdate")
},
updated:function () {
console.log("updated")
},
beforeDestroy:function () {
console.log("beforeDestroy")
},
destroyed:function () {
console.log("destroyed")
}
})
</script>
- 數據改變才執行(beforeUpdate、Updated)
- 數據改變沒重新渲染執行beforeUpdate,重新渲染執行Updated
<div id="app">
{{content}}
</div>
<script>
var vm = new Vue({
el:"#app",
data:{
content:"hello vue"
},
beforeCreate:function () {
console.log("beforeCreate")
},
created:function () {
console.log("created")
},
beforeMount:function () {
console.log(this.$el)
console.log("beforeMount")
},
mounted:function () {
console.log(this.$el)
console.log("mounted")
},
beforeUpdate:function () {
console.log("beforeUpdate")
},
updated:function () {
console.log("updated")
},
beforeDestroy:function () {
console.log("beforeDestroy")
},
destroyed:function () {
console.log("destroyed")
}
})
</script>
- 銷燬組件纔會調用最後兩個方法
- 組件即將要被銷燬執行beforeDestroy 完全銷燬了執行destroyed
一共11個生命週期函數 還有3個以後再說了
三.Vue模板語法
1.插值表達式
<div id="app">
{{content}}
</div>
<script>
var vm = new Vue({
el:"#app",
data:{
content:"hello vue"
}
})
</script>
2.v-text
- 將div中的innerText 變成name數據的內容
<div id="app">
<div>{{content}}</div>
<div v-text="name"></div>
</div>
<script>
var vm = new Vue({
el:"#app",
data:{
content:"hello vue",
name:"shang"
}
})
</script>
3.v-html
- 將div中的innerHtml和name數據做綁定
<div id="app">
<div>{{content}}</div>
<div v-text="name"></div>
<div v-html="name"></div>
</div>
<script>
var vm = new Vue({
el:"#app",
data:{
content:"hello vue",
name:"shang"
}
})
</script>
4.插值表達式、v-text、v-html區別
- 插值表達式和v-text做了轉義,而v-html沒有
<div id="app">
<div>{{content}}</div>
<div v-text="name"></div>
<div v-html="name"></div>
</div>
<script>
var vm = new Vue({
el:"#app",
data:{
content:"<h1>hello vue</h1>",
name:"<h1>shang</h1>"
}
})
</script>
5.使用JavaScript表達式
- 實際上,對於所有的數據綁定,vue都提供了完全的 JavaScript 表達式支持
<div id="app">
<div>{{content + ' vue'}}</div>
<div v-text="name + ' qian'"></div>
<div v-html="name + ' qian'"></div>
<div>{{ok?'Yes':'No'}}</div>
</div>
<script>
var vm = new Vue({
el:"#app",
data:{
content:"hello",
name:"shang",
ok:true
}
})
</script>
四.計算屬性,方法和偵聽器(***)
- 拼接兩個字符串 可以用以下方法顯示
- 但是代碼上就有了邏輯 不想在html中出現邏輯怎麼辦?
<div id="app">
<div>{{firstName+' '+lastName}}</div>
</div>
<script>
var vm = new Vue({
el:"#app",
data:{
firstName:"shangqian",
lastName:"zhushang"
}
})
</script>
1.計算屬性
- fullName這個屬性是通過計算得來的
<div id="app">
<div>{{fullName}}</div>
</div>
<script>
var vm = new Vue({
el:"#app",
data:{
firstName:"shangqian",
lastName:"zhushang"
},
//計算屬性
computed:{
fullName:function(){
return this.firstName + " " + this.lastName
}
}
})
</script>
- 計算屬性內置緩存
- 當依賴變量(firstName+lastName)沒有發生改變時 計算屬性不會在重新計算
<div id="app">
<div>{{fullName}}</div>
<div>{{age}}</div>
</div>
<script>
var vm = new Vue({
el:"#app",
data:{
firstName:"shangqian",
lastName:"zhushang",
age:28
},
computed:{
fullName:function(){
console.log("計算了一次")
return this.firstName + " " + this.lastName
}
}
})
</script>
2.方法
- 方法形式也可以實現同樣功能 不如計算屬性有效 沒有緩存
<div id="app">
<div>{{fullName()}}</div>
<div>{{age}}</div>
</div>
<script>
var vm = new Vue({
el:"#app",
data:{
firstName:"shangqian",
lastName:"zhushang",
age:28
},
computed:{
fullName:function(){
console.log("計算了一次")
return this.firstName + " " + this.lastName
}
},
methods:{
fullName:function(){
console.log("計算了一次")
return this.firstName + " " + this.lastName
}
}
})
</script>
3.偵聽器
- 偵聽firstName和lastName的變化
<div id="app">
<div>{{fullName}}</div>
<div>{{age}}</div>
</div>
<script>
var vm = new Vue({
el:"#app",
data:{
firstName:"shangqian",
lastName:"zhushang",
fullName:"shangqian zhushang",
age:28
},
watch:{
firstName:function () {
console.log("計算了一次")
this.fullName = this.firstName + " " + this.lastName
},
lastName:function () {
console.log("計算了一次")
this.fullName = this.firstName + " " + this.lastName
}
}
})
</script>
- 雖然也有緩存 依賴變量沒有變化 就不會重新渲染
- 但是watch語法太複雜了,所以優先用計算屬性 因爲它語法簡單
五.計算屬性的setter和getter
- 把屬性寫成一個對象
- 插值表達式讀取計算屬性內容時 就會走get方法 和剛纔寫法是一樣的
- 簡單來說就是,設置值執行set,獲取值執行get
<div id="app">
<div>{{fullName}}</div>
</div>
<script>
var vm = new Vue({
el:"#app",
data:{
firstName:"shangqian",
lastName:"zhushang",
},
computed:{
fullName:{
get:function(){
return this.firstName + " " + this.lastName
},
set:function (value) {
console.log(value)
}
}
}
})
</script>
- 通過setter改變firstName和lastName的值
<div id="app">
<div>{{fullName}}</div>
</div>
<script>
var vm = new Vue({
el:"#app",
data:{
firstName:"shangqian",
lastName:"zhushang",
},
computed:{
fullName:{
get:function(){
return this.firstName + " " + this.lastName
},
set:function (value) {
console.log(value)
var arr = value.split(" ");
this.firstName = arr[0];
this.lastName = arr[1];
}
}
}
})
</script>
- Computed是依賴值變化才重新計算
- Get 通過其他值算出一個新值
- Set 通過設置值改變關聯值 關聯值改變又會改變fullName值重新計算 頁面又會重新變化內容
六.Vue中的樣式綁定
1.綁定 HTML Class
- 綁定對象
- div綁定了一個class 名爲activated ,顯示不顯示取決於後邊的isActivated的值是true還是false
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="../vue.js"></script>
<style>
.activated{
color:red
}
</style>
</head>
<body>
<div id="app">
<div @click="handleDivClick" :class="{activated: isActivated}">hello vue</div>
</div>
<script>
var vm = new Vue({
el:"#app",
data:{
isActivated:false
},
methods:{
handleDivClick:function () {
this.isActivated = !this.isActivated
}
}
})
</script>
</body>
- 綁定數組
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="../vue.js"></script>
<style>
.activated{
color:red
}
</style>
</head>
<body>
<div id="app">
<div @click="handleDivClick" :class="[activated]">hello vue</div>
</div>
<script>
var vm = new Vue({
el:"#app",
data:{
activated:""
},
methods:{
handleDivClick:function () {
this.activated = this.activated === "activated"? "":"activated"
}
}
})
</script>
</body>
2.綁定內聯樣式
- 綁定對象
<div id="app">
<div @click="handleDivClick" :style="styleObj">hello vue</div>
</div>
<script>
var vm = new Vue({
el:"#app",
data:{
styleObj:{
color:"black"
}
},
methods:{
handleDivClick:function () {
this.styleObj.color = this.styleObj.color === "black"?"red":"black"
}
}
})
</script>
- 綁定數組
- 再添加一個屬性
<div id="app">
<div @click="handleDivClick" :style="[styleObj,{fontSize:'20px'}]">hello vue</div>
</div>
<script>
var vm = new Vue({
el:"#app",
data:{
styleObj:{
color:"black"
}
},
methods:{
handleDivClick:function () {
this.styleObj.color = this.styleObj.color === "black"?"red":"black"
}
}
})
</script>
七.Vue中的條件渲染
- v-if、v-else-if、v-else
1.v-if與v-show區別
<div id="app">
<div v-if="show">{{content}}</div>
<div v-show="show">hello vue</div>
</div>
<script>
var vm = new Vue({
el:"#app",
data:{
show:false,
content:"hello world"
}
})
</script>
- v-show指令是已經渲染到頁面上的了,display設置爲none的緣故
- v-if 表達式爲false 壓根不存在
- 經常改變標籤存在不存在用v-show效率更高
2.v-if、v-else、v-else-if
- 注意使用一定要連在一起,中間隔開會報錯
<div id="app">
<div v-if="show === 'a'">{{content+' a'}}</div>
<div v-else-if="show === 'b' ">{{content+' b'}}</div>
<div v-else>{{content+' c'}}</div>
</div>
<script>
var vm = new Vue({
el:"#app",
data:{
show:'a',
content:"hello world"
}
})
</script>
3.指定key值
- 如下代碼中
- 在郵箱input框輸入 再設置vm.show爲true 會發現用戶名input框自動填充了郵箱input框中的數據
<div id="app">
<div v-if="show">
用戶名:<input>
</div>
<div v-else>
郵箱:<input>
</div>
</div>
<script>
var vm = new Vue({
el:"#app",
data:{
show:false,
content:"hello world"
}
})
</script>
- Vue在重新渲染頁面時 會盡量去複用頁面上已經存在的dom
- 去設置key值就可以避免 兩個key值不一樣vue就不會去複用
<div id="app">
<div v-if="show">
用戶名:<input key="username">
</div>
<div v-else>
郵箱:<input key="password">
</div>
</div>
<script>
var vm = new Vue({
el:"#app",
data:{
show:false,
content:"hello world"
}
})
</script>
八.Vue中的列表渲染
<div id="app">
<div v-for="(item,index) of list">
{{item}}--{{index}}
</div>
</div>
<script>
var vm = new Vue({
el:"#app",
data:{
list:[
"shang",
"qian",
"zhu",
"shang",
"haha"
]
}
})
</script>
- 爲了提升循環顯示性能 每個循環項上加上唯一key值
- 不推薦用下標值,頻繁操作dom元素,還是費性能,這樣沒法複用dom節點
- 後端返回前端數據,返回唯一的數據標識符id(如下情況)
<div id="app">
<div v-for="(item,index) of list" :key="item.id">
{{item.text}}--{{index}}
</div>
</div>
<script>
var vm = new Vue({
el:"#app",
data:{
list:[
{
id:"101010101",
text:"haha"
},
{
id:"101010102",
text:"hehe"
},
{
id:"101010103",
text:"shangqian"
},
{
id:"101010104",
text:"shangzhu"
}
]
}
})
</script>
- 修改數組內容時 ,不能通過下標的形式,只能通過方法(push、pop、shift、unshift、splice、sort、reverse)
- 從下標1開始 刪除1條 添加一條新數據(splice方法)
- 數據變化 頁面也變化了
- 除了這幾個方法 還可以改變引用
- 這裏就是List引用
- 頁面也會隨着變化
- 如果想在這裏循環兩次(寫兩次循環有點不靠譜),還有什麼方法嘛?
- 可以外層加一個div
<div id="app">
<div v-for="(item,index) of list" :key="item.id">
<div>
{{item.text}}--{{index}}
</div>
<span>
{{item.text}}--{{index}}
</span>
</div>
</div>
- 不想讓外層div出現 怎麼辦?
<div id="app">
<template v-for="(item,index) of list" :key="item.id">
<div>
{{item.text}}--{{index}}
</div>
<span>
{{item.text}}--{{index}}
</span>
</template>
</div>
- 對象循環
<div id="app">
<div v-for="(item,key,index) of userInfo">
{{item}} ---- {{key}} ---- {{index}}
</div>
</div>
<script>
var vm = new Vue({
el:"#app",
data:{
userInfo:{
name:"shangqianzhushang",
age:18,
gender:"male"
}
}
})
</script>
- 數據改變 頁面就變
- 添加數據 頁面沒變
- 動態對象中加數據是不好用的,可以直接改引用
九.Vue中的set方法
- Set方法是全局方法也是一個實例方法
- 對象添加屬性
- 數組添加屬性
<div id="app">
<div v-for="(item,index) of list">
{{item}} ---- {{index}}
</div>
</div>
<script>
var vm = new Vue({
el:"#app",
data:{
list:[1,2,3,4,5]
}
})
</script>
總結:
數組有三種添加方式:方法、引用、set方法
對象又兩種添加方式:引用、set方法