- 新的
setup組件選項在創建組件之前執行。
1.Composition API 和Option API(vue2.x)混合使用 2.Composition API本質 (組合API/注入API) 3.setup執行時機 4.setup注意點
1.setup執行時機 beforeCreate: 表示組件剛剛被創建出來, 組件的data和methods還沒有初始化好 setup Created : 表示組件剛剛被創建出來, 並且組件的data和methods已經初始化好 2.setup注意點 - 由於在執行setup函數的時候, 還沒有執行Created生命周期方法 所以在setup函數中,是無法使用data和methods - 由於我們不能在setup函數中使用data和methods, 所以Vue為了避免我們錯誤的使用, 它直接將setup函數中this修改成了undefined - setup函數只能是同步的不能是異步的
WARNING
由於在執行
setup時尚未創建組件實例,因此在setup選項中沒有this。這意味着,除了props之外,你將無法訪問組件中聲明的任何屬性——本地狀態、計算屬性或方法。
也就是說,data,computed 等自主定義的那些初始化數據都將會無法提供訪問。
-
在
setup()內部,this不會是該活躍實例的引用,因為setup()是在解析其它組件選項之前被調用的,所以setup()內部的this的行為與其它選項中的this完全不同。這在和其它選項式 API 一起使用setup()時可能會導致混淆。簡單來說,就是在
setup()中,this指向undefined。
#composition api + option api
composition api 和 option api 允許混用。option api 就是過去那種 data,computed 的 Vue2.x 函數定義方案。
混用示例如下。
<template>
<div>
<p>{{msg1}}</p>
<button @click="c1">button1</button>
<p>{{msg2}}</p>
<button @click="c2">button2</button>
</div>
</template>
<script>
import { reactive, ref } from 'vue'
export default {
name: 'App',
data() {
return {
msg1: 0
}
},
methods: {
c1() {
this.msg1 ++;
}
},
setup() {
let msg2 = ref(0);
function c2() {
msg2.value ++;
}
return {
msg2,
c2
};
}
}
</script>
這是一個 兩個api 相互之間沒有交互的示例,你也可以讓 option api 引用 compostion api 中的內容。
<template>
<div>
<p>{{msg1}}</p>
<button @click="c1">button1</button>
<p>{{msg2}}</p>
<button @click="c2">button2</button>
</div>
</template>
<script>
import { reactive, ref } from 'vue'
export default {
name: 'App',
data() {
return {
msg1: 0
}
},
methods: {
c1() {
this.msg1 ++;
this.msg2 --;
}
},
setup() {
let msg2 = ref(0);
function c2() {
msg2.value ++;
}
return {
msg2,
c2
};
}
}
</script>
這個示例我在 methods 的 c1 中使用了 composition api 的 msg2 ,這樣你點按 button1 的時候,兩個數字都會發生變化。
記得,只有 option api 引用 composition api 的份,沒有反過來的份。
而且由於 composition api 立即執行並 return 的原因,它不被允許作為 async 異步函數進行定義。
<template>
<div>
<p>{{name}}</p>
<button @click="myFn1">按鈕</button>
<p>{{age}}</p>
<button @click="myFn2">按鈕</button>
</div>
</template>
<script>
/*
1.setup執行時機
beforeCreate: 表示組件剛剛被創建出來, 組件的data和methods還沒有初始化好
setup
Created : 表示組件剛剛被創建出來, 並且組件的data和methods已經初始化好
2.setup注意點
- 由於在執行setup函數的時候, 還沒有執行Created生命周期方法
所以在setup函數中,是無法使用data和methods
- 由於我們不能在setup函數中使用data和methods,
所以Vue為了避免我們錯誤的使用, 它直接將setup函數中this修改成了undefined
- setup函數只能是同步的不能是異步的
* */
import {ref} from 'vue';
export default {
name: 'App',
data: function(){
return {
name: 'lnj',
}
},
methods:{
myFn1(){
alert('abc');
},
},
// async setup() {
setup() {
let age = ref(18);
function myFn2() {
alert('www.it666.com');
}
// console.log(this); // undefined // console.log(this.name);
// this.myFn1();
return {age, myFn2}
}
}
</script>
<style>
</style>
