什麼是Composition API?
Composition API也叫組合式API,是Vue3.x中的新特性。通過建立Vue元件,我們可以將介面的可重複部分提取到可重用的程式碼段中,沒有Composition API之前Vue相關業務的程式碼需要設定到option的特定區域,如果在大型專案中這種方式會導致後期的維護性比較複雜,同時程式碼可複用性不高,Vue3的Composition API就是解決這個問題的。
在setup中使用ref和reactive定義響應式資料
使用ref和reactive定義資料前,需要從vue中進行解構。
import {ref,reactive} from 'vue';
ref和reactive均可以定義響應式資料,定義的資料在Vue模板中可以直接獲取,但是如果通過方法獲取的話,ref和reactive定義的資料在獲取上有一定的差異,ref定義的需要通過value屬性間接獲取,reactive定義的資料可以直接獲取,在修改這兩類資料也是如此。
export default { setup() { // 使用ref定義響應式資料 const title = ref("這是一個標題"); // 使用reactive定義響應式資料 const userinfo = reactive({ username: "張三", age: 20 }); // 獲取reactive中的屬性可以直接獲取 const getUserName = () => { alert(userinfo.username) }; // 獲取ref中的資料需要通過value屬性 const getTitle = () => { alert(title.value) }; const setUserName = () => { // 修改reactive中的屬性可以直接修改 userinfo.username = "修改後的張三" }; const setTitle = () => { // 修改ref中的屬性,需要通過value title.value = "這是修改後的標題" }; return { title, userinfo, getUserName, getTitle, setTitle, setUserName } }, data() { return { msg: "這是Home元件的msg" } }, methods: { run() { alert('這是Home元件的run方法') } } }
可以使用v-model直接進行雙向資料繫結。
<input type="text" v-model="title"> <input type="text" v-model="userinfo.username">
toRefs解構響應式物件資料
之所以需要toRefs是因為通過toRefs解構的資料還具有響應式的特性,通過傳統的拓展運運算元進行解構則不具備了響應式的特性,這就是為什麼需要toRefs的原因。
從vue中解構出toRefs
import {ref,reactive,toRefs} from 'vue';
setup的返回資料中進行如下的修改
return { title, userinfo, getUserName, getTitle, setTitle, setUserName, ...toRefs(article) }
setup中的計算屬性
setup中的計算屬性和一般的計算屬性類似,區別在於無法讀取到this。
setup() { let userinfo = reactive({ firstName: "", lastName: "" }); let fullName = computed(() => { return userinfo.firstName + " " + userinfo.lastName }) return { ...toRefs(userinfo), fullName } }
readonly:深層的唯讀代理
readonly存在的意義是能夠將響應式物件轉換為普通的原始物件。
引入readonly。
import {computed, reactive,toRefs,readonly} from 'vue'
給readonly傳入響應式物件。
let userinfo = reactive({ firstName: "666", lastName: "" }); userinfo = readonly(userinfo);
setup中的watchEffect
setup中的watchEffect具有以下幾個特點。
能夠監聽setup中的資料變化,資料一旦變化就會執行watchEffect中的回撥函數。
及時setup中的資料沒有變化,初始的時候也會執行一次。
setup() { let data = reactive({ num: 1 }); watchEffect(() => { console.log(`num2=${data.num}`); }); setInterval(() => { data.num++; },1000) return { ...toRefs(data) } }
setup中的watch
使用watch監控資料的基本方法。
setup() { let keyword = ref("111"); watch(keyword,(newData,oldData) => { console.log("newData是:",newData); console.log("oldData是:",oldData); }) return { keyword } }
watch與watchEffect的區別
watch在首次頁面渲染的時候不會執行,但是watchEffect會。
watch能夠獲取到資料狀態變化前後的值。
setup中的生命週期勾點函數
在setup中生命週期勾點類似於直接呼叫一個函數。
setup() { let keyword = ref("111"); watch(keyword,(newData,oldData) => { console.log("newData是:",newData); console.log("oldData是:",oldData); }) onMounted(() => { console.log('onMounted'); }) onUpdated(() => { console.log('onUpdated'); }) return { keyword } }
setup中的props
父元件進行傳值。
<Search :msg="msg" />
宣告接收
props: ['msg'], setup(props) { console.log(props); }
Provide與inject
有時,我們需要將資料從父元件傳遞到子元件,但是如果父元件到子元件是一個巢狀很深的關係,通過props進行傳遞將變得很麻煩,這種情況下,我們可以使用provide和inject來實現。
一般用法
根元件通過provide傳遞資料。
export default { data() { return { } }, components: { Home }, provide() { return { title: "app元件裡面的標題" } } }
需要接收資料的元件通過inject宣告接收
export default { inject: ['title'], data() { return { } }, components: { } }
宣告接收後可以直接使用。
<template> <div class="container"> 這是Location元件 {{title}} </div> </template>
provide能夠獲取到this中的資料
export default { data() { return { title: "根元件的資料" } }, components: { Home }, provide() { return { title: this.title } } }
注意:上面的一般用法中,如果父元件中的資料發生了變化,子元件的不會發生變化,因此推薦使用下面的composition API中的provide與inject能夠實現同步變化。
setup中的provide與inject
根元件
import Home from './components/Home.vue' import {ref,provide} from 'vue' export default { setup() { let title = ref('app根元件裡面的title'); let setTitle = () => { title.value = "改變後的title" } provide("title",title); return { title, setTitle } }, data() { return { } }, components: { Home } }
用到資料的元件
import {inject} from 'vue' export default { setup() { let title = inject('title'); return { title } }, data() { return { } }, components: { } }
與props不同的是,子元件中的資料如果使用了雙向資料繫結會同步到父元件。
推薦學習:《》
以上就是介紹Vue3中Composition API及其核心用法的詳細內容,更多請關注TW511.COM其它相關文章!