vue3 setup() 高級(jí)用法示例詳解
本篇文章干貨較多,建議收藏!
從 vue2 升級(jí)到 vue3,vue3 是可以兼容 vue2 的,所以 vue3 可以采用 vue2 的選項(xiàng)式API。由于選項(xiàng)式API一個(gè)變量存在于多處,如果出現(xiàn)問題時(shí),就需要去多個(gè)函數(shù)內(nèi)檢查,項(xiàng)目較大時(shí),遇到問題,增加排故的難度。所以 vue3 中新增了 setup 配置項(xiàng),用它來寫組合式API。
一、選項(xiàng)式API 和 組合式API 區(qū)別
有些同學(xué)稀里糊涂用了vue一年了,竟然不知道選項(xiàng)式api !你是那個(gè)同學(xué)嗎?是的話,趕緊收藏起來。
vue2 中的 Options API 就是選項(xiàng)式api,一個(gè)中文,一個(gè)英文,怎么叫都可以。
在一個(gè) vue 文件內(nèi),會(huì)有 data、methods、mounted、computed、watch 等等用來定義屬性和方法,共同來處理頁(yè)面邏輯,我們把這種方式稱為 Options API。
示例1:計(jì)數(shù)器
<template> <div> <button @click="add">+</button> {{num}} <button @click="reduce">-</button> </div> </template> <script> export default { data(){ return { num:0 } }, methods:{ add(){ this.num++ }, reduce(){ this.num-- } } } </script>
觀察上述示例,我們發(fā)現(xiàn) num 值的處理涉及到 data 和 methods 兩個(gè)選項(xiàng),業(yè)務(wù)處理的比較分散,項(xiàng)目小了看著清晰明了,但是項(xiàng)目變大之后,data 和 methods會(huì)包含很多屬性和方法,此時(shí)就很難分清哪個(gè)屬性對(duì)應(yīng)哪個(gè)方法。所以 vue3 新增 setup 寫組合式API。
Vue3 的 Composition API 就是組合式api。
組合式api 就是一個(gè)功能所定義的 api 會(huì)放在一起,這樣子即使項(xiàng)目變大,功能增大,我們能夠很快找到功能相關(guān)的所有api,不像 Options API 功能分散,需要改動(dòng)時(shí),需要多處查找過程比較困難。
示例2:計(jì)數(shù)器
<template> <div> <button @click="add">+</button> {{num}} <button @click="reduce">-</button> </div> </template> <script> import { ref } from 'vue' export default{ setup(){ const num = ref(1) return{ num, add(){ num.value++ }, reduce(){ num.value-- } } } } </script>
ref 是讓基礎(chǔ)數(shù)據(jù)類型具備響應(yīng)式的,下篇文章具體介紹它的用法,需要的同學(xué)可以點(diǎn)個(gè)關(guān)注不迷路!
用一張圖告訴你它們的區(qū)別:
二、setup 具體怎么用?
2.1、setup 什么時(shí)候執(zhí)行?
setup 用來寫組合式 api,從生命周期鉤子函數(shù)角度分析,相當(dāng)于取代了 beforeCreate 。會(huì)在 creted 之前執(zhí)行。
<script> export default{ created(){ console.log('created'); }, setup(){ console.log('setup'); } } </script>
執(zhí)行之后,setup 打印結(jié)果始終在前邊。
2.2、setup 數(shù)據(jù)和方法如何使用?
示例3:直接定義使用變量
<template> {{a}} </template> <script> export default{ setup(){ const a = 0 } } </script>
運(yùn)行后發(fā)現(xiàn)結(jié)果異常:
runtime-core.esm-bundler.js?5c40:6584 [Vue warn]: Property "a" was accessed during render but is not defined on instance.
提示我們?cè)L問的屬性 a 并沒有掛載到實(shí)例上。
setup 內(nèi)部的屬性和方法,必須 return 暴露出來,將屬性掛載到實(shí)例上,否則沒有辦法使用,上述代碼添加return:
<script> export default{ setup(){ const a = 0 return{ a } } } </script>
2.3、setup 內(nèi)部有 this 嗎?
自己在 setup 中打印下 this ,返回結(jié)果 是undefined 。說明在 setup 內(nèi)部是不存在 this ,不能掛載 this 相關(guān)的東西。
2.4、setup 內(nèi)鉤子函數(shù)如何使用?
vue3 是可以兼容 vue2 的選項(xiàng)式寫法,所以 鉤子函數(shù)可以與 setup 并列存在,就相當(dāng)于 Options API。
示例4:
export default{ setup(){ console.log('setup'); }, mounted(){ console.log('mounted'); } }
vue3 新增的 setup() 函數(shù)用來寫組合式 api,所以不建議這樣寫代碼。所以需要使用 onXXX 一族的函數(shù)來注冊(cè)鉤子函數(shù),注冊(cè)成功之后調(diào)用時(shí)傳遞的是一個(gè)回調(diào)函數(shù)。
示例5:
import { onMounted } from "vue"; export default{ setup(){ const a = 0 return{ a }, onMounted(()=>{ console.log("執(zhí)行"); }) } }
注冊(cè)的這些生命周期鉤子函數(shù)只能在 setup 期間同步使用,因?yàn)樗鼈円蕾嚾謨?nèi)部狀態(tài)來定位當(dāng)前組件實(shí)例,不在當(dāng)前組件下調(diào)用函數(shù)時(shí)會(huì)拋出錯(cuò)誤。
其他的鉤子函數(shù)是一樣的,根據(jù)需要引入就好了。
2.5、setup與鉤子函數(shù)關(guān)系
setup 與鉤子函數(shù)并列時(shí),setup 不能調(diào)用生命周期相關(guān)函數(shù),但生命周期可以調(diào)用 setup 相關(guān)的屬性和方法。
示例6:
<template> <button @click="log">點(diǎn)我</button> </template> <script> export default{ setup(){ const a = 0 return{ a } }, methods:{ log(){ console.log( this.$options.setup() );//返回一個(gè)對(duì)象 } } } </script>
this.$options.setup() 返回的是一個(gè)大對(duì)象,該對(duì)象內(nèi)包含了 setup 內(nèi)的所有屬性和方法。
三、setup 參數(shù)
使用setup 時(shí),它將接收兩個(gè)參數(shù):props 和 context 。
3.1、props
第一個(gè)參數(shù)是 props ,表示父組件給子組件傳值,props 是響應(yīng)式的,當(dāng)傳入新的 props 時(shí),自動(dòng)更新。
示例7:
export default{ props: { msg: String, ans: String, }, setup(props,context){ console.log(props);//Proxy {msg: "著急找對(duì)象", ans: "你有對(duì)象嗎?"} }, }
因?yàn)?props 是響應(yīng)式的,不能使用 ES6 解構(gòu),會(huì)消除prop的響應(yīng)特性,此時(shí)需要借用 toRefs 解構(gòu)。示例8:
import { toRefs } from "vue"; export default{ props: { msg: String, ans: String, }, setup(props,context){ console.log(props); const { msg,ans } = toRefs(props) console.log(msg.value); //著急找對(duì)象 console.log(ans.value); //你有對(duì)象嗎? }, }
使用組件時(shí),經(jīng)常會(huì)遇到可選參時(shí),有些地方需要傳遞某個(gè)值,有些時(shí)候不需要,該如何處理呢?
如果 ans 是一個(gè)可選參數(shù),則傳入 props 中可能沒有 ans 。在這種情況下 toRefs 將不會(huì)為 ans 創(chuàng)建一個(gè) ref ,需要使用 toRef 代替它。
import { toRef } from "vue"; setup(props,context){ let ans = toRef(props ,'ans')// 不存在時(shí),創(chuàng)建一個(gè)ans console.log(ans.value); }
3.2、context
context 上下文環(huán)境,其中包含了 屬性、插槽、自定義事件三部分。
setup(props,context){ const { attrs,slots,emit } = context // attrs 獲取組件傳遞過來的屬性值, // slots 組件內(nèi)的插槽 // emit 自定義事件 子組件 }
attrs 是一個(gè)非響應(yīng)式對(duì)象,主要接收 no-props 屬性,經(jīng)常用來傳遞一些樣式屬性。
slots 是一個(gè) proxy 對(duì)象,其中 slots.default() 獲取到的是一個(gè)數(shù)組,數(shù)組長(zhǎng)度由組件的插槽決定,數(shù)組內(nèi)是插槽內(nèi)容。
setup 內(nèi)不存在this,所以 emit 用來替換 之前 this.$emit 的,用于子傳父時(shí),自定義事件觸發(fā)。
示例9:
<template> <div :style="attrs.style"> <slot></slot> <slot name="hh"></slot> <button @click="emit('getVal','傳遞值')">子向父?jìng)髦?lt;/button> </div> </template> <script> import { toRefs,toRef } from "vue"; export default{ setup(props,context){ const { attrs,slots,emit } = context // attrs 獲取組件傳遞過來 style 屬性 console.log('slots',slots.default());//插槽數(shù)組 console.log('插槽屬性',slots.default()[1].props); //獲取插槽的屬性 return{ attrs, emit } }, } </script>
四、setup 特性總結(jié)
1、這個(gè)函數(shù)會(huì)在 created 之前執(zhí)行,上述已解釋。
2、setup 內(nèi)部沒有 this,不能掛載 this 相關(guān)的東西。
3、setup 內(nèi)部的屬性和方法,必須 return 暴漏出來,否則沒有辦法使用。
4、setup 內(nèi)部數(shù)據(jù)不是響應(yīng)式的。
5、setup不能調(diào)用生命周期相關(guān)函數(shù),但生命周期函數(shù)可以調(diào)用setup內(nèi)的函數(shù)。
到此這篇關(guān)于vue3 setup() 高級(jí)用法的文章就介紹到這了,更多相關(guān)vue3 setup() 用法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
vue打包優(yōu)化時(shí)配置webpack的8大方案小結(jié)
vue-cli?生成的項(xiàng)目通常集成Webpack?,在打包的時(shí)候,需要webpack來做一些事情,這里我們希望它可以壓縮代碼體積,提高運(yùn)行效率,本文為大家整理了8大webpack配置方案,希望對(duì)大家有所幫助2024-02-02vue實(shí)現(xiàn)可視化可拖放的自定義表單的示例代碼
這篇文章主要介紹了vue實(shí)現(xiàn)可視化可拖放的自定義表單的示例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2019-03-03在vue中更換字體,本地存儲(chǔ)字體非引用在線字體庫(kù)的方法
今天小編就為大家分享一篇在vue中更換字體,本地存儲(chǔ)字體非引用在線字體庫(kù)的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-09-09element-plus dialog v-loading不生效問題及解決
這篇文章主要介紹了element-plus dialog v-loading不生效問題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-03-03vue項(xiàng)目實(shí)現(xiàn)通過ip地址訪問和localhost訪問方式
這篇文章主要介紹了vue項(xiàng)目實(shí)現(xiàn)通過ip地址訪問和localhost訪問方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-09-09vue實(shí)現(xiàn)輸入框的模糊查詢的示例代碼(節(jié)流函數(shù)的應(yīng)用場(chǎng)景)
這篇文章主要介紹了vue實(shí)現(xiàn)輸入框的模糊查詢的示例代碼(節(jié)流函數(shù)的應(yīng)用場(chǎng)景),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09vue2.x 從vue.config.js配置到項(xiàng)目?jī)?yōu)化
這篇文章主要介紹了vue2.x 從vue.config.js配置到項(xiàng)目?jī)?yōu)化,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04Vue3編程流暢技巧使用setup語(yǔ)法糖拒絕寫return
這篇文章主要為大家介紹了Vue3編程流暢技巧使用setup語(yǔ)法糖拒絕寫return的方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-07-07