Vue.set全局操作
Vue.set 的作用就是在構造器外部操作構造器內部的數據、屬性或者方法。比如在vue構造器內部定義了一個count爲1的數據,我們在構造器外部定義了一個方法,要每次點擊按鈕給值加1.就需要用到Vue.set。
什麼是外部數據,就是不在Vue構造器裏裏的data處聲明,而是在構造器外部聲明,然後在data處引用就可以了。外部數據的加入讓程序更加靈活,我們可以在外部獲取任何想要的數據形式,然後讓data引用。 看一個簡單的代碼:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<script type="text/javascript" src="./assets/js/vue.min.js"></script>
<title>構造器的聲明週期</title>
</head>
<body>
<h1>構造器的聲明週期</h1>
<hr>
<div id="app">
{{goodName}}
</div>
<script type="text/javascript">
//在構造器外部聲明數據
var outData={
count:1,
goodName:'car'
};
var app=new Vue({
el:'#app',
data:outData,
})
</script>
</body>
</html>
在外部改變數據的三種方法
用Vue.set改變
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<script type="text/javascript" src="./assets/js/vue.min.js"></script>
<title>構造器的聲明週期</title>
</head>
<body>
<h1>構造器的聲明週期</h1>
<hr>
<div id="app">
{{count}}
<button @click="add()">點擊一下</button>
</div>
<script type="text/javascript">
//在構造器外部聲明數據
var outData={
count:1,
goodName:'car'
};
var app=new Vue({
el:'#app',
data:outData,
})
function add(){
Vue.set(outData,'count',4);
}
</script>
</body>
</html>
用Vue對象的方法添加
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<script type="text/javascript" src="./assets/js/vue.min.js"></script>
<title>構造器的聲明週期</title>
</head>
<body>
<h1>構造器的聲明週期</h1>
<hr>
<div id="app">
{{count}}
<button @click="add()">點擊一下</button>
</div>
<script type="text/javascript">
//在構造器外部聲明數據
var outData={
count:1,
goodName:'car'
};
var app=new Vue({
el:'#app',
data:outData,
})
function add(){
app.count++;
}
</script>
</body>
</html>
直接操作外部數據
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<script type="text/javascript" src="./assets/js/vue.min.js"></script>
<title>構造器的聲明週期</title>
</head>
<body>
<h1>構造器的聲明週期</h1>
<hr>
<div id="app">
{{count}}
<button @click="add()">點擊一下</button>
</div>
<script type="text/javascript">
//在構造器外部聲明數據
var outData={
count:1,
goodName:'car'
};
var app=new Vue({
el:'#app',
data:outData,
})
function add(){
outData.count++
}
</script>
</body>
</html>
爲什麼要有Vue.set的存在
由於Javascript的限制,Vue不能自動檢測以下變動的數組
- 當你利用索引直接設置一個項時,vue不會爲我們自動更新。
- 當你修改數組的長度時,vue不會爲我們自動更新。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<script type="text/javascript" src="./assets/js/vue.min.js"></script>
<title>構造器的聲明週期</title>
</head>
<body>
<h1>Vue.set 全局操作</h1>
<hr>
<div id="app">
<ul>
<li v-for=" aa in arr">{{aa}}</li>
</ul>
</div>
<button onclick="add()">外部添加</button>
<script type="text/javascript">
function add(){
console.log("我已經執行了");
app.arr[1]='ddd';
//Vue.set(app.arr,1,'ddd');
}
var outData={
arr:['aaa','bbb','ccc']
};
var app=new Vue({
el:'#app',
data:outData
})
</script>
</body>
</html>
這時我們的界面是不會自動跟新數組的,我們需要用Vue.set(app.arr,1,’ddd’)來設置改變,vue纔會給我們自動更新,這就是Vue.set存在的意義。
Vue的生命週期(鉤子函數)
Vue一共有10個生命週期函數,我們可以利用這些函數在vue的每個階段都進行操作數據或者改變內容。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<script type="text/javascript" src="../assets/js/vue.js"></script>
<title>構造器的聲明週期</title>
</head>
<body>
<h1>構造器的聲明週期</h1>
<hr>
<div id="app">
{{message}}
<p><button @click="jia">加分</button></p>
</div>
<button onclick="app.$destroy()">銷燬</button>
<script type="text/javascript">
var app=new Vue({
el:'#app',
data:{
message:1
},
methods:{
jia:function(){
this.message ++;
}
},
beforeCreate:function(){
console.log('1-beforeCreate 初始化之後');
},
created:function(){
console.log('2-created 創建完成');
},
beforeMount:function(){
console.log('3-beforeMount 掛載之前');
},
mounted:function(){
console.log('4-mounted 被創建');
},
beforeUpdate:function(){
console.log('5-beforeUpdate 數據更新前');
},
updated:function(){
console.log('6-updated 被更新後');
},
activated:function(){
console.log('7-activated');
},
deactivated:function(){
console.log('8-deactivated');
},
beforeDestroy:function(){
console.log('9-beforeDestroy 銷燬之前');
},
destroyed:function(){
console.log('10-destroyed 銷燬之後')
}
})
</script>
</body>
</html>
Template 製作模版
直接寫在選項裏的模板
直接在構造器裏的template選項後邊編寫。這種寫法比較直觀,但是如果模板html代碼太多,不建議這麼寫。
var app=new Vue({
el:'#app',
data:{
message:'hello Vue!'
},
template:`
<h1 style="color:red">我是選項模板</h1>
`
})
這裏需要注意的是模板的標識不是單引號和雙引號,而是,就是Tab上面的鍵。
寫在template標籤裏的模板
<template id="demo2">
<h2 style="color:red">我是template標籤模板</h2>
</template>
<script type="text/javascript">
var app=new Vue({
el:'#app',
data:{
message:'hello Vue!'
},
template:'#demo2'
})
</script>
寫在script標籤裏的模板
<script type="x-template" id="demo3">
<h2 style="color:red">我是script標籤模板</h2>
</script>
<script type="text/javascript">
var app = new Vue({
el: '#app',
data: {
message: 'hello Vue!'
},
template: '#demo3'
})
</script>
Component
全局化註冊組件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<script type="text/javascript" src="./assets/js/vue.min.js"></script>
<title>demo</title>
</head>
<body>
<h1>demo</h1>
<hr>
<div id="app">
<leechongwei></leechongwei>
</div>
<script type="text/javascript">
Vue.component('leechongwei',{
template:`<div style="color:red;">全局化註冊的李宗偉的標籤</div>`
})
var app=new Vue({
el:'#app',
data:{},
})
</script>
</body>
</html>
局部註冊組件局部
局部註冊組件局部註冊組件和全局註冊組件是向對應的,局部註冊的組件只能在組件註冊的作用域裏進行使用,其他作用域使用無效。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<script type="text/javascript" src="./assets/js/vue.min.js"></script>
<title>demo</title>
</head>
<body>
<h1>demo</h1>
<hr>
<div id="app">
<leechongwei></leechongwei>
</div>
<script type="text/javascript">
var app=new Vue({
el:'#app',
data:{},
components:{
"leechongwei":{
template:`<div style="color:red;">局部註冊的leechongwei標籤</div>`
}
}
})
</script>
</body>
</html>
從代碼中你可以看出局部註冊其實就是寫在構造器裏,但是你需要注意的是,構造器裏的components 是加s的,而全局註冊是不加s的。
Component 組件props 屬性設置
props選項就是設置和獲取標籤上的屬性值的,例如我們有一個自定義的組件,這時我們想給他加個標籤屬性寫成 意思就是熊貓來自中國,當然這裏的China可以換成任何值。定義屬性的選項是props。
定義屬性並獲取屬性值
定義屬性我們需要用props選項,加上數組形式的屬性名稱,例如:props:[‘here’]。在組件的模板裏讀出屬性值只需要用插值的形式,例如{{ here }}.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<script type="text/javascript" src="./assets/js/vue.min.js"></script>
<title>demo</title>
</head>
<body>
<h1>component-2</h1>
<hr>
<div id="app">
<panda here="China"></panda>
</div>
<script type="text/javascript">
var app=new Vue({
el:'#app',
components:{
"panda":{
template:`<div style="color:red;">Panda from {{ here }}.</div>`,
props:['here']
}
}
})
</script>
</body>
</html>
上面的代碼定義了panda的組件,並用props設置了here的屬性值,在here屬性值裏傳遞了China給組件。 最後輸出的結果是紅色字體的Panda from China
多組屬性設置
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<script type="text/javascript" src="./assets/js/vue.min.js"></script>
<title>demo</title>
</head>
<body>
<h1>component-2</h1>
<hr>
<div id="app">
<panda here="China" there="你好啊"></panda>
</div>
<script type="text/javascript">
var app=new Vue({
el:'#app',
components:{
"panda":{
template:`<div style="color:red;">Panda from {{ here }}.
<p style="color:green;">{{ there }}</p>
</div>`,
props:['here','there']
}
}
})
</script>
</body>
</html>
在構造器裏向組件中傳值
把構造器中data的值傳遞給組件,我們只要進行綁定就可以了。就是我們第一季學的v-bind:xxx.
我們直接看代碼:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<script type="text/javascript" src="./assets/js/vue.min.js"></script>
<title>demo</title>
</head>
<body>
<h1>component-2</h1>
<hr>
<div id="app">
<input v-model="message"></input>
<panda v-bind:here="message" there="你好啊"></panda>
</div>
<script type="text/javascript">
var app=new Vue({
el:'#app',
data:{
message:""
},
components:{
"panda":{
template:`<div style="color:red;">Panda from {{ here }}.
<p style="color:green;">{{ there }}</p>
</div>`,
props:['here','there']
}
}
})
</script>
</body>
</html>
Component 父子組件關係
構造器外部寫局部註冊組件
上面上課我們都把局部組件的編寫放到了構造器內部,如果組件代碼量很大,會影響構造器的可讀性,造成拖拉和錯誤。
我們把組件編寫的代碼放到構造器外部或者說單獨文件。
我們需要先聲明一個對象,對象裏就是組件的內容。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<script type="text/javascript" src="./assets/js/vue.min.js"></script>
<title>demo</title>
</head>
<body>
<h1>component-2</h1>
<hr>
<div id="app">
<input v-model="message"></input>
<panda v-bind:here="message" there="你好啊"></panda>
</div>
<script type="text/javascript">
var panda={
template:`<div style="color:red;">Panda from {{ here }}.
<p style="color:green;">{{ there }}</p>
</div>`
,props:['here','there']
};
var app=new Vue({
el:'#app',
data:{
message:""
},
components:{
"panda":panda,
}
})
</script>
</body>
</html>
父子組件的嵌套 我們先聲明一個父組件,比如叫panda,然後裏邊我們加入一個city組件,我們來看這樣的代碼如何寫。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<script type="text/javascript" src="./assets/js/vue.min.js"></script>
<title>demo</title>
</head>
<body>
<h1>component-2</h1>
<hr>
<div id="app">
<input v-model="message"></input>
<panda v-bind:here="message" there="你好啊"></panda>
</div>
<script type="text/javascript">
var city={
template:`<div>Sichuan of China</div>`
}
var panda={
template:`<div style="color:red;">Panda from {{ here }}.
<p style="color:green;">{{ there }}</p>
<city></city>
</div>`
,props:['here','there'],
components:{
"city":city
}
};
var app=new Vue({
el:'#app',
data:{
message:""
},
components:{
"panda":panda,
}
})
</script>
</body>
</html>
Component 標籤
標籤是Vue框架自定義的標籤,它的用途就是可以動態綁定我們的組件,根據數據的不同更換不同的組件。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<script type="text/javascript" src="./assets/js/vue.min.js"></script>
<title>demo</title>
</head>
<body>
<hr>
<div id="app">
<component v-bind:is="who"></component>
<button @click="changeComponent">changeComponent</button>
</div>
<script type="text/javascript">
var componentA = {
template: `<div>I'm componentA</div>`
}
var componentB = {
template: `<div>I'm componentB</div>`
}
var componentC = {
template: `<div>I'm componentC</div>`
}
var app = new Vue({
el: '#app',
data: {
who:'componentA'
},
methods:{
changeComponent:function(){
if(this.who=='componentA'){
this.who='componentB';
}else if(this.who=='componentB'){
this.who='componentC';
}else{
this.who='componentA';
}
}
},
components:{
"componentA":componentA,
"componentB":componentB,
"componentC":componentC,
}
})
</script>
</body>
</html>
父子組件的傳值
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<title>demo</title>
</head>
<body>
<div id="app">
<div>
<input type="text" v-model="todoValue"></input>
<button v-on:click="handBtnClikc">提交</button>
</div>
<ul>
<todo-item :content="item"
:index="index"
v-for="(item,index) in list"
@delete="handItemDelete">
</todo-item>
</ul>
</div>
</body>
<script>
let todoItem = {
props: ['content', 'index'],
template: '<li @click="handleItemClikc">{{index}}----{{content}}</li>',
methods: {
handleItemClikc() {
this.$emit("delete", this.index)
}
}
}
let app = new Vue({
el: "#app",
components: {
TodoItem: todoItem
},
data: {
todoValue: "",
list: []
},
methods: {
handBtnClikc() {
this.list.push(this.todoValue)
this.todoValue=""
},
handItemDelete(index){
this.list.splice(index,1)
}
}
})
</script>
</html>